Добрый день! Меня зовут Иван Ярцев, я — архитектор автоматизированных систем управления технологическим процессом (АСУТП) в ИТ-команде «Северстали», занимающейся разработкой компонентов для открытой АСУТП. Она хороша тем, что её можно и нужно адаптировать под себя. Мы уже рассказывали, как настроить коммуникацию (например, по протоколу Modbus), но что делать, когда встроенного функционала не хватает? Когда вам нужна уникальная логика, алгоритм или расчёт? Ответ — создавать свои функциональные блоки (ФБ). Именно этот шаг превращает вашу АСУТП из «коробочного» решения в по-настоящему гибкую систему, заточенную под ваши процессы. В этой статье, продолжая наш цикл о построении открытой АСУТП, мы на практике подробно разберём один из двух основных вариантов разработки.

Варианты разработки пользовательских функциональных блоков:

Вариант 1. Разработка композитного составного ФБ (SubApp), который состоит из стандартных блоков, входящих в среду разработки. Его преимущество в том, что его не надо собирать для среды исполнения.

Вариант 2. Разработка собственных ФБ для решения конкретной задачи. Но это потребует сборки для среды исполнения.

Разработка пользовательских блоков

Разработку пользовательских ФБ я опишу на примере блоков из библиотеки OSCAT: FIFO_32 (представляет собой буфер размером на 32 значения типа DWORD). Внутри ФБ FIFO_32 вызывается ФБ INC1 (инкрементирует значение переменной X до N-1). Используемый язык для разработки — ST (МЭК 61131-3). Для начала нам потребуется из существующих в среде разработки шаблонов выбрать шаблон ФБ «Simple FB with one algorithm» (рис. 1).

3a3fc681e8a83cb2c5218c75ca1800cbe74333373fe9eaa9258f15b8d0e0a008
Рис. 1 Создание ФБ «Simple FB with one algorithm»

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

8d6b71ab2a0e7316b4c3802369cdbe7c1620e0c8ef3f69af09ab09759a310df5
Рис. 2 Входные/выходные переменные ФБ FIFO_32
5f6761ab5819129064b3ff00a2358714b2b49a356a05680c02c120757fffdc08
Рис. 3 Внутренние переменные ФБ FIFO_32
55151900372b520dfd7c4c20a289151f5b90bb75d0e84634e8459b552f90827b
Рис. 4 Константы ФБ FIFO_32

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

bef58e8a83323429d0c7d5e587a13833b560fb096d23e98937ba5ad81d691ff4
Рис. 5 Объявление ФБ INC1

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

d1b6aa010b1ea4717ca05ed7e41af5e12a91aaea9dd4d334831532a1c09da5e0
Рис. 6 Алгоритм ФБ FIFO_32

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

8cddea85a20dd8cc50727001eeb4ed6c2425e60f1f2f1c9aeac4095cb2c356fe
Рис. 7 Алгоритм ФБ INC1

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

3bea67ba19ca78a9c694395289e7ac148828dfc8abd9e65d9c10d561921ad8f8
Рис. 8 Привязка входной событийной переменной REQ с входными переменными данных

Поскольку компилятор чувствителен к регистру букв переменной, для входных/выходных переменных я использую большие буквы, для внутренних — маленькие.  

Хочется отметить, что преобразование типов 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).

fd82604dc59e7dbf347bc9c7dbc84ede813b48a16cdf7560812656ecd3c8ed9e
Рис. 9 Создание папки «userlib»

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

6fe83bd316b642051913eea0b282b806a692b73a35db63a2eb3b11b9fdf1bf48
Рис. 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).

a3ed3e2e31abc92a9733714cbc39c1a2769670c7e818cb8b4ba649c3da59a1d4
Рис. 11  Исправленный CMakeLists.txt для сборки пользовательских ФБ

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

b321b0cafc4af688391bea5a9603e78721e2171ab6d9933ee19307074f4ede53
Рис. 12 – Измененный скрипт setup_flogic.sh

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

Далее проверяем работоспособность собранных ФБ в среде исполнения (рис. 13).

8bf70623405f317f60b1e2efaa595a3cd3473066ea44230165534fb8e87368ad
Рис 13. Блоки, запущенные в среде исполнения

Выше мы рассмотрели, как можно создавать собственные блоки в нашем продукте для решения прикладных задач. Мы выложили сборку, где собрана библиотека OSCAT для регулирования, а вам предлагаем присоединиться к этому проекту и расширить библиотеку, используя свои блоки.

Ссылки на наши продукты, доступные для скачивания, собрали ниже

Среда разработки (IDE). Исходники с вносимыми изменениями в IDE будем выкладывать по мере готовности.

Готовая сборка среды исполнения под архитектуры x86-64, arm или aarch64.

Исходные коды среды исполнения для самостоятельной сборки.

Также мы опубликовали в репозитории исходный код и конструкторскую документацию на плату Profibus master на базе микроконтроллера MIK32 Амур. Скачать исходный код можно здесь.

 P.S. 

Сила открытого ПЛК — в сообществе, которое его окружает. Мы специально открыли исходный код, чтобы к нам могли присоединиться:

  • разработчики,

  • вендоры и интеграторы,

  • преподаватели и студенты

для написания своих библиотек и компонентов, используемых при решении практических задач.

Давайте строить будущее открытой автоматизации вместе. Ждём ваших предложений и вопросов на open.soft.plc@severstal.com.

to be continued...

Комментарии (0)