Добрый день! Меня зовут Евгений Ионенко, я — руководитель направления в ИТ-команде «Северстали», занимающейся разработкой компонентов для открытой автоматизированной системы управления технологическим процессом (АСУТП). В марте этого года мы начали выпуск статей, посвящённых разработке компонентов открытой АСУТП, с предыдущей статьёй этого цикла можно ознакомиться здесь: Статья №3.
В этой статье я расскажу, как настраивать плагин протокола Modbus TCP/RTU Master/Slave на примере небольшого проекта.
Как говорилось в предыдущей статье, для работы с различными протоколами наша команда разработала отдельные плагины.
Используемые плагины для реализации протокола Modbus (TCP и RTU):
Master — MBUSPlugin;
Slave — MSLAVEPlugin.
Реализация этих плагинов представлена обобщёнными функциональными блоками (ФБ) GEN_MBUS и GEN_MSLAVE, что предполагает возможность динамического переопределения количества и типов ввода/вывода (ФБ Ix/Qx). Для изменения количества подключаемых входов/выходов достаточно в редакторе типа элементов добавить их нужное количество и переименовать экземпляр ФБ следующим образом: MBUS_n_rtu или MBUS_n_tcp, где n — максимальное количество входов/выходов. Например, для 8 входов/выходов название ФБ MBUS_RTU должно выглядеть так: MBUS_8_rtu.
Несколько идентичных ФБ работают с собственной копией контроллера, но с одним общим плагином:

В исходной версии 4diac IDE работа с протоколами Modbus TCP/RTU реализована через стандартные блоки CLIENT и требует указания достаточно большого количества параметров в одной строке. Например, вот так выглядит строка настройки Modbus RTU для чтения регистров hold c 64025 по 64028:
[rtu:/dev/ttyUSB0:19200:N:8:1::1:2000:h64025..64028:].
Для того, чтобы упростить работу с протоколами и расширить функциональность, мы разработали свои ФБ с адаптером протокола через CAPI: MBUS_rtu, MBUS_tcp, MSLAVE_tcp и MSLAVE_tcp.
Дальше рассмотрим настройку каждого из плагинов.
Плагин Modbus TCP/RTU Master
Плагин протокола Modbus TCP/RTU Master базируется на обобщённой архитектуре, которая предполагает возможность динамического переопределения набора входов и выходов для данных без перекомпиляции ядра исполнения. Также этот ФБ позволяет группировать ввод/вывод по шине: создаются две основные группы, одна — для ввода, другая — для вывода. Эти группы читаются или записываются по Modbus с указанным периодом или частотой.
Интерфейсы ФБ Modbus TCP Master и Modbus RTU Master полностью идентичны и имеют следующий вид:

ФБ имеют следующие входы:
вход события MAP;
-
входы данных:
QI разрешает маппинг;
PARAMS — общие данные для всех входов/выходов, в нём необходимо задать параметры Modbus RTU или Modbus TCP соединения в JSON‑формате;
IO(n) — соединения для Qx, Ix функциональных блоков, n — максимальное количество входов/выходов.
Инициализация ФБ происходит по приходу события на вход MAP. При этот момент вход QI также должен быть установлен в "true", это разрешает исполнение ФБ.
ФБ имеет следующие выходы:
-
Событийные выходы:
MAPO — готовность маппирования, может использоваться для инициализации Ix, Qx функциональных блоков;
IND — событие появления данных.
Выходы данных QO и STATUS используются для событий и статуса общего характера.
Конфигурирование плагинов
Функционирование плагина определяется параметрами функциональных блоков ввода/вывода (Ix/Qx). Плагин агрегирует все параметры вместе с PARAMS самого MBUS-блока, а для заполнения строки PARAMS использует следующие JSON-параметры:
MBUS_8_rtu |
MBUS_8_tcp |
device — устройство, через которое осуществляется работа Modbus RTU, например, /dev/ttyS9; baud — скорость передачи данных; parity — чётность. bits — количество битов информации в пакете: 5, 6, 7, 8; stops — количество стоп‑битов: 1-2; bps — объединение parity/bits/stops в краткой нотации, например, 8N1; id — адрес устройства: 1-255; update — частота обновления: число с суффиксом ms или mks (по умолчанию mks); addr — адрес, может иметь префикс: delay — откладывание момента старта на некоторое количество mks, ms, s. |
host — ip‑адрес хоста для TCP, может включать номер порта после двоеточия; port — отдельное задание порта; update — частота обновления, число с суффиксом ms, mks (по умолчанию mks); addr — адрес, может иметь префикс: delay — откладывание момента старта на некоторое количество mks, ms, s. |
Пример: |
Пример: |
Покажу пример, как выглядит применение ФБ MBUS_8_tcp на холсте. Обращу ваше внимание на то, как используются ФБ QX и QD: через них идет запись значения «True» в регистры «с10» и «h12» — «True» (с и h — префиксы). IP‑adress устройства — 127.0.01, номер порта — 1502.

Плагин Modbus TCP/RTU Slave
Плагин для Modbus Slave обеспечивает выполнение как команд со стороны ядра исполнения, так и команд со стороны Modbus. Для этого на стороне плагина имеется Modbus-память. Любые операции протокола Modbus работают исключительно с этой памятью, которая представляет Coil, Discrete Inputs, Input Registers и Holding-регистры по 64K.
Всё Modbus-пространство доступно как для чтения, так и для записи для подключённых к плагину MSLAVE элементов Ix/Qx.
MSLAVE реализует внутри Modbus‑пространство — 4 диапазона адресов по 64К на каждый вид Modbus адресации (регистры флагов (Coils), дискретные входы (Discrete Inputs), регистры ввода (Input Registers), регистры хранения (Holding Registers)). Например, если в программе 4diac определены два IB блока IB1 с param = c1 и IB2 с param = c3, то между ними будет 6 бит пересечения (они будут читаться и в первом и во втором блоке), т. к. каждый IB-блок в данном случае определяет 8 битовых регистров. Поэтому при записи в любой из этих Coil‑ов, например, c5, будут изменения на выходе обоих блоков.

ФБ MSLAVE имеют следующие отличия от MBUS-блоков по настройке:
нет никаких групп, все IO‑блоки работают независимо;
PARAMS‑блока MSLAVE задаёт внешние параметры для Modbus;
PARAMS IO‑блоков задают только адрес в Modbus‑пространстве;
всё управление выполняется по событиям, update и delay параметры не поддерживаются.
Интерфейсы функциональных блоков для Slave TCP/RTU идентичны.

Плагин конфигурируется исключительно параметром PARAMS самого блока и используется только для задания Modbus-компонента:
host — адрес IP-хоста для TCP, может включать порт после двоеточия;
port — отдельное задание порта;
id — Slave ID 1-255.
Например: '{"host":"127.0.0.1:1502", "id":"1"}'
Покажу, как выглядит ФБ MSLAVE_8_tcp на холсте. В этом примере на стороне Slave добавляются два регистра в ФБ ID и IX: h12 и с10, в которые пишутся данные.

Дальше рассмотрим совместную работу плагинов Modbus Slave и Master. В нашем примере ФБ MBUS_8_tcp Master пишет «TRUE» в регистр «с10» ФБ QX, ФБ MSLAVE_8_tcp читает регистр «h12» ФБ ID и регистр «с10» ФБ IX, затем исполняется ФБ E_PERMIT и следом — ФБ FB_RANDOM. Этот блок генерирует случайное значение, которое записывает MBUS_8_tcp Master в регистр «h12» ФБ QD. Вся вышеописанная логика исполняется в ФБ E_CYCLE с периодом 500 мс.

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

Видим, что приложение работает, как и было запланировано. Сгенерированные значения передаются и считываются в указанных регистрах.
В примере я показал то, как выглядит сейчас работа на холсте с настройкой плагинов протоколов. Это похоже на россыпь функциональных блоков, что, на самом деле, неудобно. Поэтому в рамках работ по написанию cреды разработки мы учтём этот момент и сделаем мастер настройки протоколов, который будет генерировать уже нужный функциональный блок со всеми ФБ типов ввода/вывода. Вот несколько макетов из мастера настройки, где видна разница между тем, что есть, и тем, что мы планируем доработать.

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

Если есть желание проверить самостоятельно, как работает плагин протоколов, скачивайте:
P.S.
В дальнейшем мы расширим библиотеку ФБ для работы с модулями ввода-вывода серии Мх210 компании «ОВЕН».
Напоминаем, что открытый программный программируемый логический контроллер (ОП ПЛК) будет иметь открытый исходный код, и мы приглашаем к совместной работе в этом проекте:
разработчиков,
вендоров,
интеграторов,
преподавателей и студентов вузов,
для написания своих библиотек и компонентов, используемых при решении практических задач. Смело пишите на почту open.soft.plc@severstal.com.
В следующих публикациях в серии статей по разработке ОП ПЛК рассмотрим следующие темы: портирование библиотек OSCAT, добавление собственных ФБ, подключение проприетарных плагинов через CAPI (на примере шины), новый функционал в среде исполнения и разработки и ещё много интересного.
to be continued...
sokolovps
Коллеги, размер заглавной картинки отображается при заливке. В ТЗ дизайнеру прописывается за 5 секунд. Ну, камон:) Теперь из-за такой фигни хорошая статья ни фига не наберет...