Протокол Modbus TCP в Eclipse 4diac
Modbus TCP — один из наиболее распространённых промышленных протоколов для интеграции с ПЛК, частотными преобразователями, умными счётчиками и датчиками.
Модель данных Modbus
| Тип регистра | Адрес | Доступ | Описание |
|---|---|---|---|
| Coils (0x) | 0–65535 | Чтение/Запись | Дискретные выходы (1 бит) |
| Discrete Inputs (1x) | 0–65535 | Только чтение | Дискретные входы (1 бит) |
| Input Registers (3x) | 0–65535 | Только чтение | Аналоговые входы (16 бит) |
| Holding Registers (4x) | 0–65535 | Чтение/Запись | Основные регистры данных (16 бит) |
Подготовка FORTE
Соберите FORTE с поддержкой Modbus:
cmake .. \
-DFORTE_ARCHITECTURE=Posix \
-DFORTE_COM_MODBUS=ON
make -j$(nproc)
Чтение данных (Modbus Master/Client)
Формат строки ID для Modbus:
modbus[ip:port,unit_id,function_code,start_address,quantity]
Коды функций:
| Код | Назначение |
|---|---|
| 1 | Чтение Coils |
| 2 | Чтение Discrete Inputs |
| 3 | Чтение Holding Registers |
| 4 | Чтение Input Registers |
| 5 | Запись одного Coil |
| 6 | Запись одного Holding Register |
| 15 | Запись нескольких Coils |
| 16 | Запись нескольких Holding Registers |
Пример: чтение температуры из датчика
Датчик по адресу 192.168.1.50:502, Unit ID=1, Holding Registers начиная с адреса 0, 2 регистра (температура и влажность):
ID = "modbus[192.168.1.50:502,1,3,0,2]"
FB-схема:
┌──────────────────────────────────┐
INIT ──►│ │──► CNF
REQ ──►│ CLIENT_2 │──► IND
│ ID = "modbus[192.168.1.50:502, │
│ 1,3,0,2]" │
│ │──► RD_1 (temperature)
│ │──► RD_2 (humidity)
└──────────────────────────────────┘
Пример: включение/выключение насоса (запись Coil)
ID = "modbus[192.168.1.51:502,1,5,8,1]"
SD_1 = TRUE # включить насос на coil адрес 8
Преобразование данных
Modbus хранит 16-битные целые числа. Для значений с плавающей точкой (IEEE 754) нужно два регистра:
┌─────────────────┐ ┌────────────────────────┐
INIT ──►│ CLIENT_2 │──► │ WORD_TO_REAL_PAIR │
REQ ──►│ (Modbus read) │ │ (преобразование 2×INT │
│ RD_1, RD_2 │──► │ → REAL) │──► temperature_REAL
└─────────────────┘ └────────────────────────┘
Стандарт Modbus и типы данных
Для читаемости используйте FB-библиотеку IEC61131Utils которая включает стандартные функции преобразования типов.
Optiональный: опрос по таймеру
Типичная схема циклического опроса Modbus:
E_CYCLE(T#1s) ──EO──► CLIENT_N.REQ
CLIENT_N.IND ──► [обработка данных]
Подключение к распространённым устройствам
Schneider Modicon M221
ID = "modbus[192.168.1.100:502,1,3,0,10]"
# Unit ID=1, FC=3 (Holding Registers), адрес 0, 10 регистров
ОВЕН ПЛК
ID = "modbus[192.168.1.200:502,1,3,0,16]"
# Стандартная конфигурация ОВЕН
Danfoss FC (частотный преобразователь)
ID = "modbus[192.168.1.30:502,1,3,1,1]"
# FC=3, Main Actual Value в регистре 1
Умный счётчик Меркурий 230
# Modbus RTU через шлюз RS485→TCP
ID = "modbus[192.168.1.5:4001,1,3,0,4]"
# Регистры: 0=активная мощность, 1=напряжение, 2=ток, 3=cosφ
Проверка соединения
# Установка modbus-cli
npm install -g modbus-cli
# Чтение 10 holding registers с устройства
modbus read -h 192.168.1.50 -p 502 400001 10
Следующий шаг
EtherNet/IP — протокол для оборудования Allen-Bradley и Omron.