Cобираем АСУ ТП на 4diac FORTE, PostgreSQL и FUXA SCADA
Insol-1000 в сборе: центральный модуль с OLED и с модулями расширения на DIN-рейке.

Insol-Node-10-220.
Классическая АСУ ТП — это шкаф с центральным контроллером в операторной, к которому стягиваются километры кабелей с полевых датчиков. Это работает, но дорого, неудобно при расширении и плохо ложится на современные объекты, где «полевая» часть размазана по большой территории. Стандарт IEC 61499 в этом месте предлагает другую модель: программа описывается как сеть функциональных блоков, и одна и та же программа распределяется сразу по нескольким независимым устройствам в сети — без центрального ПЛК.
В этой статье я покажу, как это выглядит на практике. Соберём небольшую распределённую систему на двух устройствах: ПЛК INSOL-1000 (FreeRTOS, STM32H) занимается полевым уровнем — опрашивает дискретные входы, считает 4–20 мА, рулит OLED-дисплеем; шлюз INSOL Node (Linux) — это «верх» с PostgreSQL, встроенным OPC UA сервером и SCADA-платформой FUXA. Между ними — UDP multicast по схеме PUBLISH/SUBSCRIBE. Среда разработки одна — 4diac IDE, runtime один — 4diac FORTE, программа одна, но разрезанная между устройствами.
TL;DR
• 4diac — open-source реализация IEC 61499 от Eclipse Foundation. IDE + лёгкий C++ runtime FORTE.
• Логика — это сеть функциональных блоков (FB), соединённых по событиям и данным. Блоки выполняются только при получении события — никаких циклов сканирования в стиле классического IEC 61131-3.
• Программа описывается один раз, потом распределяется на нужные устройства через маппинг. Деплой — по сети, в RAM устройства; для автономной работы создаётся *.fboot файл, который runtime подхватывает при старте.
• Сетевая интеграция между устройствами — через блоки PUBLISH_N / SUBSCRIBE_N (UDP multicast). Без брокера, без центрального сервера.
• На INSOL Node поверх этого готово работает PostgreSQL (архивирование), OPC UA-сервер (для SCADA и MES) и FUXA — веб-SCADA с редактором мнемосхем прямо в браузере.
Дальше — как это собрать с нуля.
Часть 1. Что такое IEC 61499 и чем он отличается от привычного IEC 61131
Если коротко: классический IEC 61131-3 — это про сканирующий цикл одного устройства. Программа лежит в одном контроллере, циклически читает входы, считает логику, пишет выходы. Когда нужно «разнести» систему — между ПЛК ставятся отдельные шлюзы, Modbus-мосты и прочее склеивающее железо.
IEC 61499 переворачивает модель:
• Программа независима от железа. Сначала вы описываете всё приложение целиком — как сеть функциональных блоков. На каком устройстве что будет выполняться — решается позже, в System Configuration.
• Событийная модель. У каждого блока есть отдельные входы для событий (тонкие красные линии в редакторе) и для данных (синие линии). Блок исполняется в тот момент, когда на событийный вход пришёл триггер — не раньше и не позже. Цикл опроса организуется явно — обычно блоком E_CYCLE с заданным периодом.
• Распределение приложения. Через маппинг одна и та же сеть блоков «разрезается» между устройствами. Часть блоков уезжает на INSOL-1000, часть — на INSOL Node.
• Прямая связь между устройствами. PUBLISH/SUBSCRIBE — это UDP multicast: издатель льёт пакеты на групповой адрес, подписчики ловят. Никакого центрального брокера, никакого посредника.
Application Model описывается как сеть FB. System Model — устройства и сеть. Маппинг кладёт FB на устройства.
Где это особенно полезно: распределённые объекты — нефтегазовая телеметрия, ЖКХ, протяжённые объекты вроде водоканалов, фабрики с разбросанной по корпусам автоматикой. Всё, где централизованный шкаф управления — это либо длинные дорогие кабельные трассы, либо вообще нерешаемая задача.
Важный нюанс: UDP не гарантирует доставку. Для критичных управляющих сигналов нужна триггерная схема с подтверждением — SUBSCRIBE отправляет назад «эхо», PUBLISH повторяет, если эхо не пришло за таймаут. Это вы строите сами поверх стандартных блоков. Для телеметрии/архивирования штатного multicast обычно достаточно.
Часть 2. Что в наборе
Аппаратная часть для примера:
|
Устройство |
Роль |
Платформа |
Runtime |
|
INSOL-1000 |
Полевой ПЛК — DI/DO/AI/AO, RS-485, OLED |
STM32H, FreeRTOS |
4diac FORTE как отдельный поток внутри FreeRTOS |
|
INSOL Node |
Шлюз — БД, OPC UA, SCADA, web |
Linux |
4diac FORTE на Linux |
INSOL-1000 — модульный ПЛК с шиной I-BUS: к базовому модулю слева цепляются модули питания, справа — модули расширения (I1001 8DO, I1002 8DI, I1003 / I1004 аналог 4–20 мА с HART, I1005 для термопар/RTD). Между ПЛК в сети — однопарный Ethernet 10BASE-T1L (до 1500 м между устройствами, скорость 10 Мбит/с, питание PoDL прямо по той же витой паре).
Полевой уровень распределяется прямо по объекту. На верхнем уровне — обычная Ethernet/Gigabit-сеть до SCADA.
В этой статье сеть нас интересует постольку-поскольку — всё, что нужно знать, что устройства просто находятся в одном сегменте Ethernet сети.
Из софта:
• 4diac IDE — на ПК разработчика. Сборка от Insol лежит на их сайте, основана на Eclipse, в неё уже добавлены .fbt-типы под Insol-Node и Insol-1000 — иначе пришлось бы вручную подкладывать библиотеку.
• 4diac FORTE — прошитый на устройствах runtime. На INSOL-1000 — внутри FreeRTOS, на INSOL Node — поверх Linux. Поддерживает все элементарные типы IEC 61131-3 рев. 2, базовые/составные/интерфейсные FB, адаптеры, online-реконфигурацию приложений без остановки.
• На INSOL Node поверх FORTE работает экосистема верхнего уровня: PostgreSQL, OPC UA сервер (open62541), Modbus TCP клиент (libmodbus), и FUXA SCADA.
Качаем дистрибутив 4diac IDE и тестовый проект с insolsoft.ru → «Техподдержка» → «ПО 4diac». Тестовый проект — это .zip с уже готовой структурой Type Library (блоки INSOL_IO, I1000_4_20MA_IN/OUT, I1000_DISPLAY, I1000_PID, SQL_SET_*, SQL_GET_VAL) и парой Application-схем. Дальше — раскручиваем по шагам.
Часть 3. Подготовка устройств через web-интерфейс
Прежде чем запускать IDE, нужно подготовить устройства. У обоих — встроенный web на стандартных портах.
3.1. INSOL-1000: проверка прошивки и алиасы каналов
Открываем http://192.168.0.132 (адрес виден на встроенном OLED). В разделе «Прибор → О системе» — текущая версия прошивки. Если она старее, чем на сайте — обновляем через web. Если web-интерфейс не отзывается — есть аварийный режим: удерживаем две вертикальные кнопки на лицевой панели до подачи питания, тогда контроллер стартует в bootloader.
Дальше — самое важное: алиасы каналов. Алиас — это понятное имя физического канала, которое потом будет указываться в параметре PARAMS функциональных блоков IB / QB / IW / QW в 4diac. Это удобно: вы пишете ‘ain0’ вместо адреса вида «addr:0,channel:1», и эти же алиасы используются всеми верхнеуровневыми компонентами — PostgreSQL, OPC UA, FUXA.
Веб-интерфейс 1000 «Таблица идентификаторов каналов FORTE». Каждому физическому каналу даётся короткое имя, под которым он будет виден из 4diac.
|
Алиас |
Блок 4diac |
Физика |
|
di0 … di7 (din0…din7 в новой прошивке) |
IB (input bit) |
Дискретные входы |
|
do0 … do3 (dout0…dout3 в новой прошивке) |
QB (output bit) |
Дискретные выходы |
|
ain0 … ain2 |
IW (input word) |
Аналоговые входы 4–20 мА |
|
aout0 |
QW (output word) |
Аналоговый выход 4–20 мА |
Алиасы чувствительны к регистру. Значение в PARAMS блока должно совпадать с web-интерфейсом байт в байт — ‘AIN0’ и ‘ain0’ это разные каналы, и runtime молча подсунет «не тот». В разных прошивках префиксы могут отличаться (di0/din0, do0/dout0) — сверяйтесь с тем, что реально показано в таблице.
3.2. INSOL Node: запуск сервиса FORTE
Тоже web-интерфейс. Идём в раздел Forte → Сервисы Forte 3, нажимаем «Добавить сервис», задаём порт (в примере 60001), выбираем сборку (на первый запуск — заводская, например test31). На первом запуске оставляем Forte bootfile пустым — иначе при старте FORTE подхватит старую программу из .fboot и проигнорирует то, что вы хотите задеплоить из IDE.
Запускаем сервис кнопкой ▶. Всё — устройства готовы принимать программу.
|
Устройство |
IP |
Порт MGR |
|
INSOL Node |
192.168.0.176 |
60001 (задаётся при создании сервиса) |
|
INSOL-1000 |
192.168.0.132 |
61499 (фиксированный) |
Часть 4. Проект в 4diac IDE
Создаём проект: File → New → 4DIAC Project, имя test33, выбираем рабочую папку — Finish. В System Explorer появляется дерево проекта с пустым System и Type Library.
4.1. Подкладываем библиотеку блоков INSOL
В Type Library создаём подпапки 1000, inode, userblock и складываем туда .fbt файлы. В сборке IDE от Insol они уже включены, но если вы ставили оригинальный 4diac с eclipse.dev, придётся скачать библиотеку отдельно с insolsoft.ru в рамках предложенного дистрибутива.
Type Library проекта test33: папка 1000 — блоки для контроллера (I1000_4_20MA_IN/OUT, I1000_DISPLAY, I1000_PID, INSOL_IO), папка inode — блоки для шлюза (SQL_GET_VAL, SQL_SET_*), userblock — место для своих блоков. Внизу — стандартные библиотеки 4diac 3.1.0.
Минимальный набор для нашего демо:
• В 1000/: INSOL_IO, I1000_4_20MA_IN, I1000_4_20MA_OUT, I1000_DISPLAY, опционально I1000_PID
• В inode/: SQL_SET_BOOL, SQL_SET_INT, SQL_SET_REAL, SQL_SET_LONG, SQL_SET_STRING, SQL_GET_VAL
• В userblock/ — пока пусто, сюда положим свой кастомный блок чуть позже.
4.2. System Configuration — где какое устройство
Дважды кликаем на System. Правой кнопкой → New Device для каждого из двух устройств. Задаём имена и MGR_ID:
|
Имя в проекте |
Тип устройства |
MGR_ID |
|
node |
INSOL Node |
192.168.0.176:60001 |
|
PLC132 |
INSOL-1000 |
192.168.0.132:61499 |
С этого момента IDE знает, кто на проводе, и может туда деплоить.
4.3. Application для INSOL-1000
Создаём Application с именем PLC132 — это сеть блоков, которая поедет на полевой контроллер(Insol-1000). Ключевые элементы схемы:
• INSOL_IO — обязательно первый блок. Инициализирует шину I-BUS. Параметр QI = 1 (включено). Все остальные I/O-блоки запустятся только после события CNF от INSOL_IO.
• E_CYCLE (DT = T#50ms) → IB (PARAMS = ‘di0’ … ‘di3’) — циклический опрос дискретных входов с периодом 50 мс. Каждый IB отдаёт на выходе OUT булеву переменную текущего состояния входа.
• IW (‘ain0’ … ‘ain2’) → I1000_4_20MA_IN → F_REAL_AS_WSTRING → I1000_DISPLAY — аналоговые входы 4–20 мА, перевод в REAL (масштабирование), форматирование в строку и вывод на OLED.
• QB (‘do0’ … ‘do3’) — дискретные выходы.
• I1000_4_20MA_OUT → QW (‘aout0’) — аналоговый выход 4–20 мА. Уставка для него приходит сверху от INSOL Node.
• PUBLISH_3 (ID = «239.0.0.1:13201») публикует три значения ain0..ain2 в multicast.
Application PLC132: INSOL_IO инициализирует I-BUS, E_CYCLE крутит опрос, аналоговые входы идут через масштабирование на OLED, дискретные выходы — на полевые реле. SUBSCRIBE_1 ловит уставку aout0 с верхнего уровня.
Адрес 239.0.0.x — это IANA-зарезервированный диапазон для административно-локального multicast, рутер за пределы локального сегмента такие пакеты не выпустит. Порт можно выбирать любой свободный — в примере 13201 для аналога, 13202 для обратного канала.
4.4. Applications для INSOL Node
На стороне Node делаем два Application — для разделения по смыслу:
Node1 — приём аналоговых значений и публикация уставки:
• SUBSCRIBE_3 (ID = «239.0.0.1:13201») ловит то, что опубликовал PLC132. На каждое полученное событие IND выходят три значения RD_1..RD_3.
• SQL_SET_REAL (по одному на каждый канал, параметр NAME = ‘ain0’, ‘ain1’, ‘ain2’) пишет значения в PostgreSQL. Если переменная в БД ещё не существует — она будет создана автоматически при первом вызове. Если задать HIST = TRUE, блок начнёт ещё и архивировать историю в tag_archive.
• Обратный путь: E_CYCLE (T#1s) → SQL_GET_VAL (NAME = ‘aout0’) → F_STRING_AS_REAL → PUBLISH_1 (ID = «239.0.0.1:13202»). Раз в секунду читаем уставку из БД (туда её положит оператор через FUXA), конвертируем строку в REAL и публикуем в сеть. PLC132 подписан на этот же multicast и применит её к aout0.
Node1: верхняя ветка — SUBSCRIBE_3 ловит ain0..ain2 и складывает в PostgreSQL через SQL_SET_REAL. Нижняя ветка — E_CYCLE раз в секунду читает уставку aout0 из БД и публикует её обратно в сеть.
Node2 — приём дискретных сигналов: SUBSCRIBE_4 (ID = «231.0.0.1:60002») → SQL_SET_BOOL для di0..di3. Отдельный multicast-канал для дискретки.
4.5. Маппинг и деплой
Возвращаемся в System Configuration. Перетаскиваем(маппим) PLC132 Application на устройство PLC132, Node1 и Node2 — на node. Элементы окрашиваются в цвет соответствующего устройства. Это и есть маппинг.
Дальше — Online → Connect to System. Если устройства живы и порты совпадают, индикаторы у обоих горят зелёным. Жмём Deploy → Start (▶). Программа улетает в RAM устройств. С этого момента IDE в Online-режиме показывает текущие значения на каждой линии связи в реальном времени — это, пожалуй, самая удобная штука в 4diac: вы буквально видите, как событие пробежало по схеме и какие данные где сейчас лежат.
Пока программа в RAM — после reboot устройства её там не будет. Это нормальный режим отладки. Финальное развёртывание — через Boot-файл, разберём ниже.
Часть 5. Кастомный блок: ST-алгоритм, отладка, экспорт в C++
Базовых блоков обычно не хватает, и стандарт позволяет писать свои. Типов несколько: Basic FB (с алгоритмом на ST и собственным конечным автоматом — ECC), Composite FB (собранный из других FB), Service Interface FB (для нативного взаимодействия с runtime — обычно C++), Simple FB. Самый частый случай — Basic FB.
Сделаем учебный блок NewBlock, который принимает три REAL и возвращает их сумму, среднее, минимум и максимум.
5.1. Интерфейс блока
Правой кнопкой на Type Library/userblock → New → Basic Function Block. Имя — NewBlock. Во вкладке Interface:
• Входное событие: REQ, с ассоциированными переменными ri1, ri2, ri3 (тип REAL).
• Выходное событие: CNF, с переменными rmin, rsumm, rmax, rmidl (тип REAL).
5.2. Алгоритм на ST
Создаём алгоритм MATH2 (вкладка Algorithms). Реальный код, который попадает в кодогенерацию FORTE:
ST-редактор 4diac IDE с алгоритмом MATH2. Все типы констант указываются явно (INT#0, REAL#3.0) — это конвенция IEC 61131-3, FORTE на ней настаивает.
Структурированный текст здесь — обычный IEC 61131-3 рев. 2. Полная спецификация — на сайте PLCopen, конкретные ограничения runtime FORTE — в eclipse.dev/4diac/doc.
5.3. ECC — конечный автомат блока
Во вкладке ECC рисуем минимальный автомат с двумя состояниями:
• START (начальное) — пустое, ничего не делает.
• State — выполняет MATH2 и эмитит CNF.
Переходы:
• START → State по событию REQ.
• State → START по безусловному условию 1 — то есть сразу после выполнения алгоритма возвращаемся в начальное состояние, готовы ловить следующий REQ.

Рис. Диаграмма ECC
5.4. Отладка локально
Самое полезное в 4diac IDE — это локальная отладка FB без устройства. Правый клик по типу блока в дереве → Debug As → 1 Debug FB Type запускает runtime прямо на машине разработчика и подключает блок к нему.
Тот же MATH2 в режиме отладки: точка останова на END_ALGORITHM, в Variables справа видны живые значения ardata = [11.0, 23.4, 32.1], maximum = 32.1, middle = 22.166666. Слева внизу — FB Debug с панелью входов и выходов блока: ri1 = 0.0, ri2 = 11.0, ri3 = 23.4 → rmin = 11.0, rsumm = 66.5, rmax = 32.1, rmidl = 22.166666.
Что доступно:
• Watch Variables — текущие значения всех переменных блока. Любую можно вручную поменять «на лету».
• Force Event — отправить REQ руками и посмотреть, что блок выдаст на CNF. Без всякого внешнего железа.
• Точки останова на переходах ECC — выполнение приостанавливается на переходе, пошагово смотрим, что и почему сработало.
• Debug Stack — порядок вызовов алгоритмов и событий.
• Подсветка текущего состояния ECC в реальном времени — то самое визуальное «глаза-смотрят-как-программа-бежит», ради которого многие в IEC 61499 и пришли.
5.5. Экспорт созданного модуля в C++ и сборка под Linux
Чтобы наш блок поехал на INSOL Node, нужно сгенерировать его C++ исходники и подложить в сборку FORTE на устройстве.
В IDE — правой кнопкой на NewBlock → Export, в визарде выбираем 4diac IDE → 4diac IDE Type Export, экспортер 4diac FORTE 3.x, целевая папка — рабочий каталог сборки. На выходе получаем два файла: NewBlock.cpp и NewBlock.h.
Дальше — web-интерфейс INSOL Node → Forte → Сборки Forte3 → выбираем активную сборку → Сборка. Включаем чекбокс рядом с NewBlock в списке «Использовать ФБ при компиляции», сохраняем, жмём «Компилировать». Статус сменится на «Скомпилирован» — это значит, что блок собран в новый бинарник FORTE и зарегистрирован в реестре типов. Перезапускаем сервис ▶ — и NewBlock теперь доступен в IDE наравне со стандартными библиотечными блоками. Можно перетаскивать на схему.
Часть 6. Верхний уровень: PostgreSQL → OPC UA → FUXA
Это та часть, ради которой INSOL Node, собственно, и существует. В типичном проекте АСУ ТП «верхним уровнем» обычно занимается отдельный сервер с разнородной обвязкой: лицензионная SCADA ( WinCC, MasterSCADA и пр.), отдельный OPC-сервер вроде KEPServerEX, historian, СУБД, веб-сервер для удалённого доступа к HMI, плюс прослойка пользователей и прав, средства мониторинга, отчётный модуль. Каждый компонент — свой инсталлятор, своя лицензия, свой формат конфигурации, свой канал техподдержки. Половину времени проекта уходит на то, чтобы все эти кусочки начали разговаривать друг с другом.
INSOL Node — это всё то же самое, но в одной коробке, под одной web-консолью. На Linux-устройстве уже предустановлено и работает:
• 4diac FORTE runtime — собственно среда исполнения IEC 61499. То, ради чего мы и пришли.
• PostgreSQL — встроенная промышленная СУБД. Переменные создаются автоматически блоками SQL_SET_*; ничего заранее настраивать не нужно. Архивные данные, журналы событий, конфигурации — всё здесь.
• OPC UA сервер (open62541) — самый распространённый промышленный стандарт интеграции. Автоматически экспонирует всё, что есть в PostgreSQL. Поддерживает Historical Access — внешняя SCADA или MES получат и реальное время, и историю.
• FUXA SCADA — open-source веб-SCADA/HMI. Редактор мнемосхем работает прямо в браузере, никакого Windows-клиента ставить не нужно. Доступ с планшета, телефона, любой машины в сети.
• Modbus TCP-клиент (libmodbus) — для интеграции с полевыми устройствами сторонних производителей: частотными приводами, счётчиками электроэнергии, расходомерами и прочей классикой.
• Web Server Insol-Node — единая web-консоль, в которой управляется всё сразу: пользователи и права доступа, сервисы FORTE и их сборки, настройки OPC UA, доступ к SCADA, отчёты, диагностика сети, обзор подключённых устройств.
Под капотом — open-source стек везде, где это возможно: PostgreSQL, open62541, FUXA, 4diac FORTE. Никаких подписок «$N за тег», лицензий на клиентские подключения, отдельных серверов историка. Один разовый платёж за железо — и интеграционный слой собран.
Что важно для проектировщика: компоненты уже сшиты между собой по реальным шинам, а не по бумажным схемам. Блок SQL_SET_REAL положил значение → PostgreSQL немедленно отдал его в OPC UA → подписанный клиент SCADA получил уведомление → точка на тренде нарисовалась. Все три шага происходят без вашего участия и без единой строчки кода.
Минимальный проект АСУ ТП, который раньше требовал сервера с Windows, SCADA-лицензии, KEPServerEX, отдельной СУБД и недели настройки сетки между ними — здесь собирается за пару часов и помещается в DIN-реечный модуль.
Дальше — что именно даёт каждый компонент.
6.1. PostgreSQL
В Node предустановлен PostgreSQL и небольшая обвязка над ним. Блоки SQL_SET_* сделаны так, что они сами создают переменную в БД при первом обращении — не нужно заранее лезть в psql и делать CREATE TABLE.
Раздел «Источники» в Insol NET: ain0..ain2 (Float, добавлены автоматически блоком SQL_SET_REAL), aout0 (Float, добавлен вручную как уставка), di0..di3 (Bool, тоже автоматически). Колонка «Обновлено» показывает реальный темп прихода данных.
Поддерживаемые блоки:
|
Блок |
Тип |
Что делает с HIST=TRUE |
|
SQL_SET_BOOL |
BOOL |
Архивирует состояния дискретных сигналов |
|
SQL_SET_INT |
INT (16 бит) |
Архив целых |
|
SQL_SET_REAL |
REAL |
Архив трендов аналоговых измерений |
|
SQL_SET_LONG |
DWORD (32 бита) |
Архив счётчиков |
|
SQL_SET_STRING |
STRING |
Архив текстовых сообщений |
|
SQL_GET_VAL |
ANY → STRING |
Чтение из БД по имени переменной |
Обратите внимание: уставки оператора (то, что не приходит из 4diac, а вводится в SCADA) добавляются в БД руками — через web-интерфейс INSOL Node, который под капотом просто пишет в ту же таблицу. А потом 4diac читает их обратно через SQL_GET_VAL.
6.2. OPC UA — без настройки
Всё, что лежит в PostgreSQL, автоматически публикуется встроенным OPC UA сервером (open62541) на стандартном порту 4840. Пространство имён и политику безопасности можно подкрутить в web, но для старта достаточно дефолтов: Security Mode: None, endpoint opc.tcp://192.168.0.176:4840.
Архивные данные для переменных с HIST=TRUE отдаются через OPC UA Historical Access — это значит, что SCADA сможет рисовать тренды не только по «живым» данным, но и по истории.
6.3. FUXA — мнемосхема в браузере
FUXA — это open-source веб-SCADA/HMI на Angular (есть на GitHub: frangoteam/FUXA). Поддерживает OPC UA, Modbus TCP/RTU, MQTT, прямой коннект к PostgreSQL/SQLite/InfluxDB. На INSOL Node она уже установлена и запущена — открываем http://192.168.0.176:1881.
Шаги настройки выглядят так:
Подключение OPC UA. В режиме Editor → шестерёнка → Connections → + → OPC UA:
Name: opcnode
Endpoint URL: opc.tcp://192.168.0.176:4840
Security: None
Connect → статус Connected → Save.
Теги. В разделе Tags добавляем по тегу на каждую переменную, выбирая узлы из дерева OPC UA.
Browse Tags in Server в FUXA: под Objects → opcserver видны ain0..ain2 (Float, R, R) и aout0 (Float, R/W, R/W). Атрибуты доступа берутся прямо из OPC UA — FUXA понимает, какие переменные можно писать, а какие только читать.
Имя тега обычно совпадает с алиасом канала на INSOL-1000 — так проще трассировать:
|
Тег FUXA |
Узел OPC UA |
Тип |
|
ain0, ain1, ain2 |
Objects → opcserver → ain0..2 |
Float |
|
aout0 |
Objects → opcserver → aout0 |
Float (R/W) |
|
di0..di3 |
Objects → opcserver → di0..3 |
Boolean |
|
do0..do3 |
Objects → opcserver → do0..3 |
Boolean (R/W) |
Мнемосхема. В Pages создаём страницу MainView. Из палитры тянем элементы:
-
Gauge для ain0 — диапазон 4..20 (если в «сырых» миллиамперах) или 0..100 (в физических единицах, если конвертация уже сделана на стороне 4diac). Цветовые зоны зелёная/жёлтая/красная — норма/предупреждение/авария.
-
Switch для do0. Поскольку тег R/W, при клике FUXA пишет новое значение в OPC UA. Дальше оно попадает в PostgreSQL, оттуда SQL_GET_VAL забирает его на INSOL-1000 и переключает физический выход. Логически — обычное «нажал кнопку — лампа загорелась», но цепочка под капотом длинная: браузер → OPC UA → БД → FORTE на Node → publish → subscribe → FORTE на PLC132 → QB → реле.
-
Chart для трендов. Источник — либо OPC UA Historical Access (если переменная заведена с HIST=TRUE), либо встроенный DAQ в FUXA (она сама может писать значения тегов в SQLite и строить тренды из него). Второе удобнее, когда нужен быстрый дашборд без перенастройки 4diac.
Финальный вид мнемосхемы в режиме просмотра. aout0 = 4.589 mA — это уставка, заданная оператором; ain0..ain2 — аналоговые входы с физического INSOL-1000. Цветовые зоны 4..20 мА с переходом красный/жёлтый/зелёный.
Сохраняем (Save), переключаемся в режим View. Частота обновления — по умолчанию 1 секунда, настраивается per-tag. Готовую мнемосхему можно открыть напрямую по http://192.168.0.176:1881/lab — например, с планшета в полноэкранном режиме.
Часть 7. Boot-файл — переходим в режим «работает само»
Пока мы всё деплоили в RAM. Чтобы система оживала сама после reboot устройства, нужен *.fboot файл. XML структура описывающая все используемые блоки в проекте и связи между ними
В IDE: правой кнопкой на Application → Create Boot File. Для каждого устройства генерируется свой .fboot. Дальше:
-
INSOL-1000: web-интерфейс → «Сервисы» → загружаем *.fboot для PLC132.
-
INSOL Node: настройки сервиса 4diac FORTE → в поле Forte bootfile выбираем загруженный *.fboot для node, включаем «Автозапуск».
-
Перезагружаем оба устройства.
Runtime при старте обнаруживает .fboot и поднимает приложение. Подключение IDE больше не требуется — система автономна.
На этапе отладки всегда удаляйте Boot-файл с устройства перед очередным Deploy. Иначе FORTE поднимется с .fboot-версии, проигнорирует только что задеплоенную из IDE, и вы будете долго ловить «фантомные» отличия.
Часть 8. Что в итоге
Что получилось из коробки:
-
Распределённая система без центрального ПЛК. Полевая логика (опрос I/O, отображение на OLED, аналоговый выход) живёт на STM32H с FreeRTOS. Архив, SCADA и интеграционный слой — на Linux-шлюзе. Связь — UDP multicast в одном Ethernet-сегменте.
-
Одна программа на все устройства. Описана один раз в 4diac IDE, разрезается через маппинг. Online-отладка показывает значения на всех линиях схемы в реальном времени — без отдельных средств трассировки.
-
Стандартизованный верх. OPC UA сервер с историческим доступом, готовый к подключению любой нормальной SCADA или MES. FUXA встроена как референсный HMI, но никто не мешает подключить ту же условную МастерСкаду или WinCC.
-
Расширяемость через свои блоки. Удобный инструмент компиляции собственных наработок. Basic FB → ST → отладка локально → экспорт в C++ → сборка на устройстве → доступен в IDE. Цикл «придумал блок — встроил в библиотеку» — минут за двадцать.
Где это не серебряная пуля:
-
IEC 61499 всё ещё непривычен — инженеров, которые уверенно его читают, на порядок меньше, чем спецов по классическому 61131-3.
-
Multicast накладывает требования на сеть: managed-коммутаторы с поддержкой IGMP snooping, никаких «домашних» свитчей в продакшене.
-
Гарантированной доставки нет — для критичных сигналов управления вы строите свой ACK-протокол поверх PUBLISH/SUBSCRIBE.
-
Online-реконфигурация — мощная штука, но требует дисциплины: «горячую подмену» работающего алгоритма легко превратить в недокументированный инцидент.
Полезные ссылки
ссылка на оригинал статьи https://habr.com/ru/articles/1041066/