
Добрый день! Меня зовут Иван Ярцев, я — архитектор автоматизированных систем управления технологическим процессом (АСУТП) в ИТ-команде «Северстали», занимающейся разработкой компонентов для открытой АСУТП. Она хороша тем, что её можно и нужно адаптировать под себя. Мы уже рассказывали, как настроить коммуникацию (например, по протоколу Modbus), но что делать, когда встроенного функционала не хватает? Когда вам нужна уникальная логика, алгоритм или расчёт? Ответ — создавать свои функциональные блоки (ФБ). Именно этот шаг превращает вашу АСУТП из «коробочного» решения в по-настоящему гибкую систему, заточенную под ваши процессы. В этой статье, продолжая наш цикл о построении открытой АСУТП, мы на практике подробно разберём один из двух основных вариантов разработки.
Варианты разработки пользовательских функциональных блоков:
Вариант 1. Разработка композитного составного ФБ (SubApp), который состоит из стандартных блоков, входящих в среду разработки. Его преимущество в том, что его не надо собирать для среды исполнения.
Вариант 2. Разработка собственных ФБ для решения конкретной задачи. Но это потребует сборки для среды исполнения.
Разработка пользовательских блоков
Разработку пользовательских ФБ я опишу на примере блоков из библиотеки OSCAT: FIFO_32 (представляет собой буфер размером на 32 значения типа DWORD). Внутри ФБ FIFO_32 вызывается ФБ INC1 (инкрементирует значение переменной X до N-1). Используемый язык для разработки — ST (МЭК 61131-3). Для начала нам потребуется из существующих в среде разработки шаблонов выбрать шаблон ФБ «Simple FB with one algorithm» (рис. 1).

В библиотеке OSCAT в коде ST объявляются все типы переменных, используемых в блоках. В 4diacIDE переменные выносятся в интерфейс ФБ (рис. 2 — рис. 4), а в коде остаётся только алгоритм.



Для того, чтобы FIFO_32 умел работать с ФБ INC1, необходимо прописать его в поле «Function blocks», после чего он будет вызываться в алгоритме.

Теперь напишем алгоритм во вкладке «Algorithm» для ФБ FIFO_32.

Не забудем и про написание алгоритма для INC1.

Входные/выходные переменные данных необходимо привязать к событийным входным/выходным переменным (рис. 8). Для этого на блоке выбираем входную событийную переменную REQ и проставляем галочки для входных переменных данных, то же самое повторяем для выходной событийной переменной CNF.

Поскольку компилятор чувствителен к регистру букв переменной, для входных/выходных переменных я использую большие буквы, для внутренних — маленькие.
Хочется отметить, что преобразование типов 4diacIDE может отличаться от принятых в OSCAT. Например, 4diac не поддерживает преобразование DWORD_TO_TIME напрямую, придётся использовать следующие преобразования: DWORD_TO_DINT → DINT_AS_STRING → STRING_AS_TIME.
После того, как мы создали оба ФБ, во-первых, необходимо их сохранить, а во-вторых, собрать их для среды исполнения.
Для сборки пользовательских ФБ есть два варианта:
использовать утилиту CMAKE;
использовать систему сборки FBE (cборка из среды исполнения будет доступна из среды разработки Flogic в следующих версиях).
Следовательно, рассмотрим сборку с помощью утилиты CMAKE.
Сборка с помощью утилиты CMAKE
Для сборки пользовательских ФБ необходимо скачать исходники со средой исполнения (тут) и произвести сборку согласно Readme.md.
Чтобы собрать пользовательские ФБ, необходимо создать в скаченных исходниках папку «userlib». Путь в исходниках — …/4diac-forte/src/modules/userlib (рис. 9).

Теперь необходимо сделать экспорт пользовательских ФБ из среды разработки в папку «userlib» (рис. 10).

Для того чтобы добавить пользовательские ФБ в сборку, необходимо поправить CMakeLists.txt в текстовом редакторе (рис. 11):
изменить строку forte_add_directory_module() → forte_add_module(userlib OFF "userlib function blocks");
удалить строку forte_add_all_sourcefiles_recursive();
добавить строки forte_add_sourcefile_hcpp(FIFO_32) и forte_add_sourcefile_hcpp(INC1).

Также необходимо с помощью текстового редактора изменить скрипт setup_flogic.sh, находящийся по пути: …/4diac-forte (рис. 12), добавив в него папку «userlib».

Далее переходим в папку: …/4diac-forte/bin/posix, открываем её в терминале и командой «make» запускаем сборку. Должны собраться только добавленные пользовательские ФБ. В нашем случае это будет ФБ FIFO_32 и INC1.
Далее проверяем работоспособность собранных ФБ в среде исполнения (рис. 13).

Выше мы рассмотрели, как можно создавать собственные блоки в нашем продукте для решения прикладных задач. Мы выложили сборку, где собрана библиотека OSCAT для регулирования, а вам предлагаем присоединиться к этому проекту и расширить библиотеку, используя свои блоки.
Ссылки на наши продукты, доступные для скачивания, собрали ниже
Среда разработки (IDE). Исходники с вносимыми изменениями в IDE будем выкладывать по мере готовности.
Готовая сборка среды исполнения под архитектуры x86-64, arm или aarch64.
Исходные коды среды исполнения для самостоятельной сборки.
Также мы опубликовали в репозитории исходный код и конструкторскую документацию на плату Profibus master на базе микроконтроллера MIK32 Амур. Скачать исходный код можно здесь.
P.S.
Сила открытого ПЛК — в сообществе, которое его окружает. Мы специально открыли исходный код, чтобы к нам могли присоединиться:
разработчики,
вендоры и интеграторы,
преподаватели и студенты
для написания своих библиотек и компонентов, используемых при решении практических задач.
Давайте строить будущее открытой автоматизации вместе. Ждём ваших предложений и вопросов на open.soft.plc@severstal.com.
to be continued...