Modbus
Modbus — коммуникационный протокол, основанный на клиент-серверной архитектуре. Разработан фирмой Modicon для использования в контроллерах с программируемой логикой (PLC). Стал стандартом де-факто в промышленности и широко применяется для организации связи промышленного электронного оборудования. Использует для передачи данных последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP. В настоящее время поддерживается некоммерческой организацией Modbus-IDA.
Общее описание протокола Modbus RTU[править | править код]
Протокол Modbus описывает единый простой формат передачи данных PDU, который в свою очередь входит в полный пакет ADU. Формат ADU меняется в зависимости от типа линии связи. Существуют три режима протокола: Modbus RTU, Modbus ASCII, Modbus TCP. Первые два используют последовательные линии связи (в основном RS-485, реже RS-422/RS-232), последний использует для передачи данных по сетям TCP/IP.
Протокол Modbus RTU предполагает одно ведущее (запрашивающее) устройство в линии (master), которое может передавать команды одному или нескольким ведомым устройствам (slave), обращаясь к ним по уникальному в линии адресу. Синтаксис команд протокола позволяет адресовать 247 устройств на одной линии связи стандарта RS-485 (реже RS-422 или RS-232).
Инициатива проведения обмена всегда исходит от ведущего устройства. Ведомые устройства прослушивают линию связи. Мастер подаёт запрос (посылка, последовательность байт) в линию и переходит в состояние прослушивания линии связи. Ведомое устройство отвечает на запрос, пришедший в его адрес. Окончание ответной посылки мастер определяет, по временному интервалу между окончанием приёма предыдущего байта и началом приёма следующего. Если этот интервал превысил время, необходимое для приёма двух байт на заданной скорости передачи, приём кадра ответа считается завершённым. Кадры запроса и ответа по протоколу modbus имеют фиксированный формат, приведённый в (Таблица 1-1).
адрес ведомого устройства | номер функции | данные | CRC |
---|---|---|---|
1 байт |
1 байт |
N < 253 (байт) | 2 байта |
где:
- адрес ведомого устройства — первое однобайтное поле кадра. Оно содержит адрес подчинённого устройства, к которому адресован запрос. Ведомые устройства отвечают только на запросы, поступившие в их адрес. Ответ также начинается с адреса отвечающего ведомого устройства, который может изменяться от 1 до 254. Адрес 0 используется для широковещательной передачи, его распознаёт каждое устройство;
- номер функции — это следующее однобайтное поле кадра. Оно говорит ведомому устройству, какие данные или выполнение какого действия требует от него ведущее устройство;
- данные — поле содержит информацию, необходимую ведомому устройству для выполнения заданной мастером функции или содержит данные, передаваемые ведомым устройством в ответ на запрос ведущего. Длина и формат поля зависит от номера функции;
- CRC — (контрольная сумма) заключительное двухбайтное поле кадра. Контрольная сумма завершает кадры запроса и ответа и применяется для проверки отсутствия ошибок в кадре посылки Modbus RTU.
Следует отметить, что поле CRC записывается младшим байтом вперёд. Алгоритм расчёта CRC может отличаться для разных устройств.
Адресация данных в протоколе Modbus RTU[править | править код]
Все операции с данными привязаны к нулю, каждый вид данных (регистр, выходное/входное значение) начинаются с адреса 0000. Адресация к ячейке начинается с 1.
Например: Флаг номер 1 программируемого контроллера имеет адрес 0000 (указывается в поле "Адрес").
Флаг номер 127 (DEC) имеет адрес 0x007E hex (126 dec) (указывается в поле "Адрес").
Запоминающий регистр 40001 будет иметь адрес 0000 в поле "Адрес" команды. Потому что код операции уже содержит в себе необходимую информацию об адресе. Операции с этими регистрами имеют смещение Адрес_регистра - 40000 = Значение Используемое В Поле "Адрес". Тип адресации команд в дальнейшем будем помечать т.о.
смещение | обозначение |
-40000 | 4x |
-10000 | 1x |
Запоминающий регистр 40108 будет иметь адрес 006B hex (107 dec)
Контроль ошибок в протоколе Modbus RTU[править | править код]
Во время обмена данными могут возникать ошибки двух типов:
- ошибки, связанные с искажениями при передаче данных;
- логические ошибки.
Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001).
RTU фрейм[править | править код]
В RTU режиме сообщение начинается с интервала тишины равного времени передачи 3.5 символов при данной скорости передачи в сети. Первым полем затем передается адрес устройства.
Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала.
Фрейм сообщения передается непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство заканчивает прием сообщения и следующий байт будет воспринят как начало следующего сообщения.
Таким образом, если новое сообщение начнется раньше 3.5 интервала, принимающее устройство воспримет его как продолжение предыдущего сообщения. В этом случае устанавливается ошибка, так как будет несовпадение контрольных сумм.
Логические ошибки[править | править код]
Для сообщений об ошибках второго типа протокол Modbus RTU предусматривает, что устройства могут отсылать ответы, свидетельствующие об ошибочной ситуации. Признаком того, что ответ содержит сообщение об ошибке, является установленный старший бит кода команды. Пример кадра при выявлении ошибки ведомым устройством, в ответ на запрос приведён в (Таблица 2-1).
1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ.
2. Если Slave не принимает какого либо значения, никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC, or CRC), никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
4. Если Slave принимает запрос, но не может его обработать (обращение к несуществующему регистру и т.д.), отправляется ответ содержащий в себе данные об ошибке.
Направление передачи | адрес подчинённого устройства | номер функции | данные (или код ошибки) | CRC |
---|---|---|---|---|
Запрос (Master→Slave) |
0x01 |
0x77 |
0xDD |
0xC7 0xA9 |
Ответ (Slave→Master) |
0x01 |
0xF7 |
0xEE |
0xE6 0x7C |
Стандартные коды ошибок[править | править код]
01 Принятый код функции не может быть обработан на подчиненном. 02 Адрес данных указанный в запросе не доступен данному подчиненному. 03 Величина содержащаяся в поле данных запроса является не допустимой величиной для подчиненного. 04 Невосстанавливаемая ошибка имела место пока подчиненный пытался выполнить затребованное действие. 05 Подчиненный принял запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет главного от генерации ошибки таймаута. 06 Подчиненный занят обработкой команды. Главный должен повторить сообщение позже, когда подчиненный освободится. 07 Подчиненный не может выполнить программную функцию, принятую в запросе. Этот код возвращается для неудачного программного запроса, использующего функции с номерами 13 или 14. Главный должен запросить диагностическую информацию или информацию об ошибках с подчиненного. 08 Подчиненный пытается читать расширенную память, но обнаружил ошибку паритета. Главный может повторить запрос, но обычно в таких случаях требуется ремонт.
Стандартные коды функций протокола Modbus[править | править код]
В протокол Modbus можно выделить несколько подмножеств команд ( Таблица 3-1).
Подмножество команд | Диапазон кодов команд |
---|---|
Стандартные команды |
1-21 |
Резерв для расширенных функций |
22-64 |
Пользовательские |
65-119 |
Резерв для внутренних нужд |
120-255 |
0x10 Preset Multiple Registers (Установка значений в несколько регистров)[править | править код]
Тип адресации 4x
Значения регистров передаются в линию начиная с указанного адреса, следующие значения регистров передаются после него (см. поле "Данные"). Ниже приведены примеры команда ведущего устройства (таблица 3-2) и ответ ведомого (таблица 3-3):
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Кол. регистров ст. байт | 05 Кол. регистров мл. байт | 06 Кол. байт | 07 Данные ст. байт | 08 Данные мл. байт | 09 CRC мл. байт | 10 CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Master→Slave |
0x01 |
0x10 |
0x00 |
0x01 |
0x00 |
0x01 |
0x02 |
0xFF |
0xFF |
0xA6 |
0x31 |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Кол. регистров ст. байт | 05 Кол. регистров мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave→Master |
0x01 |
0x10 |
0x00 |
0x01 |
0x00 |
0x01 |
0x50 |
0x09 |
0x03 Read Holding Registers (Чтение значений из нескольких регистров)[править | править код]
Тип адресации 4x
Ниже приведены примеры команда ведущего устройства (таблица 3-4) и ответ ведомого (таблица 3-5):
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Кол. регистров ст. байт | 05 Кол. регистров мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Master→Slave |
0x01 |
0x03 |
0x00 |
0x01 |
0x00 |
0x01 |
0xD5 |
0xCA |
Значения регистров передаются в линию начиная с указанного адреса, следующие значения регистров передаются после него (см. поле "Данные").
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Кол. Байт | 03 Данные ст. байт | 04 Данные мл. байт | 05 CRC мл. байт | 06 CRC ст. байт |
---|---|---|---|---|---|---|---|
Slave→Master |
0x01 |
0x03 |
0x02 |
0xFF |
0xFF |
0xB9 |
0xF4 |
0x06 Preset Single Register (Установка значения в один регистр)[править | править код]
Тип адресации 4x
Ниже приведены примеры команда ведущего устройства (таблица 3-2) и ответ ведомого (таблица 3-3):
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Данные ст. байт | 05 Данные мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Master→Slave |
0x01 |
0x06 |
0x00 |
0x01 |
0xFF |
0xFF |
0xD9 |
0xBA |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Данные ст. байт | 05 Данные мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave→Master |
0x01 |
0x06 |
0x00 |
0x01 |
0xFF |
0xFF |
0xD9 |
0xBA |
0x01 Read Coil Status (Чтение значений из нескольких регистров флагов)[править | править код]
Тип адресации 0x
Запрос:
Состоит из адреса флага и количества считываемых флагов. Адресация флагов начинается с 0, количество флагов с 1.
Ответ:
Значение флагов передается в одном бите в поле "Данные". Трактовка флагов: 1 = ON; 0 = OFF. 0-й бит первого байта данных содержит значение флага указанного в поле "Адрес". Если запросить состояние одного флага, то в младшем бите будет возвращено значение флага, а все остальные старшие биты заполнены нулями.
Ниже приведены примеры запроса ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7). В примере запрашивается состояние 9 флагов с адреса 1. В ответе содержится 2 байта данных, для большей ясности будем считать что все запрашиваемые флаги находятся в состоянии ON, а все остальные в состоянии OFF.
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Кол. флагов ст. байт | 05 Кол. флагов мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Master→Slave |
0x01 |
0x01 |
0x00 |
0x01 |
0x00 |
0x09 |
0x |
0x |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Количество байт | 03 Данные (флаги 0-7) | 04 Данные (флаги 8-15) | 05 CRC мл. байт | 06 CRC ст. байт |
---|---|---|---|---|---|---|---|
Slave→Master |
0x01 |
0x01 |
0x02 |
0xFF |
0x01 |
0x |
0x |
0x0F Force Multiple Coils (Запись значений в несколько регистров флагов)[править | править код]
Тип адресации 0x
Команда:
Состоит из адреса флага, количества изменяемых флагов, количества передаваемых байт устанавливаемых значений. Адресация флагов начинается с 0, количество флагов с 1. Устанавливаемые значения передаются начиная с байта, в котором находится младшим битом значение, устанавливаемое по адресу указываемому в поле "00 адрес подчиненного устройства".
Ответ:
Состоит из начального адреса флага и количества записанных флагов. Адресация флагов начинается с 0, количество флагов с 1.
Ниже приведены примеры команды ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7).
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Количество флагов ст. байт | 05 Количество флагов мл. байт | 06 Количество байт данных | 07 Данные (значения для флагов биты 0-7) | 08 Данные (значения для флагов биты 8-15) | 09 CRC мл. байт | 0A CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Master→Slave |
0x01 |
0x0F |
0x00 |
0x13 |
0x00 |
0x0A |
0x02 |
0xCD |
0x01 |
0x72 |
0xCB |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Количество флагов ст. байт | 05 Количество флагов мл. байт | 05 CRC мл. байт | 06 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave→Master |
0x01 |
0x0F |
0x00 |
0x13 |
0x00 |
0x0A |
0x24 |
0x09 |
0x05 Force Single Coil (Запись значения в один флаг регистра флагов)[править | править код]
Команда:
Состоит из адреса флага и устанавливаемого значения. Поле "Значение флага мл. байт" всегда равно нулю (0x00), поле "Значение флага ст. байт" принимает значения 0xFF если флаг устанавливается в "1"(ON) или 0x00 если флаг устанавливается в "0"(OFF), другие значения недопустимы и не влияют на значение флага. Адресация флагов начинается с 0.
Ответ:
Состоит из начального адреса флага и количества записанных флагов. Адресация флагов начинается с 0, количество флагов с 1.
Ниже приведены примеры команды ведущего устройства (таблица 3-6) и ответ ведомого (таблица 3-7).
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Значение флага ст. байт | 05 Значение флага мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Master→Slave |
0x01 |
0x05 |
0x00 |
0x13 |
0xFF |
0x00 |
0x7D |
0xFF |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Адрес ст. байт | 03 Адрес мл. байт | 04 Значение флага ст. байт | 05 Значение флага мл. байт | 06 CRC мл. байт | 07 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave→Master |
0x01 |
0x05 |
0x00 |
0x13 |
0xFF |
0x00 |
0x7D |
0xFF |
0x50 Set date and time (Установка даты и времени)[править | править код]
Ниже приведены примеры команда ведущего устройства (таблица 5-4) и ответ ведомого (таблица 5-5):
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Час [0..23] | 03 Минута [0..59] | 04 Секунды [0..59] | 05 День [1..31] | 06 Месяц [1..12] | 07 Год [0..99] | 08 Столетие [19-20] | 09 CRC мл. байт | 10 CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Master→Slave |
0x01 |
0x50 |
0x0A |
0x01 |
0x00 |
0x01 |
0x0A |
0x02 |
0x14 |
0x89 |
0x1C |
Направление передачи | 00 адрес подчиненного устройства | 01 номер функции | 02 Час [0..23] | 03 Минута [0..59] | 04 Секунды [0..59] | 05 День [1..31] | 06 Месяц [1..12] | 07 Год [0..99] | 08 Столетие [19-20] | 09 CRC мл. байт | 10 CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Slave→Master |
0x01 |
0x50 |
0x0A |
0x01 |
0x00 |
0x01 |
0x0A |
0x02 |
0x14 |
0x89 |
0x1C |
Ссылки на используемые в статье источники[править | править код]
- Modbus-IDA некоммерческая организация, которая поддерживает данный протокол
- Оригинальные спецификации протокола на английском языке
- Введение в Modbus протокол
- Описание стандартного описания протокола ModBus на английском языке
- Реализация протокола Modicon Modbus RTU (Комплекс программ "ЗОНД")
- Linux C Programming Examples
- Как Modbus работает
- Программа испытания Modbus Simply Modbus
- Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc.
- FreeModbus ASCII/RTU и tcp для microcontrollers
- Бесплатное программа для теста устройств Modbus RTU
- форум по настройки Modbus
Текущая версия статьи о компьютерах. Помогите Традиции, исправьте и дополните её. |