Перейти к основному содержимому

Протокол 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.