Содержание:
- Базовая информация о протоколе Modbus
- Протокол Modbus RTU
- Протокол Modbus ASCII
- Таблица распределения регистров Modbus в приборах Bronkhorst ®
- Функция чтения нескольких регистров с примерами (код 0×03)
- Функция записи одного регистра (код 0×06)
- Функция записи нескольких регистров с примерами (код 0×10)
- Функция диагностики ведомого устройства с примерами (код 0×08)
- Функция идентификации ведомого устройства (код 0×11)
Базовая информация о протоколе Modbus
Modbus — открытый коммуникационный протокол, работающий по принципу ведущий-ведомый (master-slave). К несомненным достоинствам промышленной сети на основе Modbus можно отнести простоту программной реализации, элегантность принципов функционирования, полностью бесплатные тексты стандартов, доступные на сайте. В протоколе применяется надежный метод контроля ошибок, что обеспечивает высокую степень достоверности передачи данных. Modbus позволяет унифицировать команды обмена благодаря стандартизации адресов регистров и функций их чтения-записи.
Стандарт Modbus предусматривает применение физического интерфейса RS-232, RS-422, RS-485 или TCP. В приборах компании Bronkhorst® реализована работа в сети RS-485/Modbus. О принципах передачи данных в промышленных сетях на основе интерфейса RS-485 Вы можете прочесть в этой статье. А о подключении приборов в сеть RS-485/Modbus рассказывается в этой статье.
Приборы Bronkhorst® поддерживают скорости обмена данными 9 600 бит/с (обязательная по требованиям протокола), 19 200 бит/с (обязательная и устанавливается по умолчанию), а также 38 400 бит/с. Приборы некоторых серий также работают со скоростями 57 600 и 115 200 бит/с. Скорость передачи поддерживаться в передатчике с погрешностью не хуже 1%, а приемник должен принимать данные при отклонении скорости передачи до 2%.
Устройства в промышленной сети Modbus взаимодействуют посредством транзакций, состоящих из запроса и ответа. В сети присутствует одно ведущее устройство (master), и несколько ведомых устройств (slaves). Количество ведомых устройств может достигать 247. Все ведомые устройства в сети Modbus имеют свои адреса: с 1 по 247. Адреса с 248 по 255 зарезервированы. Ведущее устройство не должно иметь адреса, в сети не должно быть двух устройств с одинаковыми адресами.
Ведущее устройство инициирует транзакции, передавая запросы. Ведущее устройство может адресовать запрос индивидуально какому-либо ведомому устройству или инициировать передачу широковещательного сообщения для всех ведомых устройств. Ведомое устройство, опознав свой адрес, отвечает на запрос, адресованный именно ему. При получении широковещательного запроса ответ ведомыми устройствами не формируется.
Обмен данными всегда инициируется ведущим устройством. Ведомые устройства никогда не начинают передачу данных, пока не получат запрос от ведущего. Ведомые устройства также не могут обмениваться данными друг с другом. Поэтому в любой момент времени в сети Modbus может происходить только один акт обмена.
Протокол Modbus описывает структуру запросов и ответов. Их основа PDU — Protocol Data Unit или элементарный пакет протокола. Структура PDU не зависит от используемого интерфейса и включает в себя инструкцию ведомому устройству (функцию) и передаваемые данные (поле данных). В спецификации Modbus описан целый ряд функций, каждой из которых присвоен код. В PDU передается именно код функции. Код функции кодируется однобайтовым полем (8 бит или 256 возможных значений) и может принимать значения в диапазоне 1...127. Диапазон значений 128...255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.
Код функции, |
Поле данных, |
Для передачи пакета нужному ведомому устройству PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU — Application Data Unit. Для интерфейса RS-485 существуют два варианта ADU: Modbus RTU и Modbus ASCII.
Протокол Modbus RTU
Modbus RTU — компактный двоичный вариант. Для передачи каждого символа передается один байт со значением его кода в таблице ASCII. Например, при необходимости отправить символ «R» передается его ASCII-код в шестнадцатеричном представлении (0×52) одним байтом: 0011 0100.
В протоколе Modbus RTU для передачи одного байта (8 бит) информации используется 11 бит: стартовый бит, бит паритета, стоп-бит и 8 бит данных. При этом биты передаются младшими разрядами вперед:
Стартовый бит |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Бит паритета |
Стоп-бит |
Стартовый бит соответствует логическому «0». Бит паритета позволяет контролировать точность передачи каждого байта информации. Его значение связано с количеством логических «1» в передаваемых 8 битах данных и может вычисляться по разным правилам. Если при нечетном количестве логических «1» бит паритета принимает значение «1», а при их четном количестве — значение «0», то такой паритет называется четным (even parity). Такой тип паритета устанавливается в протоколе Modbus RTU по умолчанию.
Если же при нечетном количестве логических «1» бит паритета равен «0», а при четном количестве логических «1» он равен «1», то используется нечетный паритет (odd parity). Контроль четности может отсутствовать вообще. В этом случае вместо бита паритета должен использоваться второй стоп-бит. Стоп-бит соответствует логической «1».
Все приборы компании Bronkhorst® могут работать в сети Modbus RTU с четным паритетом. Контроль четности у некоторых приборов может настраиваться на любой из вариантов, а четный паритет устанавливается по умолчанию. Подробная информация о возможных режимах работы приборов различных серий приведена в инструкции 9.17.035, пункт 4.4.6.
Структура пакета ADU для Modbus RTU представлена на рисунке ниже. Сначала одним байтом передается адрес ведомого устройства. Затем следует пакет PDU, длина которого может достигать 253 байта. И в конце передается контрольная сумма (2 байта), обеспечивающая контроль целостности передачи данных. Контрольная сумма вычисляется по алгоритму CRC16.
Адрес ведомого устройства, |
PDU, |
Контрольная сумма CRC16, |
Пакеты ADU разделяются паузой в передаче. При паузе в линии устанавливается логическая «1». Сообщение должно начинаться и заканчиваться паузой, длительностью не менее 3,5 символов при данной скорости передачи. Во время передачи сообщения не должно быть пауз длительностью более 1,5 символов. Для скоростей более 19 200 бит/с допускается использовать фиксированные по длительности паузы между пакетами 1,75 мс. При этом паузы при передаче пакета не должны превышать 0,75 мс.
Устройства сети легко могут идентифицировать начало передачи нового пакета. В состоянии паузы в линии поддерживается логическая «1». Начало передачи нового пакета начинается с передачи стартового бита, соответствующего логическому «0».
Ответ ведомого устройства ведущему зависит от переданной инструкции. Различные варианты ответов в зависимости от используемого кода функции будут рассмотрены ниже.
Протокол Modbus ASCII
В Modbus ASCII для передачи одного символа передается 2 байта со значением его кода в таблице ASCII в шестнадцатеричном представлении. Например, при отправке символа «R» двумя байтами передается его ASCII-код в шестнадцатеричном представлении (0×52): сначала символ «5» байтом 0×35 (011 0101), а затем символ «2» байтом 0×32 (011 0010). Обратите внимание, что в Modbus ASCII для передачи одного байта информации используется только 7 бит. В поле данных здесь могут передаваться байты от 0×30 (соответствует символу «0») до 0×46 (соответствует символу «F»).
В протоколе Modbus ASCII при передаче одного байта информации (7 бит) используются те же 3 сервисных бита, что и в Modbus RTU: стартовый бит, бит паритета и стоп-бит. Таким образом, для отправки по Modbus ASCII одного символа надо передать 2 байта данных или 20 бит. При этом допускается временной промежуток между байтами до 1 секунды без возникновения ошибки передачи.
Стартовый бит |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Бит паритета |
Стоп-бит |
Структура пакета ADU для Modbus ASCII показана на рисунке ниже. Новый пакет начинается с префикса «:», передаваемого ASCII-кодом символа «:» в шестнадцатеричном представлении 0×3A. Префикс передается одним байтом (011 1010). Затем передается адрес ведомого устройства двумя байтами (1 байт в RTU * 2). За ним следует PDU с максимальной длиной до 506 байт (253 байт в RTU * 2). Контроль целостности передачи осуществляется с помощью контрольной суммы LRC8, передаваемой двумя байтами (1 байт суммы LRC8 * 2). Заканчивается пакет ADU суффиксом из последовательности CR + LF (коды ASCII 0×0D и 0×0A), передаваемой двумя байтами (000 1101 и 000 1010).
Префикс «:», |
Адрес ведомого устройства, |
PDU, |
Контрольная сумма LRC8, |
Суффикс CRLF, |
Ответ ведомого устройства ведущему зависит от переданной инструкции. Различные варианты ответов в зависимости от используемого кода функции будут рассмотрены ниже.
Таблица распределения регистров Modbus в приборах Bronkhorst®
Одним из основных применений промышленных сетей является чтение и запись данных в ведомых устройствах. В спецификации протокола Modbus для внутренней памяти ведомых устройств определяется четыре таблицы данных (регистров): две для дискретных данных и две для 16-битных данных. В приборах Bronkhorst® используется только одна таблица HOLDING REGISTERS с 16-битными данными, для которых протоколом допускаются как чтение, так и запись.
Таблица HOLDING REGISTERS содержит 65 536 ячеек (регистров), в каждой из которых хранится 16 бит (2 байта) данных. Каждый регистр имеет свой адрес. Распределение параметров приборов Bronkhorst® по этой таблице (адресам регистров) приведено в инструкции 9.17.035 в пункте 4.4.6. В различных регистрах хранятся различные типы данных (целые числа, числа с плавающей точкой, символы, строки). Под некоторые параметры отводится сразу несколько последовательно идущих регистров. В основном это касается данных с типами «число с плавающей точкой» или «строка». Так для строкового параметра «Usertag» (Пользовательская метка) используется 7 последовательных регистров с адресами от 0хF130 до 0хF136.
Операции чтения и записи в ведомых устройствах сводятся к обращению к одному или нескольким регистрам Modbus и соответствующим манипуляциям с хранящимися там данными. Несмотря на то, что стандарт Modbus позволяет осуществлять и чтение и запись всей таблицы HOLDING REGISTERS, в приборах Bronkhorst на некоторые параметры накладываются дополнительные ограничения. Это определяется логикой работы самого устройства. Возможности чтения и записи параметров указаны в той же таблице регистров Modbus в инструкции 9.17.035.
Функция чтения нескольких регистров с примерами (код 0×03)
Чтение нескольких регистров из таблицы HOLDING REGISTERS, код функции 0×03
Код функции, |
Адрес первого регистра, |
Количество читаемых регистров, |
На рисунке приведена структура PDU запроса на чтение нескольких последовательно идущих регистров. После кода функции двумя байтами передается адрес первого элемента таблицы, а затем следует количество считываемых регистров (тоже двумя байтами). Старшие байты адреса и количества передаются первыми.
Примеры запросов на чтение параметра «Usertag» к ведомому устройству с адресом с сети Modbus «1» (устанавливается производителем по умолчанию):
RTU: 01 03 F1 30 00 07 36 FB, где
«01» — адрес ведомого устройства 0×01;
«03» — код функции;
«F1 30» — адрес первого регистра, в котором хранится параметр «Usertag»;
«00 07» — количество регистров, в которых хранится параметр «Usertag», 7 регистров;
«36 FB» — контрольная сумма CRC16.
ASCII: 3A 30 31 30 33 46 31 33 30 30 30 30 37 44 34 0D 0A, где
«3A» — префикс «:»
«30 31» — адрес ведомого устройства 0×01;
«30 33» — код функции 0×03;
«46 31 33 30» — адрес первого регистра, в котором хранится параметр «Usertag» 0хF130;
«30 30 30 37» — количество регистров, в которых хранится параметр «Usertag», 7 регистров;
«44 34» — контрольная сумма LRC8: 0хD4;
«0D 0A» — суффикс CRLF.
В ответе ведомое устройство передает запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных. Структура PDU выглядит так:
Код функции, |
Количество передаваемых байт, |
Данные из регистров |
В приведенном выше примере мы получим следующий ответ (параметр «Usertag» имеет значение «USERTAG»):
RTU: 01 03 0E 55 53 45 52 54 41 47 00 00 00 00 00 00 00 43 48, где
«01» — адрес ведомого устройства 0×01;
«03» — код функции;
«0E» — количество передаваемых байт, 14 байт;
«55 53 45 52 54 41 47 00 00 00 00 00 00 00» — информация из регистров, «USERTAG »;
«43 48» — контрольная сумма CRC16.
ASCII: 3A 30 31 30 33 30 45 35 35 35 33 34 35 35 32 35 34 34 31 34 37 30 30 30 30 30 30 30 30 30 30 30 30 30 30 44 33 0D 0A, где
«3A» — префикс «:»
«30 31» — адрес ведомого устройства 0×01;
«30 33» — код функции 0×03;
«30 45» — количество передаваемых байт, 14 байт;
«35 35 35 33 34 35 35 32 35 34 34 31 34 37 30 30 30 30 30 30 30 30 30 30 30 30 30 30» — информация из регистров, «USERTAG »;
«44 33» — контрольная сумма LRC8 0xD3;
«0D 0A» — суффикс CRLF.
Во время обмена данными (чтения) могут возникать ошибки двух типов:
- ошибки, связанные с искажениями при передаче данных;
- логические ошибки (запрос принят без искажений, но не может быть выполнен)
При передаче по асинхронным линиям связи ошибки первого типа обнаруживаются при помощи проверки соответствия принятого запроса установленному формату ADU и вычисления контрольной суммы. Дополнительно, для проверки каждого символа может использоваться бит четности. Если подчинённое устройство обнаруживает искажение данных, принятый запрос игнорируется, ответное сообщение не формируется. Главное устройство может обнаружить ошибку по отсутствию ответа.
При ошибках второго типа подчинённое устройство, которому адресован запрос, отсылает сообщение об ошибке. Структура PDU при этом выглядит так:
Код функции при наличии ошибки, |
Код ошибки, |
Признаком того, что ответ содержит сообщение об ошибке, является установленный старший бит номера функции. В нашем примере код функции чтения 0×03 (0000 0011), а возвращаемый ведомым устройством код функции при наличии ошибки 0×83 (1000 0011). За номером функции, вместо обычных данных, следует код ошибки. Возможные коды ошибки для функции чтения нескольких регистров таблицы HOLDING REGISTERS приведены в инструкции 9.17.035, пункт 4.4.1.
Функция записи одного регистра (код 0×06)
Код функции, |
Адрес записываемого регистра, |
Записываемые данные, |
На рисунке приведена структура PDU запроса на запись одного регистра. После кода функции двумя байтами передается адрес записываемого регистра, а затем следуют два байта записываемой информации.
Если команда выполнена успешно, то ведомое устройство возвращает точную копию запроса. В случае ошибки код функции заменяется на 0×86, а возможные коды ошибки приведены в инструкции 9.17.035, пункт 4.4.2.
Функция записи нескольких регистров с примерами (код 0×10)
Код функции, |
Адрес первого записываемого регистра, |
Количество записываемых регистров, |
Количество записываемых байт, |
Записываемые данные |
На рисунке приведена структура PDU запроса на запись нескольких последовательных регистров. После кода функции двумя байтами передается адрес первого записываемого регистра, затем также двумя байтами передается количество записываемых регистров. Далее уже одним байтом передается количество записываемых байт информации, и, наконец, следуют сами записываемые данные.
Рассмотрим пример записи в параметр «Usertag» значения «MFC-O2». Прибор также имеет адрес 1 в сети Modbus.
RTU: 01 10 F1 30 00 07 0E 4D 46 43 2D 4F 32 00 00 00 00 00 00 00 00 14 10, где
«01» — адрес ведомого устройства 0×01;
«10» — код функции;
«F1 30» — адрес первого регистра, в котором хранится параметр «Usertag»;
«00 07» — количество регистров, в которых хранится параметр «Usertag» (их 7 шт);
«0E» — количество байт записываемой информации, 14 байт;
«4D 46 43 2D 4F 32 00 00 00 00 00 00 00 00» — записываемая строка «MFC-O2 »;
«14 10» — контрольная сумма CRC16.
ASCII: 3A 30 31 31 30 46 31 33 30 30 30 30 37 30 45 34 44 34 36 34 33 32 44 34 46 33 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 35 0D 0A, где
«3A» — префикс «:»
«30 31» — адрес ведомого устройства 0×01;
«31 30» — код функции 0×10;
«46 31 33 30» — адрес первого регистра, в котором хранится параметр «Usertag» 0xF130;
«30 30 30 37» — количество регистров, в которых хранится параметр «Usertag» (их 7 шт);
«30 45» — количество байт записываемой информации, 14 байт;
«34 44 34 36 34 33 32 44 34 46 33 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30» — записываемая строка «MFC-O2 »;
«33 35» — контрольная сумма LRC8 0×35;
«0D 0A» — суффикс CRLF.
При успешном выполнении команды ведомое устройство формирует ответ, состоящий из адреса первого записанного регистра (2 байта) и общего количества изменённых регистров (2 байта):
Код функции, |
Адрес первого записанного регистра, |
Количество записанных регистров, |
В нашем примере мы получим ответ:
RTU: 01 10 F1 30 00 07 B3 38, где
«01» — адрес ведомого устройства 0×01;
«10» — код функции;
«F1 30» — адрес первого регистра, в котором хранится параметр «Usertag»;
«00 07» — количество записанных регистров, в которых хранится параметр «Usertag» (их 7 шт);
«B3 38» — контрольная сумма CRC16.
ASCII: 3A 30 31 31 30 46 31 33 30 30 30 30 37 43 37 0D 0A, где
«3A» — префикс «:»
«30 31» — адрес ведомого устройства 0×01;
«31 30» — код функции 0×10;
«46 31 33 30» — адрес первого регистра, в котором хранится параметр «Usertag» 0xF130;
«30 30 30 37» — количество записанных регистров, в которых хранится параметр «Usertag» (их 7 шт);
«43 37» — контрольная сумма LRC8 0хC7;
«0D 0A» — суффикс CRLF.
В случае ошибки код функции заменяется на 0×90, а возможные коды ошибки приведены в инструкции 9.17.035, пункт 4.4.3.
Функция диагностики ведомого устройства с примерами (код 0×08)
Код функции, |
Тип диагностики, |
Передаваемые данные, |
На рисунке приведена структура PDU запроса на диагностику ведомого устройства. Определено несколько типов диагностических запросов (очистка счетчика, количество переданных пакетов, количество ошибок передачи и т.д.), список возможных вариантов для приборов Bronkhorst приведен в инструкции 9.17.035, пункт 4.4.4. После кода функции двумя байтами передается тип диагностического запроса, а затем следует определяемое типом поле данных. Приведем пример запроса количества пакетов данных для прибора с адресом «1» с сети:
RTU: 01 08 00 0B 00 00 91 С9, где
«01» — адрес ведомого устройства 0×01;
«08» — код функции;
«00 0B» — тип диагностического запроса: количество пакетов данных;
«00 00» — поле данных, пустое согласно Modbus Application Protocol;
«91 C9» — контрольная сумма CRC16.
В ответ ведомое устройство формирует ответ, где повторяется код функции (1 байт), тип диагностического запроса (2 байта), а затем передается поле данных с запрашиваемой информацией. Структура PDU приведена ниже:
Код функции, |
Тип диагностики, |
Данные от ведомого устройства |
В нашем примере мы получим ответ:
RTU: 01 08 00 0B 00 17 D1 C7, где
«01» — адрес ведомого устройства 0×01;
«08» — код функции;
«00 0B» — тип диагностического запроса: количество пакетов данных;
«00 17» — поле данных, количество пакетов данных, 23 шт;
«D1 C7» — контрольная сумма CRC16.
В случае ошибки код функции заменяется на 0×88, а возможные коды ошибки приведены в инструкции 9.17.035, пункт 4.4.4.
Функция идентификации ведомого устройства (код 0×11)
PDU запроса состоит из одного кода функции, передаваемого одним байтом. В ответ ведомое устройство формирует пакет, где за кодом функции следует количество передаваемых байт информации (1 байт), поле данных, содержащее серийный номер устройства, и в конце передается один байт со статусом работы устройства (0×00 — неактивно; 0хFF — работает).
Код функции, |
Количество передаваемых байт, |
Идентификационная строка |
Статус работы устройства, |
Приведем пример такого запроса к устройству с адресом «1» в сети:
RTU: 01 11 C0 2C, где
«01» — адрес ведомого устройства 0×01;
«11» — код функции;
«C0 2C» — контрольная сумма CRC16.
В ответ будет сформирован пакет
RTU: 01 11 0E 07 53 4E 4D 31 31 32 30 37 30 33 38 46 FF 24 E6, где
«01» — адрес ведомого устройства 0×01;
«11» — код функции;
«0E» — количество байт данных, 14;
«07 53 4E 4D 31 31 32 30 37 30 33 38 46» — идентификационная строка «•SNM11207038F»;
«FF» — статус устройства, работает;
«24 E6» — контрольная сумма CRC16.
В случае ошибки код функции заменяется на 0×91, а возможные коды ошибки приведены в инструкции 9.17.035, пункт 4.4.5.