Modbus RTU, ASCII и TCP с SerialTool
Что такое Modbus
Modbus - это протокол последовательной связи, созданный в 1979 году компанией Modicon® (теперь часть Schneider Electric) для подключения своих программируемых логических контроллеров (ПЛК). Он стал фактическим стандартом в промышленной связи и является одним из самых широко используемых протоколов подключения в мире среди промышленных электронных устройств. Modbus - это протокол без лицензионных отчислений, объявленный в спецификациях на сайте The Modbus Organization.
Простыми словами, это метод передачи информации по последовательным линиям между электронными устройствами. Устройство, запрашивающее информацию, называется клиентом Modbus, а устройства, предоставляющие информацию, - серверами Modbus. В стандартной сети Modbus есть один клиент и до 247 серверов, каждый с уникальным адресом сервера от 1 до 247. Клиент также может записывать информацию на сервера.
Изначально разработанный для использования в промышленности, со временем этот протокол был принят в различных отраслях, став одним из самых распространенных протоколов. Даже сегодня, спустя более 40 лет, он доступен во многих устройствах, таких как панели оператора, ПЛК, системы умного дома и даже встроен в простые устройства, такие как Arduino.
Передача Modbus RTU и ASCII через последовательный порт
Когда протокол был создан, коммуникация предполагалась через последовательный порт, поэтому он был реализован в SerialTool. Modbus часто используется для подключения надзорного компьютера к удаленному блоку управления (RTU) в системах надзора, управления и сбора данных (SCADA). В зависимости от формата передачи данных протокол делится на:
- MODBUS RTU - данные передаются в шестнадцатеричном формате.
- MODBUS ASCII - данные передаются в ASCII формате.
Контроль ошибок различен в двух случаях; в MODBUS RTU используется циклическая избыточная проверка (CRC) и передается после команд, в то время как в MODBUS ASCII используется продольная избыточная проверка (LRC) и передается после команд.
Передача Modbus TCP
В 1999 году был разработан "Modbus TCP", стандарт, предназначенный для сетей, использующих набор протоколов TCP/IP. Это, по сути, версия серийного Modbus RTU на основе TCP/IP, обеспечивающая связь через сети интернета/внутренние сети. В последние годы версия TCP/IP используется все чаще, потому что она является открытым исходным кодом, легко внедряемой, имеет низкие затраты на разработку и минимальную поддержку аппаратных средств.
Контроль ошибок различен в двух случаях; в MODBUS RTU используется циклическая избыточная проверка (CRC) и передается после команд, в то время как в MODBUS ASCII используется продольная избыточная проверка (LRC) и передается после команд.
Протокол Modbus TCP/IP использует бинарное кодирование данных и механизм обнаружения ошибок TCP/IP. В отличие от последовательного Modbus, версия TCP/IP ориентирована на соединение и позволяет одновременное выполнение на одном и том же устройстве или на нескольких устройствах. Modbus TCP/IP также использует парадигму мастер-рабочий, и эта связь использует четыре типа сообщений.
Modbus размещен на уровне 7 в модели OSI/ISO (прикладной уровень), определяя форматирование сообщения, называемое оформлением, и режим передачи данных и управляющих функций. Общение происходит через парадигму клиент-сервер. Протокол определяет блок передачи протокольных данных (PDU), который не зависит от нижнего уровня связи. Протокольный блок данных приложения (ADU) вводит дополнительные поля для адресации и контроля ошибок.
SerialTool Modbus Client
SerialTool поддерживает режимы передачи RTU, ASCII и Modbus TCP для обеспечения максимальной профессиональной гибкости клиента Modbus.
SerialTool также предлагает возможность отправки сырых команд для удовлетворения любых потребностей разработчика.
Экран с журналом отправленных команд
Экран с отправленными командами низкого уровня
Функции Modbus
Вот функции, которые реализует SerialTool для протокола Modbus.
Function Code | Action | Table Name |
---|---|---|
0x01 | Read | Discrete Output Coils |
0x02 | Read | Discrete Input Contacts |
0x03 | Read | Analog Output Holding Register |
0x04 | Read | Analog Input Registers |
0x05 | Write Single | Discrete Output Coil |
0x06 | Write Single | Analog Output Holding Register |
0x0F (dec 15) | Write Multiple | Discrete Output Coils |
0x10 (dec 16) | Write Multiple | Analog Output Holding Registers |
Структуры данных Modbus
Информация хранится в устройстве сервера в четырех различных таблицах. Две таблицы хранят дискретные значения включено/выключено (катушки), и две хранят числовые значения (регистры). И у катушек, и у регистров есть таблица только для чтения и таблица для чтения/записи. Каждая таблица имеет 9999 значений. Каждая катушка или контакт занимает 1 бит и имеет адрес данных от 0000 до 270E. Каждый регистр представляет собой 1 слово = 16 бит = 2 байта и также имеет адрес данных от 0000 до 270E.
Coil/Registers numbers | Data Addresses | Type | Table Name |
---|---|---|---|
1-9999 | 0x0000 to 0x270E | Read/Write | Discrete Output Coils |
10001-19999 | 0x0000 to 0x270E | Read Only | Discrete Input Contacts |
30001-39999 | 0x0000 to 0x270E | Read Only | Analog Input Register |
40001-49999 | 0x0000 to 0x270E | Read/Write | Analog Output Holding Register |