Процедура обмена сообщениями Modbus приведена на рис. 13.
Рис. 13. Диалоговая процедура обмена сообщениями в Modbus
Сообщения при обмене формируются в кадр из отдельных байт (символов, посылок). Возможные структуры байта в Modbus RTU приведены на рис. 14.
Рис. 14. Структура байта Modbus
а - при наличии бита контроля на четность/нечетность (бит паритета), б - при отсутствии бита паритета
При установке на четность подсчитывается количество бит в области данных и если оно нечетное, то бит паритета устанавливают в 1, а если четное, то бит паритета устанавливают в 0, таким образом, общее количество бит будет четным.
Кадры запроса и ответа по протоколу Modbus имеют фиксированный формат. Каждый запрос со стороны ведущего узла включает код команды (чтение, запись и т.д.), адрес абонента, размер поля данных, собственно данные и контрольный CRC-код. Функция обслуживания тайм-аута реализована для фиксирования коллизий при приеме/передаче данных. Размер полей в байтах приведен на рис. 15.
Старт кадра - очередной кадр начинается с интервала тишины (логического сигнала 1) длительностью не менее 3,5 символа (байта) на данной скорости передачи. Стартовое поле необходимо, поскольку используется асинхронная передача, и необходимо в канале связи иметь признак начала передачи.
.
Рис. 15. Формат кадра протокола локальной сети подстанции:
А – адрес подчиненного устройства; F – номер функции; D – данные;
CRC – контрольная сумма
Адрес подчинённого устройства — первое однобайтное поле кадра. Оно содержит адрес подчинённого устройства, к которому адресован запрос. Подчинённые устройства отвечают только на запросы, поступившие только в их адрес. Ответ также начинается с адреса отвечающего устройства, который может изменяться от 1 до 247. Адрес 0 используется для широковещательной передачи, его распознаёт каждое устройство, но ответы не возвращаются.
Номер функции (код команды) сообщает устройству, какие данные или выполнение какого действия требует от него ведущее устройство, принимает значения от 1 до 247.
Данные – поле содержит информацию, необходимую подчиненному устройству для выполнения заданной мастером функции, или содержит данные, передаваемые подчиненным устройством в ответ на запрос ведущего. Длина и формат поля зависят от номера функции, при этом длина может быть от 0 до 254 байт.
Контрольная сумма – заключительное двухбайтное поле кадра, содержащее циклическую контрольную сумму CRC-16 всех предыдущих полей кадра. При формировании CRC используется образующий полином 1010000000000001 (А001h). Проверяется весь кадр, но действия осуществляются только над областями данных каждого байта данных. Старт и стоп биты, бит паритета, если он используется, не учитываются в контрольной сумме. Поле CRC записывается младшим байтом вперёд. Контрольная сумма завершает кадры запроса и ответа.
Стоп кадра - интервал тишины длительностью не менее 3,5 символа.
Коды команд
Коды команд разделены на четыре группы: стандартные (1-21), резерв (22-64), пользовательские (65-119) и для внутренних нужд (120-255). Назначения некоторых кодов приведены в табл. 9.
Таблица 9
Коды функций (команд) Modbus
КОД | ИМЯ | СОДЕРЖАНИЕ | Смещение адреса |
01 | Read Discrete Output Coil | Чтение значений из нескольких регистров флагов | 00001 |
02 | Read Discrete Input Contacts | Чтение статуса дискретных входов | 10001 |
03 | Read Analog Output Holding Registers | Чтение значений из нескольких регистров | 40001 |
04 | Read Analog Input Registers | Чтение входных регистров | 30001 |
05 | Write Single Discrete Output Coil | Запись значения в один флаг регистра флагов | 10001 |
06 | Write Single Analog Output Holding Register | Установка значения в один регистр | 40001 |
08 | Diagnostics - Loop-back | Тестирование связи | |
15 | Write multiple Discrete Output Coils | Запись значений в несколько регистров флагов | 10001 |
16 | Write multiple Analog Holding Register | Установка значений в несколько регистров | 40001 |
Обработка ошибок
Различают коммуникационные ошибки (связанные с искажениями при передаче данных) и логические (недопустимое значение запроса). Master после посылки сообщения ожидает ответ в установленном интервале времени. Если slave обнаружит коммуникационную ошибку в адресованном ему сообщении или не может ответить, то он промолчит, и Master по истечении установленного интервала (таймаута) фиксирует ситуацию как ошибочную. Проверка на ошибку производится приемником в пределах каждого байта (символа) по четности, в пределах кадра - по CRC.
В протоколе Modbus используется следующая диалоговая процедура.
1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ, в котором адрес и номер функции совпадает с принятыми от Master.
2. Если Slave не принимает какого либо значения, никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
3. Если Slave принимает запрос, но обнаруживает ошибку (паритет, CRC), никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
4. Если Slave принимает запрос, но не может его обработать, отправляется ответ, содержащий в области данных сведения об ошибке. Кроме того старший бит кода команды в ответе устанавливается в единицу.
Стандартные коды ошибок приведены в табл.10 .
Таблица 10
Стандартные коды логических ошибок
Код | Сведения о логической ошибке |
01 | Принятый код функции не может быть обработан на подчиненном. |
02 | Адрес данных указанный в запросе не доступен данному подчиненному. |
03 | Величина содержащаяся в поле данных запроса является не допустимой величиной для подчиненного. |
04 | Невосстанавливаемая ошибка возникла во время попытки подчиненным выполнить затребованное действие. |
05 | Подчиненный принял запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет главного от генерации ошибки таймаута. |
06 | Подчиненный занят обработкой команды. |
07 | Подчиненный не может выполнить программную функцию, принятую в запросе. |
08 | Подчиненный пытается читать расширенную память, но обнаружил ошибку паритета. |
Пример. Послан запрос на чтение группы регистров (код функции 03h). Если запрос принят без ошибки, то slave в ответе укажет также код функции 03h, а если обнаружится ошибка то - 83h. Более подробная информация будет размещена в области данных ответа. Маster должен обработать сообщение об ошибке и в типичном случае посылает повторный запрос.
Примеры кадров протокола Modbus
На рис. 16 рассмотрен запрос данных от Master на чтение в устройстве по адресу 6 (Slave Address =06h) трех регистров с 40108 по 40110 (AE41h-AE43h). Особенность указания номеров регистров в Modbus в том, что к указанным в сообщениях значениям в зависимости от кода команды добавляется смещение адреса (в нашем случае 40001). Так для данного запроса в стартовом адресе будет указано 107 (Starting Address Lo = 6Вh, Starting Address Hi=00h). Адрес приходится записывать по частям, поскольку каждое поле содержит только 8 бит, а для указания максимально возможного допустимого адреса без смещения (9998) потребуется 16 бит (270Eh). Запрашиваемое число регистров (0003h) также указывается в виде двух чисел (No. of Registers Lo=03h; No. of Registers Hi=00h). Значение контрольной секции кадра в примере не показано. Ответ, полученный от подчиненного устройства, содержит следующие сведения. Запрос принят и исполнен без обнаруженных ошибок (Function=03h); всего передается содержимое 6-ти байт данных (по два байта на каждый запрошенный регистр (Byte Count=06h); значения запрошенных регистров (Data Нi, Data Lo) составляют: 022Bh, 0000h и 0063h.
|
|
Рис. 16. Кадры протокола Modbus при запросе на чтение регистров
На рис. 17 приведен пример установки значения FFh в 40002-й регистр подчиненного устройства (смещение 40001) с адресом 01h. Кадры Master и Slave при успешном выполнении данной операции будут совпадать. Значения полей указано в шестнадцатеричном коде.
Slave adress | Function | Starting Addr Hi | Starting Addr Lo | Data Hi | Data Lo | Error Check | |
Адрес подчиненного | Номер функции | Адрес ст байта | Адрес мл байта | Данные ст.байта | Данные мл.байта | CRC мл.байт | CRC ст.байт |
01 | 06 | 00 | 01 | FF | FF | D9 | ВA |
Рис. 17. Кадр протокола Modbus при установке значения в один регистр
Пример запроса состояния 37-ми дискретных выходов (с 20 по 56) в устройстве 17 приведен на рис.18. Значение каждого выхода представляется одним битом. В кадре ответа они группируются в байты. Если возвращаемое количество выходов не кратно восьми, то оставшиеся биты в последнем байте сообщения будут установлены в 0. Счетчик байт содержит количество байт передаваемых в поле данных (5).
|
|
Рис. 18. Кадры Modbus при чтении группы дискретных данных
Дата: 2018-11-18, просмотров: 382.