
В июле вышла новая версия открытой среды исполнения для IEC 61499, позволяющая вести разработку на python - OpenFB 1.2. OpenFb можно скачать с github. Среда исполнения OpenFb предназначена для разработки и интеграции приложений компьютерного зрения и ML алгоритмов в проекты АСУ ТП.
Причиной внедрения OpenFb должно быть снижение затрат на создание АСУ ТП приложений с функциями компьютерного зрения:
- OpenFb не должно значительно усложнять разработку CV алгоритмов
- OpenFb должно упрощать доступ к переменным с ПЛК на IEC 61131 и IEC 61499
Для оценки удобства использования OpenFb для решения задач рассмотрим два сценария:
Разработка приложения из готовых блоков
Добавление нового алгоритма
Рассмотрим пример включения базовых алгоритмов компьютерного зрения в систему управления. Для примера рассмотрим следующую задачу:
По конвейеру едет упаковка с QR кодом
Если QR код найден, но не распознан, то выдаём команду на сбрасыватель по OPCUA.
Возможная архитектура системы компьютерного зрения и АСУ ТП представлена на рисунке ниже:

Создание приложения из готовых блоков.
Для создания проекта OpenFB необходимо:
Скачать среду разработки ForgeLogic IDE (https://gitverse.ru/IT_Severstal/flogic-ide/content/flogic-3.0.x) или установить в VS code plugin openFb (https://github.com/rtsoft-sdc/openfb_plugin.git)
-
Скачать и поставить OpenFb (по ссылке https://github.com/rtsoft-sdc/openFB.git)
git clone https://github.com/rtsoft-sdc/openFB.git cd openFb python3 -m venv .venv Активировать окружение source .venv/bin/activate # На Linux #.venv\Scripts\activate # На Windows pip install -r requirements.txt Запустить среду исполнения openFb python3 run.py ... 2026-07-03 21:01:29,882][ERROR][MainThread] Could not find fboot definition file. Awaiting deployment. [INFO] OPCUA server is running on 0.0.0.0:4840 [2026-07-03 21:01:29,882][INFO][MainThread] TCP server starting up on 0.0.0.0 port 61499 [INFO] Openfb is up and running on 0.0.0.0:61499 [2026-07-03 21:01:29,882][INFO][MainThread] waiting for a connection... -
Создать новый проект в IDE
3.1 Запустить flogic IDE и задать рабочий каталог для проекта

Рис. 2 3.2 Создать проект в FlogicIDE (Файл/Новый/Проект FlogicIDE)

Рис. 3 3.3 Задать аппаратную конфигурацию

Рис. 4 -
Разработать программу из готовых функциональных блоков из стандартной библиотеки flogic.
Среда исполнения openFb поддерживает большущую часть стандартной библиотеки IEC 61499. Программа на IEC 61499 состоит из функциональных блоков и управляется событиями.
-
Отправной точкой для разработки может быть программа, реализующая циклическое выполнение алгоритма (в начальной реализации заменим алгоритм выводом на консоль).

Рис. 5 -
Блоки программы необходимо назначить на вычислительное устройство командой "Привязать к", которая доступна при выборе функционального блока при нажатии на правую кнопку мыши.

Рис. 6 -
При старте вычислительного устройства блок START генерирует начальное событие COLD. Необходимо связать начальное событие COLD со входным событием первого блока в программе.

Рис. 7 -
Для запуска программы в среде исполнения вычислительного устройства необходимы выполнить команду Выполнить как/загрузить

Рис. 8 Результатом работы программы будет вывод на консоль сообщений STEP 1 ... STEP N
-
-
Программа распознавания QR кодов упаковок может быть собрана из функциональных блоков, использующих opencv. openFB 1.2 позволяет использовать наиболее употребительные функции из opencv в виде готовых функциональных блоков.
-
Базовая программа на openFB для получения видеопотока с камеры выключает следующие компоненты:
Блок для периодической генерации событий (возьмем для этой цели блок DELAY)
Блок для захвата кадров из камеры (возьмем блока CAMERA из библиотеки CVBase, входящей в состав openFb)
Блок отображения кадра на экран IMSHOW

Рис. 9
Встроенный блок START генерирует событие COLD при старте программы. Функциональный блок CAMERA, доступный в OpenFb по приходу событий INIT открывает камеру (надо указать номер камеры на входе ID, например 0, для /dev/video0) или демонстрационный файл с видео. Кадры читаются камерой по приходу события REQ и помещаются в глобальную очередь кадров. Считанные кадры помещаются в указанную глобальную очередь и им присваивается уникальный идентификатор, который выдаётся через выход IMG_ID.
5.2 Блок для распознавания QR кода не входит в стандартную библиотеку openFb, но мы легко можем добавить его.
-
Создание собственного функционального блока для CV алгоритма
6. Создание нового функционального блока для распознавания QR кода
6.1 Создание нового функционального блока типа simple в IDE командой Новый/тип

6.2 Необходимо создавать новый функциональный блок с именем QRDETECTOR типа simpe. openFb может использовать только блоки типа simpe.

6.3 В качестве образца для блока задания интерфейса блока QRDETECTOR можно взять существующий блок ARUCODETECTOR. У блока для обработки изображений должны быть входы QUEUE_ID, IMG_ID и выходы STATUS и VAL.

Созданные в Forgelogic IDE функциональные блоки сохраняются в xml формате в файла с расширением fbt в папке проекта.
6.4 В OpenFb каждому функциональному блоку должен соответствовать python файл, содержащий класс, реализующий функциональный блок. Ключевые моменты при создании реализации для нового функционального блока на python следующие:
Название файла питоновского скрипта должно полностью совпадать с типом пользовательского ФБ
Название класса с реализацией логики работы функционального блока также должно совпадать с типом пользовательского ФБ
Вся логика реализуется внутри метода schedule
Метод schedule принимает на вход аргументы (имя события, счётчик событий, вх. переменная 1, вх.пер. 2, … вх. пер. N)
Метод schedule возвращает (счётчик события(СС) 1, СС 2, …, СС N, вх. пер. 1, вх.пер. 2, … вх. пер. N)
Рекомендуется создать заготовку для python реализации функционального блока при помощи утилиты fbt2py и скопировать файлы fbt и py для функционального блока в каталог resources/function_blocks:
cd ~/workspace/cvdemo/Type Library python3 ~/openFb/tools/fbt2py ~/workspace/cvdemo/Type Library/QRDETECTOR.fbt mv ./QRDETECTOR.py ~/openfb/openfb/resources/function_blocks/openCV/trackers cp ./QRDETECTOR.fbt ~/openfb/openfb/resources/function_blocks/openCV/trackers
6.5 Утилита fbt2py генерирует заготовку реализации функционального блока на python:
import logging class QRDETECTOR: """ Simple FB with one algorithm """ def __init__(self): # Input Variables self.QI = False # Type: BOOL self.QUEUE_ID = '' # Type: STRING self.IMG_ID = 0 # Type: UDINT # Output Variables self.QO = False # Type: BOOL self.STATUS = 0 # Type: STRING self.VAL = 0 # Type: STRING def __del__(self): # TODO Insert your code here pass def service_REQ(self): """ Event Handler for REQ """ logging.info("Execution logic for REQ triggered") # Implement internal algorithms here def schedule(self,IN_EVENT_NAME,EVNT_CNTR,QI,QUEUE_ID,IMG_ID): self.QI= QI self.QUEUE_ID= QUEUE_ID self.IMG_ID= IMG_ID if IN_EVENT_NAME == "REQ": # TODO Insert your code here self.service_REQ() return EVNT_CNTR,self.QO,self.STATUS,self.VAL
6.6 Добавить реализацию не python по образцу ARUCODETECTOR
Класс, реализующий функциональный блок, обрабатывающий изображения, должен дополнительно включать механизм доступа к очереди кадров. Для этого в код должно быть добавлено следующее:
from openfb.resources.function_blocks.openCV.globalVideoMemory import GlobalVideoMemory ... def service_REQ(self): queue_id = GlobalVideoMemory.get_queue_id(self.QUEUE_ID) img = GlobalVideoMemory.get(queue_id=queue_id, img_id=self.IMG_ID)
Полный код функционального блока, реализующего детектирование QR кода приведён ниже:
import cv2 from openfb.resources.function_blocks.openCV.globalVideoMemory import GlobalVideoMemory import logging class QRDETECTOR(): """ Simple FB with one algorithm """ def __init__(self): # Input Variables self.QI = False # Type: BOOL self.QUEUE_ID = '' # Type: STRING self.IMG_ID = 0 # Type: UDINT # Output Variables self.QO = False # Type: BOOL self.STATUS = 0 # Type: STRING self.VAL = "" # Type: STRING self.detector = cv2.QRCodeDetector() def service_REQ(self): """ Event Handler for REQ """ # Implement internal algorithms here queue_id = GlobalVideoMemory.get_queue_id(self.QUEUE_ID) img = GlobalVideoMemory.get(queue_id=queue_id, img_id=self.IMG_ID) if img is not None: data, bbox, straight_qrcode = self.detector.detectAndDecode(img) if bbox is not None: self.QO = True self.VAL = data else: self.QO = False self.VAL ="" def schedule(self,IN_EVENT_NAME,EVNT_CNTR,QI,QUEUE_ID,IMG_ID): self.QI= QI self.QUEUE_ID= QUEUE_ID self.IMG_ID= IMG_ID if IN_EVENT_NAME == "REQ": # TODO Insert your code here self.service_REQ() return EVNT_CNTR,self.QO,self.STATUS,self.VAL
6.7 Использовать функциональный блок QRDETECTOR в приложении.
Если QR код распознан, то на выходе QO будет TRUE, а на выходе VAL распознанное сообщение. Блок OUT_ANY_CONSOLE выдаст распознанное сообщение на терминал.

Передача результатов работы CV алгоритма в АСУ ТП
6.8 Распознанное сообщение возможно публиковать по протоколу OPCUA.
openFb включает встроенный OPCUA сервер. Входы и выходы функциональных блоков могут быть отмечены в среде разработке, как публикуемые по OPCUA. Например, можно опубликовать выход VAL блока QRDETECTOR:

Для решения задачи сбрасывания упаковок с не читаемым QR кодом передаём на сбрасыватель по OPCUA два значения:
признак распознавания QR кода QRDETECTOR.QO (TRUE, если QR код найден)
распознанный QR код QRDETECTOR.VAL- признак распознавания QR кода (TRUE, если QR код найден)
ПЛК, управляющий сбрасывателем, получает значения по OPCUA и снимает с конвейера упаковки с не читаемым QR кодом. Среду исполнения openFB можно запускать на PC или на встраиваемом компьютере таком, как orange pi.
Как видно из приведённого выше примера, разработать своё приложение компьютерного зрения в OpenFb и передать результаты его работы по OPCUA не значительно сложнее, чем на чистом python.
Granulex
Интересное направление. Из практики добавлю нюанс: главная сложность не в том, чтобы подружить python с IEC 61499, а в том, что компьютерное зрение даёт непредсказуемую задержку, тогда как событийный цикл управления любит предсказуемое время реакции. Стоит разнести их по разным устройствам исполнения, чтобы тяжёлый ML-кадр не съедал бюджет реакции ПЛК по OPC UA. Отдельно про ветку "QR найден, но не распознан": ей нужен явный таймаут, иначе зависший конвейер зрения тихо перестанет отбраковывать, и заметят это не сразу.
almaximort Автор
Относительно задержки от компьютерного зрения Вы полностью правы. Она может быть источником недетерменизма. На приведенной на рис.1 схеме, как Вы и отметили, OpenFB работает на отдельном вычислительном модуле, а не на ПЛК. На ПЛК передается команда по OPCUA.