Рекомендуем использовать Visual Studio Code в качестве основной среды разработки для оптимальной работы с PLC.js Framework Скачать VS Code
Технически вы можете разрабатывать приложение локально на компьютере с последующим развертыванием на контроллер PLC.js. Однако мы рекомендуем вести разработку непосредственно на устройстве через SSH-подключение. Для этого:
Remote - SSH для VS CodeТакой подход значительно упрощает отладку, исключает проблемы совместимости и ускоряет процесс разработки.
После установки VS Code:
Откройте встроенный терминал в VS Code (Вид → Терминал) и выполните следующие команды:
# Инициализация нового Node.js проекта
npm init -y
# Установка PLC.js Framework
npm install @fatec-ru/plcjs
# Настройка конфига
npm pkg set type="module"
# Настройка скрипта запуска
npm pkg set scripts.start="node main.ts"
Создайте файл main.ts, добавьте следующий код и выполните в вашем терминале команду npm run start для запуска приложения:
import { PlcjsApplication } from '@fatec-ru/plcjs';
/**
* Основная функция приложения
* Точка входа в PLCJS приложение
*/
async function main(): Promise<void> {
try {
console.log('🚀 Запуск PLC.js приложения...');
// Инициализация и запуск приложения
const plcjsApp = new PlcjsApplication();
await plcjsApp.start();
console.log('✅ PLC.js приложение успешно запущено');
} catch (error) {
console.error('💥 Критическая ошибка при запуске приложения:', error);
process.exit(1);
}
}
// Запуск приложения
main().catch(console.error);
Введите в адресной строке браузера IP адрес контроллера полученного на этапе настройки сети (например: 192.168.128.131) и войдите войдите в Web-конфигуратор.
В качестве логина/пароля используйте: admin/admin
Авторизация в Web-конфигуратор
После добавления вашего первого модуля ввода-вывода по примеру WB-NR6C, перейдите в раздел Runtime/Сигналы. Убедитесь, что связь с модулем установлена. В этом разделе вы можете тестировать каналы ввода-вывода, изменяя их состояние с помощью соответствующих кнопок управления.
Добавление IO-модуля
Создайте организационный блок (OB) — основной контейнер для логики вашего приложения. Организационный блок реализуется как класс со следующими обязательными элементами:
Поля: name, description
Методы: initialize(), execute().
Название класса рекомендуется делать с префиксом OBx.
/**
* Основной цикл исполнения PLC-программы
* Корневой блок, выполняемый циклически с заданным интервалом
*/
export class OB1 implements IPlcjsOrchestrator {
readonly name = 'OB1';
readonly description = 'Организационный блок OB1 - основной цикл исполнения';
/**
* Инициализация прикладной логики
* Выполняется однократно при старте системы
*/
async initialize(configService: PlcjsConfigService) {
}
/**
* Циклическое выполнение прикладной логики управления
* Вызывается периодически согласно заданному циклу исполнения
*/
async execute(configService: PlcjsConfigService) {
try {
// Основная логика управления
console.log('🔧 Выполнение основного цикла OB1');
} catch (error) {
console.error('💥 Ошибка выполнения:', error);
}
}
}
После чего, зарегистрируйте ваш организационный блок OB1 в главном файле main.ts:
// Start application
import { PlcjsApplication } from '@fatec-ru/plcjs';
async function bootstrap() {
try {
const plcjsApp = new PlcjsApplication();
// Регистрация организационных блоков в системе
// Добавьте все необходимые OB-блоки в порядке приоритета
plcjsApp.use(new OB1());
// plcjsApp.use(new OB2());
// plcjsApp.use(new OB35());
// Запускаем приложение
await plcjsApp.start();
} catch (error) {
console.error('💥 Failed to start application:', error);
process.exit(1);
}
}
bootstrap();
После запуска приложения вы получаете прямой программный доступ к каналам ввода-вывода. Для работы объявите переменную типа PlcjsChannel, выполните инициализацию каналов в методе initialize(), после чего в методе execute() вы можете обращаться к каналам как к обычным переменным в коде.
Пример:
/**
* Основной цикл исполнения PLC-программы
* Корневой блок, выполняемый циклически с заданным интервалом
*/
export class OB1 implements IPlcjsOB {
readonly name = 'OB1';
readonly description = 'Организационный блок OB1 - основной цикл исполнения';
// Объявляем каналы, которые необходимы для вашей логики
di1!: PlcjsChannel;
do1!: PlcjsChannel;
async initialize(configService: PlcjsConfigService) {
// Инициализируем каналы
this.di1 = configService.getChannel('A1.DI1');
this.do1 = configService.getChannel('A1.DO1');
}
async execute() {
try {
// Работаем с каналами так, как вам необходимо
this.do1.boolValue = this.di1.boolValue;
} catch (error) {
console.error('💥 Ошибка выполнения:', error);
}
}
}