Автор | Сообщение |
---|---|
admin | |
Описание протокола Modbus RTU Сообщение Modbus RTU состоит из адреса устройства SlaveID, кода функции, специальных данных в зависимости от кода функции и CRC контрольной суммы. Если отбросить SlaveID адрес и CRC контрольную сумму, то получится PDU, Protocol Data Unit. SlaveID – это адрес устройства, может принимать значение от 0 до 247, адреса с 248 до 255 зарезервированы. Данные в модуле хранятся в 4 таблицах. Две таблицы доступны только для чтения и две для чтения-записи. В каждой таблице помещается 9999 значений. В сообщении Modbus используется адрес регистра. Например, первый регистр AO Holding Register, имеет номер 40001, но его адрес равен 0000. Разница между этими двумя величинами есть смещение offset. Каждая таблица имеет свое смещение, соответственно: 1, 10001, 30001 и 40001. Ниже приведен пример запроса Modbus RTU для получения значения AO аналогового выхода (holding registers) из регистров от #40108 до 40110 с адресом устройства 17. 11 03 006B 0003 7687 В ответе от Modbus RTU Slave устройства мы получим: 11 03 06 AE41 5652 4340 49AD Где: Регистр аналогового выхода AO0 имеет значение AE 41 HEX или 44609 в десятичной системе. Регистр аналогового выхода AO1 имеет значение 56 52 HEX или 22098 в десятичной системе. Регистр аналогового выхода AO2 имеет значение 43 40 HEX или 17216 в десятичной системе. Значение AE 41 HEX - это 16 бит 1010 1110 0100 0001, может принимать различное значение, в зависимости от типа представления. Значение регистра 40108 при комбинации с регистром 40109 дает 32 бит значение. Пример представления. Какие бывают команды Modbus RTU? Как послать команду Modbus RTU на чтение дискретного вывода? Команда 0x01 В запросе PDU задается начальный адрес первого регистра DO и последующее количество необходимых значений DO. В PDU значения DO адресуются, начиная с нуля. Значения DO в ответе находятся в одном байте и соответствуют значению битов. Значения битов определяются как 1 = ON и 0 = OFF. Младший бит первого байта данных содержит значение DO адрес которого указывался в запросе. Остальные значения DO следуют по нарастающей к старшему значению байта. Т.е. справа на лево. Если запрашивалось меньше восьми значений DO, то оставшиеся биты в ответе будут заполнены нулями (в направлении от младшего к старшему байту). Поле Byte Count Количество байт далее указывает количество полных байтов данных в ответе. Пример запроса DO с 20 по 56 для SlaveID адреса устройства 17. Адрес первого регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса (0014 hex = 20, -1 смещение нуля = получаем 0013 hex = 19). Состояния выходов DO 27-20 показаны как значения байта CD hex, или в двоичной системе 1100 1101. В регистре DO 56-52 5 битов справа были запрошены, а остальные биты заполнены нулями до полного байта (0001 1011). Как послать команду Modbus RTU на чтение дискретного ввода? Команда 0x02 Пример запроса DI с регистров от #10197 до 10218 для SlaveID адреса устройства 17. Адрес первого регистра будет 00C4 hex = 196, т.к. счет ведется с 0 адреса. Как послать команду Modbus RTU на чтение аналогового вывода? Команда 0x03 Пример запроса AO с регистров от #40108 до 40110 для SlaveID адреса устройства 17. Адрес первого регистра будет 006B hex = 107, т.к. счет ведется с 0 адреса. Как послать команду Modbus RTU на чтение аналогового ввода? Команда 0x04 Пример запроса AI с регистра #30009 для SlaveID адреса устройства 17. Адрес первого регистра будет 0008 hex = 8, т.к. счет ведется с 0 адреса. Как послать команду Modbus RTU на запись дискретного вывода? Команда 0x05 Значение FF 00 hex устанавливает выход в значение включен ON. Значение 00 00 hex устанавливает выход в значение выключен OFF. Все остальные значения недопустимы и не будут влиять значение на выходе. Нормальный ответ на такой запрос - это эхо (повтор запроса в ответе), возвращается после того, как состояние DO было изменено. Пример записи в DO с регистром #173 для SlaveID адреса устройства 17. Адрес регистра будет 00AC hex = 172, т.к. счет ведется с 0 адреса. Состояние выхода DO173 поменялось с выключен OFF на включен ON. Как послать команду Modbus RTU на запись аналогового вывода? Команда 0x06 Пример записи в AO с регистром #40002 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 hex = 1, т.к. счет ведется с 0 адреса. Как послать команду Modbus RTU на запись нескольких дискретных выводов? Команда 0x0F Пример записи в несколько DO с регистрами от #20 до #29 для SlaveID адреса устройства 17. Адрес регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса. В ответе возвращается количество записанных регистров. Как послать команду Modbus RTU на запись нескольких аналоговых выводов? Команда 0x10 Пример записи в несколько AO с регистрами #40002 и #40003 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 hex = 1, т.к. счет ведется с 0 адреса. Какие бывают ошибки запроса Modbus? Ответ будет содержать измененный Функциональный код, старший бит будет равен 1. Пример: Пример запроса и ответ с ошибкой: Расшифровка кодов ошибок Программы для работы с протоколом Modbus RTU DCON Utility Pro с поддержкой Modbus RTU, ASCII, DCON. Modbus Master Tool с поддержкой Modbus RTU, ASCII, TCP. Modbus TCP client с поддержкой Modbus TCP. Источник: https://ipc2u.ru/articles/prostye-resheniya/modbus-rtu/ |
|
Сообщения: 463 |