Зачем нужен IEC 61499

В данной статье я постараюсь поделиться результатами, полученными командой кафедры 307 МАИ в процессе сотрудничества с Лабораторией Касперского в области разработок защищенных систем управления для АСУ ТП, IoT и умного дома.

Традиционно мир программирования для встраиваемых решений делится на программирование ПЛК, где используются среды программирования стандарта IEC 61131 и разработку на С/С++ для микроконтроллеров и встраиваемых устройств. Стандарт IEC 61131 включает 5 языков программирования ST, FBD, IL, LD, SFC и позволяет абстрагироваться от особенностей аппаратной реализации устройства и протоколов передачи данных. Это значительно сокращает время разработки и уменьшает число ошибок.

Нельзя не отметить решения, которые часто используются при разработке прототипов систем:

Однако, эти инструменты больше нацелены на быстрое прототипирование и затрудняют последующий переход от прототипа к решению.

Программирование на IEC 61131, например, на языке структурированного текста позволяет быстро описать алгоритм управления в терминах входных/выходных переменных и операций над ними. При разработке данного стандарта в качестве вычислительного модуля рассматривался отдельный программируемый контроллер. Описывать взаимодействие нескольких контроллеров в рамках единой системы управления возможно, но может быть не очень удобно. Камнем, который иногда бросают в огород IEC 61131, является заточенность только под системы управления. Python, java script или даже С++ используются в различных областях, а ST или FBD только в промышленной автоматизации.

IEC 61499 был предложен, как расширение стандарта IEC 61131 предназначенное для распределенных систем управления, состоящих из нескольких контроллеров. Основным строительным элементов IEC 61499 является функционал��ный блок похожий на конструкцию языка FBD.

Рис.1. Функциональный блок в IEC 61499.
Рис.1. Функциональный блок в IEC 61499.

Функциональный блок в IEC 61499 имеет входы данных, выходы данных, а также дополнительно по отношению к IEC 61131, входы и выходы событий (отмечены красным). В момент прихода входного события (REQ) читаются входные переменные, срабатывает логика функционального блока. Логика функционального блока производит вычисления, присваивает выходные переменные и инициирует выходные события (CNF). Функциональный блок может иметь выделенные события для инициализации (INIT) и подтверждения инициализации (INIT0). Программа на IEC 61499 представляет из себя граф в узлах которого помещаются функциональные блоки, связанные между собой по данным и по событиям. Использование событий предоставляет явную возможность управления потоком выполнения в распределенной системе.

Для IEC 61499 есть симпатичные реализации среды исполнения Eclipse 4diac forte и среды разработки Eclipse 4diac IDE. Они доступны по открытой лицензии EPL. Среда разработки может работать на Linux, Windows или Mac. Среда исполнения работает на любой posix совместимой ОС и даже на микроконтроллерах. Для разработки защищенного решения представляется перспективным запуск среды исполнения IEC 61499 4diac forte на Kaspersky OS.

Начинаем с "Hello world"

Пример минимальной программы "Hello world" в среде разработки 4diac выглядит следующим образом:

Рис.2. Минимальная программа в среде 4diac.
Рис.2. Минимальная программа в среде 4diac.

Что внутри у функционального блока

Среда разработки позволяет описать программу, как набор связанных функциональных блоков и в действительности работает только c описаниями интерфейсов функциональных блоков. Существует возможность готовые функциональные блоки из библиотеки или создать свой собственный. Например, можно в IDE создать функциональный блок со следующим описание для получения текущего времени:

Рис.3. Интерфейс функционального блока E_TIMESTAMP
Рис.3. Интерфейс функционального блока E_TIMESTAMP

Среда исполнения анализирует только интерфейс функционального блока. Внутри среды исполнения для описания функционального блока используется xml:

Рис.4. Пример декларации функционального блока E_TIMESTAMP
Рис.4. Пример декларации функционального блока E_TIMESTAMP

Среда исполнения содержит ядро для работы с событиями и библиотеку реализаций функциональных блоков. При загрузки приложения создаются экземпляры используемых
функциональных блоков и запускается обмен сообщениями между ними. Для нового функционального блока IDE может сгенерировать заготовку класса на C++. Например, для E_TIMESTAMP исходный код для forte выглядит так:

Рис.5. Класс, реализующий логику работы функционального блока E_TIMESTAMP
Рис.5. Класс, реализующий логику работы функционального блока E_TIMESTAMP

Основная логика работы функционального блока реализуется в виртуальном методе void executeEvent(int pa_nEIID); Именно этот метод должен реализовать разработчик, если создает собственный функциональный блок.

В стандартной библиотеке 4diac есть функциональные блоки для работы с вводом-выводом, специфичные блоки для систем управления, например PID и коммуникационные для различных протоколов. 4diac из коробки включает поддержку распространенных промышленных протоколов Modbus TCP, Modbus RTU, MQTT, OPC UA и других.

Рис.6. Возможная архитектура системы с 4diac
Рис.6. Возможная архитектура системы с 4diac

Для меня крайне привлекательными при работе с 4diac стали:

  • широкие возможности расширения функциональности на C++

  • продуманная строгая структура интерфейсов функциональных блоков, опирающаяся на промышленный стандарт IEC 61499

  • возможность повторного использования компонентов между проектами так как интерфейсы компонентов стандартизированы

Среда исполнения написана на классическом С++, что позволяет добавить нужный протокол полевой шины, работу с вводом-выводом или запустить на неподдерживаемой платформе. Например, мы успешно добавляли DBUS, CAN и работу с кастомной периферией и даже обработку видеопотоков.

При загрузке проекта на контроллер описание функциональных блоков и информация
об их связях передается в среду исполнения forte. Для загрузки функционального блока на устройство необходимо:

  • задать конфигурацию устройств

  • назначить функциональный блок на устройство

  • загрузить проект на устройство

Пример интерфейса для задания конфигурации устройств и сетей представлен ниже:

Рис. 7. Определение конфигурации устройств системы
Рис. 7. Определение конфигурации устройств системы

Для загрузки проекта на устройство в 4diac IDE необходимо выполнить команду deploy.

Рис.8. Загрузка проекта на устройство
Рис.8. Загрузка проекта на устройство

Установка среды разработки и сборка среды исполнения

Скачать и установить среду разработки Eclipse 4diac IDE можно с сайта eclipse. Для работы IDE предварительно необходимо установить java.

Скачать исходный код Eclipse 4diac forte можно из репозитория eclipse:

git clone https://git.eclipse.org/r/4diac/org.eclipse.4diac.forte

Для сборки под Windows можно выполнить команды:

cd org.eclipse.4diac.forte
mkdir build
cd build
cmake .. -DFORTE_ARCHITECTURE=Win32 -DFORTE_COM_ETH=ON -DFORTE_COM_FBDK=ON -DFORTE_COM_LOCAL=ON -DFORTE_TESTS=OFF -DFORTE_TESTS_INC_DIRS=${forte_boost_test_inc_dirs} -DFORTE_TESTS_LINK_DIRS=${forte_boost_test_inc_dirs} -DFORTE_MODULE_CONVERT=ON -DFORTE_MODULE_IEC61131=ON -DFORTE_MODULE_UTILS=ON ../../  -DFORTE_USE_STD_11=ON

Исполняемый файл будет тут build\src\Debug\forte.exe

Для сборки под Linux или другую posix совместимую операционную систему можно выполнить команды:

cd org.eclipse.4diac.forte
./setup_posix.sh

Исполняемый файл будет размещен в каталог build\posix\src\forte

После запуска на выполнение forte пытается считать проект для запуска из файла forte.fboot (которого может не быть) и ждет загрузки проекта от среды разработки. Обычно выдается следующее сообщение:

INFO: T#18446743746374136594: FORTE is up and running
INFO: T#18446743746374744094: Using provided bootfile location set in CMake: forte.fboot
INFO: T#18446743746375534594: Boot file forte.fboot could not be opened. Skipping...

В среде разработки можно просматривать значения на входе и выходе функциональных блоков во время работы программы при помощи команды watch, которую можно вызвать по правой клавише мыши.

Как я упоминал ранее, среду исполнения forte можно собрать для различных операционных системах, например, Windows, Linux, Freertos. Недавно студенты кафедры 307 Московского Авиационного Института запустили forte на Kaspersky OS CE (более детально я расскажу о процессе портации и проекте forte4kos в следующей статье).