Ошибки, исключения и тайм-ауты в Modbus
Ошибки в Modbus делятся на два класса: устройство ответило отказом — значит, связь есть и разбираться нужно с запросом; устройство молчит — значит, проблема в линии, адресе или параметрах порта.
Как выглядит отказ
Мы запросили регистр, которого у устройства нет:
01 03 00 6B 00 03 74 17 → 01 83 02 C0 F1
| Байты ответа | Смысл |
|---|---|
| 01 | адрес устройства |
| 83 | код функции с установленным старшим битом: 0x03 + 0x80 — признак ошибки |
| 02 | код исключения: недопустимый адрес данных |
| C0 F1 | CRC16 |
Правило простое: если код функции в ответе больше запрошенного на 0x80, это отказ, и следующий байт объясняет причину.
Коды исключений
| Код | Название | Что обычно значит на практике |
|---|---|---|
| 0x01 | Недопустимая функция | Устройство не поддерживает эту функцию. Частый случай: пытаемся читать функцией 0x04 то, что лежит в регистрах хранения |
| 0x02 | Недопустимый адрес данных | Регистра с таким адресом нет или запрошенный блок выходит за границу области. Проверьте смещение адреса |
| 0x03 | Недопустимое значение данных | Значение вне допустимого диапазона или запрошено слишком много элементов |
| 0x04 | Отказ устройства | Внутренняя ошибка: не готово, заблокировано, идёт другая операция |
| 0x05 | Подтверждение | Команда принята, но выполняется долго — ответ придёт позже; редко встречается |
| 0x06 | Устройство занято | Повторите запрос позже |
| 0x08 | Ошибка чётности памяти | Проблема с памятью устройства |
| 0x0B | Шлюз: устройство не отвечает | Ответ пришёл от шлюза Modbus TCP, а не от прибора: за шлюзом никого нет по указанному unit id |
Коды 0x0A и 0x0B возвращает именно шлюз — это важная подсказка при работе через преобразователь интерфейсов: связь до шлюза есть, дальше нет.
Когда устройство молчит
- Не тот адрес. Самое частое. Помогает опрос по всем адресам подряд — короткий запрос 0x03 на один регистр, пауза, следующий адрес.
- Не те параметры порта. Скорость, чётность, стоп-биты должны совпадать точно. Классика: устройство настроено на 9600 8E1, а мастер работает 9600 8N1.
- Перепутаны A и B. В RS-485 обозначения у производителей не совпадают; если ответа нет — поменяйте местами, хуже не станет.
- Нет терминаторов. На длинной линии и высокой скорости без согласующих резисторов 120 Ом на концах связь работает нестабильно: пакеты то проходят, то нет.
- Слишком короткий тайм-аут. Прибору нужно время на измерение; тайм-аут меньше 300–500 мс на медленной линии часто оказывается преждевременным.
- Два мастера в одной линии. Опрос двумя программами одновременно даёт «случайные» пропажи ответов.
Повреждённые кадры
Если CRC не сошёлся, кадр молча отбрасывается — ни ответа, ни сообщения об ошибке. Поэтому редкие пропажи ответов на зашумлённой линии выглядят так же, как тайм-аут. Отличить помогает счётчик: если из ста запросов теряются два-три и всегда на длинных ответах — это помехи, а не адресация.
Порядок диагностики
- Проверьте, идёт ли обмен физически — по индикаторам преобразователя или осциллографом на линии.
- Убедитесь, что мастер один.
- Прочитайте один регистр по известному адресу — минимальный запрос отсекает половину причин.
- Получили отказ — читайте код исключения, он точно указывает, что не так с запросом.
- Молчание при верных параметрах — переберите адреса, затем скорости и чётность.
- Работает через раз — смотрите терминаторы, длину линии, экран кабеля и заземление.
В контроллерах ТК16L и E-422 обмен по каждому каналу протоколируется, поэтому разбор обычно сводится к чтению журнала: видно, ушёл ли запрос и что вернулось.
