В июле вышла новая версия открытой среды исполнения для IEC 61499, позволяющая вести разработку на python - OpenFB 1.2. OpenFb можно скачать с github. Среда исполнения OpenFb предназначена для разработки и интеграции приложений компьютерного зрения и ML алгоритмов в проекты АСУ ТП.

Причиной внедрения OpenFb должно быть снижение затрат на создание АСУ ТП приложений с функциями компьютерного зрения:

- OpenFb не должно значительно усложнять разработку CV алгоритмов

- OpenFb должно упрощать доступ к переменным с ПЛК на IEC 61131 и IEC 61499

Для оценки удобства использования OpenFb для решения задач рассмотрим два сценария:

  • Разработка приложения из готовых блоков

  • Добавление нового алгоритма

Рассмотрим пример включения базовых алгоритмов компьютерного зрения в систему управления. Для примера рассмотрим следующую задачу:

  1. По конвейеру едет упаковка с QR кодом

  2. Если QR код найден, но не распознан, то выдаём команду на сбрасыватель по OPCUA.

Возможная архитектура системы компьютерного зрения и АСУ ТП представлена на рисунке ниже:

Рис. 1
Рис. 1

Создание приложения из готовых блоков.

Для создания проекта OpenFB необходимо:

  1. Скачать среду разработки 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)

  2. Скачать и поставить 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...
  3. Создать новый проект в IDE

    3.1 Запустить flogic IDE и задать рабочий каталог для проекта

    Рис. 2
    Рис. 2

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

    Рис. 3
    Рис. 3

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

    Рис. 4
    Рис. 4
  4. Разработать программу из готовых функциональных блоков из стандартной библиотеки flogic.

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

    1. Отправной точкой для разработки может быть программа, реализующая циклическое выполнение алгоритма (в начальной реализации заменим алгоритм выводом на консоль).

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

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

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

      Рис. 8
      Рис. 8
    5. Результатом работы программы будет вывод на консоль сообщений STEP 1 ... STEP N

  5. Программа распознавания QR кодов упаковок может быть собрана из функциональных блоков, использующих opencv. openFB 1.2 позволяет использовать наиболее употребительные функции из opencv в виде готовых функциональных блоков.

    1. Базовая программа на openFB для получения видеопотока с камеры выключает следующие компоненты:

      • Блок для периодической генерации событий (возьмем для этой цели блок DELAY)

      • Блок для захвата кадров из камеры (возьмем блока CAMERA из библиотеки CVBase, входящей в состав openFb)

      • Блок отображения кадра на экран IMSHOW

      Рис. 9
      Рис. 9

    Встроенный блок START генерирует событие COLD при старте программы. Функциональный блок CAMERA, доступный в OpenFb по приходу событий INIT открывает камеру (надо указать номер камеры на входе ID, например 0, для /dev/video0) или демонстрационный файл с видео. Кадры читаются камерой по приходу события REQ и помещаются в глобальную очередь кадров. Считанные кадры помещаются в указанную глобальную очередь и им присваивается уникальный идентификатор, который выдаётся через выход IMG_ID.

    5.2 Блок для распознавания QR кода не входит в стандартную библиотеку openFb, но мы легко можем добавить его.

Создание собственного функционального блока для CV алгоритма

6. Создание нового функционального блока для распознавания QR кода

6.1 Создание нового функционального блока типа simple в IDE командой Новый/тип

Рис. 10
Рис. 10

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

Рис. 11
Рис. 11

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

Рис. 12
Рис. 12

Созданные в Forgelogic IDE функциональные блоки сохраняются в xml формате в файла с расширением fbt в папке проекта.

6.4 В OpenFb каждому функциональному блоку должен соответствовать python файл, содержащий класс, реализующий функциональный блок. Ключевые моменты при создании реализации для нового функционального блока на python следующие:

  1. Название файла питоновского скрипта должно полностью совпадать с типом пользовательского ФБ

  2. Название класса с реализацией логики работы функционального блока также должно совпадать с типом пользовательского ФБ

  3. Вся логика реализуется внутри метода schedule

  4. Метод schedule принимает на вход аргументы (имя события, счётчик событий, вх. переменная 1, вх.пер. 2, … вх. пер. N)

  5. Метод 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 выдаст распознанное сообщение на терминал.

Рис. 13
Рис. 13

Передача результатов работы CV алгоритма в АСУ ТП

6.8 Распознанное сообщение возможно публиковать по протоколу OPCUA.

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

Рис. 14
Рис. 14

Для решения задачи сбрасывания упаковок с не читаемым QR кодом передаём на сбрасыватель по OPCUA два значения:

  • признак распознавания QR кода QRDETECTOR.QO (TRUE, если QR код найден)

  • распознанный QR код QRDETECTOR.VAL- признак распознавания QR кода (TRUE, если QR код найден)

ПЛК, управляющий сбрасывателем, получает значения по OPCUA и снимает с конвейера упаковки с не читаемым QR кодом. Среду исполнения openFB можно запускать на PC или на встраиваемом компьютере таком, как orange pi.

Как видно из приведённого выше примера, разработать своё приложение компьютерного зрения в OpenFb и передать результаты его работы по OPCUA не значительно сложнее, чем на чистом python.