
В июле вышла новая версия открытой среды исполнения для 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.
