Протокол Modbus
Введение
Modbus — это семейство протоколов обмена, используемых в системах промышленной автоматизации. Как правило, встречаются две его версии:
- Modbus RTU, использующий физический интерфейс RS-485/232/422;
- Modbus TCP, использующий физический интерфейс Ethernet.
Протокол Modbus основан на архитектуре master/slave:
- master отправляет запрос на чтение или запись данных в slave-устройство;
- slave ожидает запроса от мастера и, при получении, выполняет его и отправляет ответ.
Информация
Применительно к Modbus TCP эту архитектуру иногда называют client/server (где client — это master, а server — slave).
Модель данных
Обмен данными с устройствами происходит через регистры. В спецификации протокола определяется четыре типа регистров:
Coils(Регистры флагов) — чтение и запись (1 бит).Discrete Inputs(Дискретные входы) — только чтение (1 бит).Holding Registers(Регистры хранения) — чтение и запись (16-бит слово).Input Registers(Регистры ввода) — только чтение (16-бит слово).
Coils хранят однобитные значения — то есть могут находиться в состоянии 0 или 1. Такие регистры могут обозначать текущее состояние выхода (включено реле). Название coil буквально означает обмотку электромеханического реле. Регистры флагов допускают как чтение, так и запись.
Discrete Inputs также являются однобитными регистрами, описывающими состояние входа устройства (например, подано напряжение — 1). Эти регистры поддерживают только чтение.
Holding Registers и Input Registers представлены двухбайтовым словом и могут хранить значения от 0 до 65535 (0x0000 — 0xFFFF в шестнадцатеричной системе счисления). Регистры ввода допускают только чтение (например, текущее значение температуры). Регистры хранения поддерживают как чтение, так и запись (для хранения настроек). В настоящее время во многих устройствах эти регистры не разделяются. Команды на чтение регистра хранения N и регистра ввода N обратятся к одному и тому же значению в адресном пространстве устройства.
Коды качества
Коды качества сигнала Modbus используются для диагностики ошибок при обмене данными между master и slave-устройством.
Если slave получил запрос, но не может его корректно обработать, он вместо обычного ответа отправляет обратно код функции запроса + один байт c кодом качества. Этот код объясняет причину отказа.
| Код качества | Описание |
|---|---|
0x18 |
Нет связи |
0x01 |
Неподдерживаемый код функции для данного устройства |
0x02 |
Запрошенный адрес регистра вне допустимого диапазона |
0x03 |
Некорректное значение в поле данных (не соответствует допустимому формату/диапазону) |
0x04 |
Внутренняя неисправность устройства при обработке запроса |
0x05 |
Запрос принят, выполняется длительная операция (требуется повторный опрос статуса) |
0x06 |
Устройство занято, не может обработать запрос (повторить позже) |
0x07 |
Операция не выполнена; функция отклонена (например, программная команда недопустима) |
0x08 |
Ошибка четности памяти при чтении (аппаратная неисправность) |
0x0A |
Шлюз недоступен или не настроен для маршрутизации запроса |
0x0B |
Целевое устройство не отвечает через шлюз |