
- •Технические характеристики интерфейса rs-485
- •Общее описание протокола Modbus rtu
- •Адресация данных в протоколе Modbus rtu
- •Контроль ошибок в протоколе Modbus rtu
- •Rtu фрейм
- •Логические ошибки
- •Стандартные коды ошибок
- •Стандартные коды функций протокола Modbus
- •0X10 Preset Multiple Registers (Установка значений в несколько регистров)
- •0X03 Read Holding Registers (Чтение значений из нескольких регистров)
- •0X06 Preset Single Register (Установка значения в один регистр)
- •0X01 Read Coil Status (Чтение значений из нескольких регистров флагов)
- •0X0f Force Multiple Coils (Запись значений в несколько регистров флагов)
- •0X05 Force Single Coil (Запись значения в один флаг регистра флагов)
- •0X50 Set date and time (Установка даты и времени)
- •Ссылки на используемые в статье источники
- •Утилиты
- •Правильная разводка сетей rs-485
- •Что такое витая пара и почему она используется?
- •Волновое сопротивление витой пары
- •Число витых пар на каждый передатчик
- •Согласующие резисторы
- •Максимальное число передатчиков и приемников в сети
- •Примеры правильных сетей
- •Один передатчик, один приемник
- •Неправильное расположение терминатора
- •Составные кабели
- •Длинные ответвители
Контроль ошибок в протоколе Modbus rtu
Во время обмена данными могут возникать ошибки двух типов:
-
ошибки, связанные с искажениями при передаче данных;
-
логические ошибки.
Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001).
Rtu фрейм
В RTU режиме сообщение должно начинаться и заканчиваться интервалом тишины - временем передачи не менее 3.5 символов при данной скорости в сети. Первым полем затем передаётся адрес устройства.
Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала.
Фрейм сообщения передаётся непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство должно игнорировать этот фрейм как неполный.
Таким образом, новое сообщение должно начинаться не раньше 3.5 интервала, т.к. в этом случае устанавливается ошибка.
Немного об интервалах (речь идёт о Serial Modbus RTU): при скорости 9600 и 11 битах в кадре (стартовый бит + 8 бит данных + бит контроля чётности + стоп-бит): 3.5 * 11 / 9600 = 0,00401041(6), т.е. более 4 мс; 1.5 * 11 / 9600 = 0,00171875, т.е. не более 1 мс. Для скоростей более 19200 бод допускается использовать интервалы 1,75 и 0,75 мс соотвественно.
Логические ошибки
Для сообщений об ошибках второго типа протокол 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 |
Таблица 2-1. Кадр ответа (Slave→Master) при возникновении ошибки modbus RTU |
Стандартные коды ошибок
01 Принятый код функции не может быть обработан на подчиненном.
02 Адрес данных указанный в запросе не доступен данному подчиненному.
03 Величина содержащаяся в поле данных запроса является не допустимой
величиной для подчиненного.
04 Невосстанавливаемая ошибка имела место пока подчиненный пытался выполнить
затребованное действие.
05 Подчиненный принял запрос и обрабатывает его, но это требует много времени.
Этот ответ предохраняет главного от генерации ошибки таймаута.
06 Подчиненный занят обработкой команды.
Главный должен повторить сообщение позже, когда подчиненный освободится.
07 Подчиненный не может выполнить программную функцию, принятую в запросе.
Этот код возвращается для неудачного программного запроса, использующего
функции с номерами 13 или 14.
Главный должен запросить диагностическую информацию или информацию об
ошибках с подчиненного.
08 Подчиненный пытается читать расширенную память, но обнаружил ошибку паритета.
Главный может повторить запрос, но обычно в таких случаях требуется ремонт.