Modbus

Узлы Modbus связывают программу зала с оборудованием, которое работает по Modbus TCP (по сети) или Modbus RTU и ASCII (по последовательной линии). Это датчики температуры и освещённости, реле и модули ввода-вывода, климатические контроллеры. Контроллер опрашивает устройство, показывает значение на панели и по кнопке панели записывает в устройство команду.

Как открыть окно узла и где найти справку — на странице «Узлы U-Logic». Подписи полей даны так, как они показаны в окне: у узлов Modbus они английские. Адреса и протоколы узлов задаются в программе; порты исходящих подключений к оборудованию — на странице «Сетевые порты и протоколы».

Подключение к устройству

Подключение настраивается один раз и общее для всех привязанных к нему узлов Modbus. В окне любого узла рядом с полем «Server» нажмите кнопку с карандашом (или «+» для нового подключения): откроется окно «Добавить новый конфиг узел modbus-client». Узлы обращаются к устройству через это подключение по очереди: запросы всех узлов встают в общую очередь.

Окно разбито на вкладки Settings, Queues и Optionals. Главное — на первой.

../../_images/node-modbus-client.png

Окно подключения Modbus, вкладка Settings (Type — TCP): 1 — Type, 2 — Host, 3 — Port, 4 — TCP Type, 5 — Unit-Id, 6 — Timeout (ms)

№

Поле

Что значит

—

Имя

подпись подключения в списке

1

Type

TCP — устройство в сети; Serial и Serial Expert — устройство на последовательной линии (в Serial Expert доступны также Data Bits, Stop Bits, Parity и Connection delay)

2

Host

для TCP: адрес устройства или шлюза

3

Port

для TCP: порт устройства или шлюза (в окне по умолчанию 502)

4

TCP Type

для TCP: DEFAULT — обычный Modbus TCP; RTU-BUFFERED — для шлюзов, которые передают кадры RTU по сети; TELNET и C701 нужны только для особых шлюзов, без указаний изготовителя их не меняйте

—

Serial port, Baud rate

для Serial: порт последовательной связи и скорость; значения возьмите из паспорта устройства

—

Serial type

для Serial: RTU-BUFFERD, RTU или ASCII

5

Unit-Id

номер устройства на линии или за шлюзом; по умолчанию 1. Если в узле поле Unit-Id оставить пустым, узел использует это значение

6

Timeout (ms)

сколько ждать ответа; по умолчанию 1000

—

Reconnect on timeout, Reconnect timeout (ms)

переподключаться ли после тайм-аута и через сколько; по умолчанию 2000

На вкладке Queues: Queue commands (ставить запросы в очередь), Queue delay (ms) (пауза между запросами) и UnitId’s in parallel queues (параллельные очереди для разных Unit-Id; по умолчанию включено, для последовательной линии без шлюза выключите). На вкладке Optionals — журналы подключения; для начала работы их не трогайте.

Адрес, порт, Unit-Id и скорость возьмите из описания устройства или у интегратора. При неверном значении любого из них результат один: ответа нет.

Пример: температура зала на панели

Зачем. Показать на панели зала текущую температуру с датчика Modbus. Цепочка: Modbus - Read → change → api - helper - 2 → UI - Panel out.

  1. Перетащите на рабочую область Modbus - Read. Откройте его двойным щелчком.

  2. Рядом с «Server» создайте подключение, как описано выше: Type — TCP, Host — адрес вашего датчика, Port и Unit-Id — по описанию датчика. Нажмите «Добавить».

  3. Заполните узел:

    Поле

    Значение в примере

    FC

    FC 3: Read Holding Registers (если в описании датчика значение лежит во входных регистрах — FC 4: Read Input Registers)

    Address

    адрес регистра с температурой из описания датчика; допустимы числа от 0 до 65535

    Quantity

    1 — сколько регистров прочитать подряд

    Poll Rate

    5, единица — second(s)

    Нажмите «Готово». В поле «Имя» можно вписать «Температура зала».

  4. Подключите к первому выходу Modbus - Read узел change. Правило: установить msg.topic с типом «выражение»:

    {"Fp_Temp_lb": $string(payload[0] / 10) & " °C"}
    

    Первый выход отдаёт в msg.payload список прочитанных значений, поэтому нужное число — payload[0]. Деление на 10 — для датчика, который передаёт температуру в десятых долях градуса. Масштаб и знак значения смотрите в описании вашего датчика. Fp_Temp_lb замените именем своей надписи в интерфейсе.

  5. Подключите change к api - helper - 2: «Интерфейс (UI)» — ваш интерфейс, «Тип сообщения» — uiState, «Источник входных данных» — msg.topic, в «Объектах управления» добавьте надпись Fp_Temp_lb с событием «Текст». Как устроен этот узел и как выбрать элемент — на странице «Изменение вида на панели».

  6. Выход api - helper - 2 подключите к UI - Panel out (если на вкладке его ещё нет, перетащите). Нажмите «Развернуть».

../../_images/flow-modbus-temperature.png

Цепочка примера: Modbus - Read «Температура зала» → change «Значение → надпись» → api - helper - 2 «Надпись температуры» → UI - Panel out; к первому выходу Modbus - Read подключён также debug «Что прочитал»

Что увидите. Раз в 5 секунд узел опрашивает датчик, и надпись на панели показывает значение вида 22.5 °C. Чтобы убедиться, что опрос идёт, подключите к первому выходу Modbus - Read узел debug («весь msg объект сообщения»): в payload будет список из одного числа.

Частые ошибки:

  • Надпись не меняется, в отладке пусто: чаще всего неверный Host, Port или Unit-Id в подключении либо датчик недоступен из сети контроллера.

  • Приходит не то число или ноль: функция не соответствует типу регистра (Holding вместо Input или наоборот) либо адрес сдвинут на единицу. В окне адрес вводится числом от 0 до 65535; если в описании датчика адрес записан иначе, пересчитайте его.

  • Второй выход Modbus - Read отдаёт ответ устройства «как есть» (сырой буфер) — для показа значений его не используйте.

  • Слишком частый опрос (малый Poll Rate при многих узлах на одном подключении) забивает общую очередь запросов: увеличьте период.

Запись значения по кнопке панели

Зачем. Включить реле или записать значение в регистр, когда в зале нажали кнопку. Цепочка: UI - Panel in → ui - switch → два change → Modbus - Write.

  1. Соедините UI - Panel in с ui - switch (если UI - Panel in на вкладке уже есть, подключитесь к нему). В ui - switch первое правило — кнопка «включить» с событием push; второе правило — кнопка «выключить» с событием push (или событие release кнопки «включить», если реле должно работать, пока кнопку держат). Как принимать события панели — на странице «Приём событий».

  2. К первому выходу подключите change: установить msg.payload — число 1. Ко второму — отдельный change с msg.payload — число 0. Одно правило change не подойдёт: второе правило того же узла затёрло бы первое.

  3. Оба change подключите к одному Modbus - Write: «Server» — то же подключение, что и в примере выше; FC — FC 5: Force Single Coil (одно реле); Address — адрес реле из описания устройства. При FC 5 поля «Quantity» в окне нет.

../../_images/flow-modbus-write.png

Цепочка примера: UI - Panel in → ui - switch «Кнопки реле» → два change «Включить: 1» и «Выключить: 0» → Modbus - Write «Реле зала»

Что увидите. После нажатия кнопки «включить» реле включается, после «выключить» — выключается. Проверьте это на самом устройстве или прочитайте то же значение узлом Modbus - Read.

Какую функцию выбрать и что подать в msg.payload:

FC

Что записывает

Что в msg.payload

FC 5: Force Single Coil

одно реле

1 или 0 (также true или false)

FC 6: Preset Single Register

один регистр

число от 0 до 65535

FC 15: Force Multiple Coils

несколько реле

список из true и false

FC 16: Preset Multiple Registers

несколько регистров

список чисел от 0 до 65535

Предупреждение

Запись меняет состояние реального оборудования. Проверяйте адрес и значение по описанию устройства и не пробуйте запись «наугад» на включённом оборудовании.

Все узлы Modbus

В палитре 12 узлов Modbus. Для большинства задач достаточно Modbus - Read и Modbus - Write; остальные нужны, когда параметры запроса приходят в сообщении или нужна диагностика. Таблица — обзор; у каждого узла ниже свой раздел.

Узел

Вход / выход

Что делает

Чем отличается; ключевые поля

Modbus - Read

0 / 2

читает регистры сам, по таймеру

Unit-Id, FC (FC 1–FC 4), Address, Quantity, Poll Rate, Server; выход 1 — значения, выход 2 — ответ устройства «как есть»

Modbus - Getter

1 / 2

читает по входящему сообщению

те же поля, но без Poll Rate: опрос запускает любое сообщение на входе (например, кнопка или inject)

Modbus - Flex - Getter

1 / 2

читает, параметры берёт из сообщения

в окне Server и «Delay to activate input»; Unit-Id, функция, адрес и количество приходят в msg.payload (unitid, fc, address, quantity)

Modbus - Write

1 / 2

записывает значение из msg.payload

Unit-Id, FC (FC 5, FC 6, FC 15, FC 16), Address, Server; Quantity (при FC 5 в окне нет)

Modbus - Flex - Write

1 / 2

записывает, параметры берёт из сообщения

в окне Server и «Delay to activate input»; в msg.payload: unitid, fc, address, quantity, value

Modbus - Flex - Sequencer

1 / 2

выполняет серию запросов по списку

Server и список операций: Name, Function, Unit ID, Address, Quantity; список можно подменить сообщением

Modbus - Flex - FC

1 / 1

запрос с нестандартным кодом функции

Name, Unit ID, Server, Path to Map JSON, Select FC Map, Request Map Editor, Response Map Editor; для редких устройств

Modbus - Flex - Connector

1 / 1

меняет параметры подключения «на лету»

Server, Empty Message on Modbus failure, Config msg on Modbus-Change, Show Activities, Show Errors; новые параметры (tcpHost, tcpPort, unitId) приходят в msg.payload

Modbus - Queue - Info

1 / 1

следит за очередью запросов

Unit-Id, Interval Time, уровни Low low level, Low level, High level, High high level, Server

Modbus - Response

1 / 0

показывает ответ в состоянии узла

Name, Register Max.; для диагностики

Modbus - Response - Filter

1 / 1

выбирает значения из ответа по описанию регистров (IO-файлу)

Filter, Registers, IO-File, Filter Response Buffer, Filter Values, Filter Input; для начала работы не нужен

Modbus - Server

1 / 5

тестовый сервер Modbus TCP со своей памятью

Hostname, Port, Coils, Holdings, Inputs, Discretes, Show Activities, Show Errors, Logging; только для проверки и отладки, не для работы с оборудованием

У узлов с двумя выходами первый выход отдаёт данные (у чтения — прочитанные значения, у записи — записанные), а второй — ответ устройства «как есть».

Во всех узлах с полем «Server» выбирается подключение к устройству: оно общее, его настройка описана выше. Вкладка Optionals в окнах узлов — журнал и состояние узла (поля «Show Activities», «Show Errors», «Show Warnings» и другие); для начала работы её не трогайте.

Modbus - Read

Вход / выход: 0 / 2. Сам опрашивает устройство по таймеру и отдаёт прочитанное: на первом выходе — список значений, на втором — ответ устройства «как есть». Это основной узел для показа значений на панели: он использован в примере «Температура зала на панели».

../../_images/node-modbus-read.png

Окно узла Modbus - Read: 1 — «Server», 2 — «Unit-Id», 3 — «FC», 4 — «Address», 5 — «Quantity», 6 — «Poll Rate»

Ключевые поля окна:

  1. «Server» — подключение к устройству.

  2. «Unit-Id» — номер устройства на линии; если оставить пустым, берётся значение из подключения.

  3. «FC» — что читать: FC 1: Read Coil Status, FC 2: Read Input Status, FC 3: Read Holding Registers или FC 4: Read Input Registers.

  4. «Address» — адрес первого регистра, число от 0 до 65535.

  5. «Quantity» — сколько регистров или битов прочитать подряд.

  6. «Poll Rate» — как часто опрашивать, и единица: millisecond(s), second(s), minute(s) или hour(s).

Ещё в окне: «Имя», «Тема», «Allow oversized messages» и «Delay to activate input» (при этой отметке появляется поле «Delay Time»). Вкладка Optionals: «Empty msg on Modbus fail», «Show Activities», «Show Errors», «Show Warnings», «Using IO-File».

Modbus - Getter

Вход / выход: 1 / 2. Читает те же данные, что Modbus - Read, но не по таймеру, а когда на вход пришло любое сообщение — например, от кнопки или от inject. Выходы те же: значения и ответ устройства «как есть».

../../_images/node-modbus-getter.png

Окно узла Modbus - Getter: 1 — «Server», 2 — «Unit-Id», 3 — «FC», 4 — «Address», 5 — «Quantity»

Ключевые поля окна:

  1. «Server» — подключение к устройству.

  2. «Unit-Id» — номер устройства; пусто — из подключения.

  3. «FC» — функция чтения (FC 1–FC 4).

  4. «Address» — адрес первого регистра.

  5. «Quantity» — сколько прочитать.

От Modbus - Read отличается тем, что нет «Poll Rate» и «Тема». Ещё в окне: «Имя», «Allow oversized messages» и «Delay to activate input» (при этой отметке появляется «Delay Time»). На вкладке Optionals есть также «Keep Msg Properties».

Modbus - Flex - Getter

Вход / выход: 1 / 2. Читает, но параметры запроса берёт не из окна, а из входящего сообщения. Подходит, когда адрес или номер устройства становятся известны во время работы программы.

../../_images/node-modbus-flex-getter.png

Окно узла Modbus - Flex - Getter: 1 — «Server», 2 — «Delay to activate input»

Ключевые поля окна:

  1. «Server» — подключение к устройству.

  2. «Delay to activate input» — отметка задержки перед тем, как узел начнёт принимать сообщения; после отметки появляется поле «Delay Time».

Ещё в окне: «Имя» и «Allow oversized messages». Параметры запроса приходят в msg.payload: unitid, fc, address, quantity.

Modbus - Write

Вход / выход: 1 / 2. Записывает в устройство значение из msg.payload: включает реле, пишет число в регистр. Использован в примере «Запись значения по кнопке панели»; что подавать в msg.payload для каждой функции — в таблице этого примера.

../../_images/node-modbus-write.png

Окно узла Modbus - Write (FC по умолчанию): 1 — «Server», 2 — «Unit-Id», 3 — «FC», 4 — «Address»

Ключевые поля окна:

  1. «Server» — подключение к устройству.

  2. «Unit-Id» — номер устройства; пусто — из подключения.

  3. «FC» — что записывать: FC 5: Force Single Coil, FC 6: Preset Single Register, FC 15: Force Multiple Coils или FC 16: Preset Multiple Registers.

  4. «Address» — адрес реле или регистра.

Поле «Quantity» — сколько записать — для FC 5 в окне не показывается: записывается одно реле. Для FC 15 и FC 16 укажите количество в «Quantity». Ещё в окне: «Name» и «Delay to activate input».

Первый выход отдаёт записанное, второй — ответ устройства «как есть». На вкладке Optionals есть «Negative UInt» и «Keep Msg Properties».

Modbus - Flex - Write

Вход / выход: 1 / 2. Записывает, а все параметры запроса берёт из входящего сообщения.

../../_images/node-modbus-flex-write.png

Окно узла Modbus - Flex - Write: 1 — «Server», 2 — «Delay to activate input»

Ключевые поля окна:

  1. «Server» — подключение к устройству.

  2. «Delay to activate input» — отметка задержки перед началом приёма сообщений; после отметки появляется поле «Delay Time».

Параметры приходят в msg.payload: unitid, fc (5, 6, 15 или 16), address, quantity, value.

Modbus - Flex - Sequencer

Вход / выход: 1 / 2. Выполняет серию запросов по списку: за одно сообщение — несколько операций подряд. Нужен, когда с одного устройства снимают разные группы регистров.

../../_images/node-modbus-flex-sequencer.png

Окно узла Modbus - Flex - Sequencer с одной заполненной операцией: 1 — «Server», 2 — «Name», 3 — «Function», 4 — «Unit ID», 5 — «Address», 6 — «Quantity»

Ключевые поля окна:

  1. «Server» — подключение к устройству.

  2. «Name» — подпись операции в списке; операции выполняются по порядку списка.

  3. «Function» — код функции (по умолчанию FC 1: Read Coil Status).

  4. «Unit ID» — номер устройства.

  5. «Address» — адрес.

  6. «Quantity» — количество.

Ещё в окне — отметка «Delay to activate input».

Список операций можно подменить сообщением: он приходит в msg.sequences.

Modbus - Flex - FC

Вход / выход: 1 / 1. Отправляет запрос с нестандартным кодом функции, который описан в «карте» функций. Нужен для редких устройств; с обычными устройствами используйте Modbus - Read и Modbus - Write.

../../_images/node-modbus-flex-fc.png

Окно узла Modbus - Flex - FC: 1 — «Server», 2 — «Path to Map JSON», 3 — «Select FC Map», 4 — «Request Map Editor», 5 — «Response Map Editor» (нижний редактор виден не полностью)

Ключевые поля окна:

  1. «Server» — подключение к устройству.

  2. «Path to Map JSON» — путь к файлу карты.

  3. «Select FC Map» — выбор функции из карты.

  4. «Request Map Editor» — описание запроса.

  5. «Response Map Editor» — описание ответа.

Ещё в окне: «Name» и обязательное поле «Unit ID». Содержимое карты возьмите из документации изготовителя устройства.

Modbus - Flex - Connector

Вход / выход: 1 / 1. Меняет параметры подключения «на лету»: новые адрес, порт и номер устройства приходят в сообщении. Нужен, когда одной программе приходится обслуживать то одно, то другое устройство.

../../_images/node-modbus-flex-connector.png

Окно узла Modbus - Flex - Connector: 1 — «Server», 2 — «Empty Message on Modbus failure», 3 — «Config msg on Modbus-Change», 4 — «Show Activities», 5 — «Show Errors»

Ключевые поля окна:

  1. «Server» — подключение, которое меняется.

  2. «Empty Message on Modbus failure» — при ошибке Modbus отправлять пустое сообщение.

  3. «Config msg on Modbus-Change» — после смены параметров подключения отправлять сообщение с применённой конфигурацией.

  4. «Show Activities» — показывать действия в состоянии узла.

  5. «Show Errors» — показывать ошибки в состоянии узла.

Новые параметры приходят в msg.payload: tcpHost, tcpPort, unitId. Подключение общее для всех узлов, которые к нему привязаны: меняя его, вы меняете их всех.

Modbus - Queue - Info

Вход / выход: 1 / 1. Следит за очередью запросов подключения и сообщает, когда она выходит за заданные уровни. Нужен для диагностики, если опрос «тормозит».

../../_images/node-modbus-queue-info.png

Окно узла Modbus - Queue - Info: 1 — «Server», 2 — «Unit-Id», 3 — «Interval Time», 4 — нижние уровни («Low low level», «Low level»), 5 — верхние уровни («High level», «High high level»)

Ключевые поля окна:

  1. «Server» — подключение, чью очередь смотреть.

  2. «Unit-Id» — номер устройства.

  3. «Interval Time» — как часто проверять очередь.

  4. «Low low level» и «Low level» — нижние уровни.

  5. «High level» и «High high level» — верхние уровни.

Ещё в окне: «Error on high level», «Show All Updates» и «All Queues».

Modbus - Response

Вход / выход: 1 / 0. Показывает ответ устройства в состоянии узла (под узлом на вкладке). Выходов нет. Нужен для диагностики; подключается к выходу чтения или записи.

../../_images/node-modbus-response.png

Окно узла Modbus - Response: 1 — «Имя», 2 — «Register Max.»

Ключевые поля окна:

  1. «Имя» — подпись на вкладке.

  2. «Register Max.» — предел числа регистров для показа.

Modbus - Response - Filter

Вход / выход: 1 / 1. Выбирает значения из ответа по описанию регистров (IO-файлу). Для начала работы не нужен: нужное число проще взять из msg.payload узлом change.

../../_images/node-modbus-response-filter.png

Окно узла Modbus - Response - Filter: 1 — «Filter» (ниже «Registers»), 2 — «IO-File», 3 — «Filter Response Buffer» (ниже «Filter Values» и «Filter Input»)

Ключевые поля окна:

  1. «Filter» (со строкой поиска) и «Registers» — что отбирать из ответа.

  2. «IO-File» — описание регистров.

  3. «Filter Response Buffer», «Filter Values», «Filter Input» — какую часть ответа фильтровать.

Modbus - Server

Вход / выход: 1 / 5. Тестовый сервер Modbus TCP со своей памятью. С ним можно проверить узлы чтения и записи, когда реального устройства под рукой нет. Для работы с оборудованием не используйте.

../../_images/node-modbus-server.png

Окно узла Modbus - Server: 1 — «Hostname», 2 — «Port», 3 — «Coils» (ниже «Holdings», «Inputs», «Discretes»), 4 — «Logging»

Ключевые поля окна:

  1. «Hostname» — адрес, на котором работает тестовый сервер.

  2. «Port» — порт тестового сервера.

  3. «Coils», «Holdings», «Inputs», «Discretes» — размер памяти сервера по типам (в окне по умолчанию 10000).

  4. «Logging» — журнал обращений.

Ещё в окне: «Имя», «Show Activities» и «Show Errors».

Все поля узлов — во встроенной справке: откройте вкладку «справка» боковой панели (значок книги) и выберите узел.