Добрый день! Меня зовут Евгений Ионенко, я — руководитель направления в ИТ-команде «Северстали», занимающейся разработкой компонентов для открытой автоматизированной системы управления технологическим процессом (АСУТП). В марте этого года мы начали выпуск статей, посвящённых разработке компонентов открытой АСУТП, с предыдущей статьёй этого цикла можно ознакомиться здесь: Статья №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.

Несколько идентичных ФБ работают с собственной копией контроллера, но с одним общим плагином:

Работа с плагином MBUSPlugin или MSLAVEPlugin
Работа с плагином MBUSPlugin или MSLAVEPlugin

В исходной версии 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 полностью идентичны и имеют следующий вид:

Блок MBUS_8_rtu и MBUS_8_tcp
Блок MBUS_8_rtu и MBUS_8_tcp

ФБ имеют следующие входы:

  • вход события 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 — чётность.
N (No parity) — без бита проверки,
E (Even parity) — с битом проверки на чётность,
O (Odd parity) — с битом проверки на нечётность;

bits — количество битов информации в пакете: 5, 6, 7, 8;

stops — количество стоп‑битов: 1-2;

bps — объединение parity/bits/stops в краткой нотации, например, 8N1;

id — адрес устройства: 1-255;

update — частота обновления: число с суффиксом ms или mks (по умолчанию mks);

addr — адрес, может иметь префикс:
c или C — Сoil,
d или D — DiscreteInput,
h или H — HoldingRegister,
i или I — InputRegister;

delay — откладывание момента старта на некоторое количество mks, ms, s.

host — ip‑адрес хоста для TCP, может включать номер порта после двоеточия;

port — отдельное задание порта;

update — частота обновления, число с суффиксом ms, mks (по умолчанию mks);

addr — адрес, может иметь префикс:
c или C — Сoil,
d или D — DiscreteInput,
h или H — HoldingRegister,
i или I — InputRegister;

delay — откладывание момента старта на некоторое количество mks, ms, s.

Пример:
 '{"id":1, "device":"/dev/ttyS9", "baud":460800, "bps":"8N1","update":"500ms"}'.

Пример:
'{"host":"127.0.0.1:1502", "update":"500ms", "id":"1"}'.

Покажу пример, как выглядит применение ФБ MBUS_8_tcp на холсте. Обращу ваше внимание на то, как используются ФБ QX и QD: через них идет запись значения «True» в регистры «с10» и «h12» — «True» (с и h — префиксы). IP‑adress устройства — 127.0.01, номер порта — 1502.

Пример применения ФБ MBUS_8_tcp на холсте
Пример применения ФБ MBUS_8_tcp на холсте

Плагин 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, будут изменения на выходе обоих блоков.

Архитектура адаптера для Modbus Slave
Архитектура адаптера для Modbus Slave

ФБ MSLAVE имеют следующие отличия от MBUS-блоков по настройке:

  • нет никаких групп, все IO‑блоки работают независимо;

  • PARAMS‑блока MSLAVE задаёт внешние параметры для Modbus;

  • PARAMS IO‑блоков задают только адрес в Modbus‑пространстве;

  • всё управление выполняется по событиям, update и delay параметры не поддерживаются.

Интерфейсы функциональных блоков для Slave TCP/RTU идентичны.

Блок MSlave_8_rtu и MSlave_8_tcp
Блок MSlave_8_rtu и MSlave_8_tcp

Плагин конфигурируется исключительно параметром 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 TCP Slave на холсте
Пример применения ФБ  Modbus TCP Slave на холсте

Дальше рассмотрим совместную работу плагинов 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 мс.

Пример приложения на холсте с ФБ Modbus TCP Slave и Modbus TCP Master 
Пример приложения на холсте с ФБ Modbus TCP Slave и Modbus TCP Master 

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

Пример приложения, демонстрирующего работу Modbus TCP Slave и Modbus TCP Master
Пример приложения, демонстрирующего работу Modbus TCP Slave и Modbus TCP Master

Видим, что приложение работает, как и было запланировано. Сгенерированные значения передаются и считываются в указанных регистрах.

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

Экранные формы мастера настройки Modbus TCP Master
Экранные формы мастера настройки Modbus TCP Master

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

Пример готового функционального блока
Пример готового функционального блока

Если есть желание проверить самостоятельно, как работает плагин протоколов, скачивайте:

P.S. 

В дальнейшем мы расширим библиотеку ФБ для работы с модулями ввода-вывода серии Мх210 компании «ОВЕН».

Напоминаем, что открытый программный программируемый логический контроллер (ОП ПЛК) будет иметь открытый исходный код, и мы приглашаем к совместной работе в этом проекте:

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

  • вендоров,

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

  • преподавателей и студентов вузов,

для написания своих библиотек и компонентов, используемых при решении практических задач. Смело пишите на почту open.soft.plc@severstal.com.

В следующих публикациях в серии статей по разработке ОП ПЛК рассмотрим следующие темы: портирование библиотек OSCAT, добавление собственных ФБ, подключение проприетарных плагинов через CAPI (на примере шины), новый функционал в среде исполнения и разработки и ещё много интересного.

to be continued...

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


  1. sokolovps
    17.09.2025 17:58

    Коллеги, размер заглавной картинки отображается при заливке. В ТЗ дизайнеру прописывается за 5 секунд. Ну, камон:) Теперь из-за такой фигни хорошая статья ни фига не наберет...