Структура сообщения протокола Modbus имеет следующий вид:

где:

  1. адрес ведомого устройства – это адрес устройства, которому адресовано данное сообщение протокола Modbus. Устройства отвечают только на те сообщения, которые адресованы именно им. Ответ начинается с адреса ведомого устройства. Адрес изменяется в пределах 1…247. Адрес 0 в сообщении протокола Modbus зарезервирован под широковещательные сообщения, 248..255 – зарезервированные адреса.
  2. номер функции – 1 байт данных.
  3. данные – это поле содержит информацию о функции, которую нужно выполнить, либо данные, которые ведомое устройство посылает мастеру протокола Modbus.
  4. блок обнаружения ошибок (CRC) – контрольная сумма, которая вычисляется со всех предыдущих байт путем алгоритма циклического сдвига и побитового исключения.

Необходимо обратить внимание, что при чтении по протоколу Modbus в одном сообщении можно считывать значение дискретных или аналоговых входов и выходов, расположенных подряд, то есть задать адрес первого значения и их количество.

Рассмотрим основные стандартные функции протокола Modbus по их кодам (в десятичном и шестнадцатеричном формате):
• 1 (0х01) – чтение нескольких дискретных выходов
• 2 (0х02) — чтение нескольких дискретных входов
• 3 (0х03) — чтение нескольких промежуточных регистров или аналоговых выходов
• 4 (0х04) – чтение нескольких аналоговых входов
Если, например, количество дискретных входов, которые сформированы в запросе, не кратно восьми, то количество байт значений округляется в большую сторону и, соответственно, для получения, например, значений 15 дискретных входов, это количество будет равно двум байтам.
Перед данными сообщения Modbus передается один байт, значение которого — количество байт данных.
• 5 (0x05) — запись значения одного дискретного выхода
• 6 (0x06) — запись значения одного аналогового выхода или регистра
Команда Modbus состоит из адреса и собственно значения (2 байта). Нормальный ответ – повтор запроса протокола Modbus.
• 15 (0x0F) — запись значений в нескольких дискретных выходов
• 16 (0x10) — запись значений нескольких аналоговых выходов или регистров
Ответ состоит из начального адреса регистра и количества измененных значений.
Пример запроса/ответа протокола Modbus:

Ошибки при передаче делятся на 2 типа – искажение при передаче и логические. Искажение отслеживается по времени «тишины». Нормальное время между сообщениями – время, необходимое на передачу 3,5 символов. Если во время передачи сообщения протокола Modbus возникла пауза длинной более 1,5 символа, пакет отбрасывается.

Логические ошибки протокола Modbus возникают, если slave не может принять сообщение вообще, либо принимает его, но выдает ошибку. В таком случае ошибка диагностируется по тайм-ауту. Slave принимает запрос, но не может его обработать (к примеру, обращение к несуществующему адресу) – в таком случае отсылается сообщение об ошибке.

Пример сообщения Modbus об ошибке на запрос:

Стандартные коды ошибок протокола Modbus:
• 01 —Функция не может быть обработана на slave.
• 02 — Несуществующий адрес данных.
• 03 — Значение в поле данных для запроса, является недопустимым для salve.
• 04 — Произошла необратимая ошибка, пока slave пытался выполнить действие.
• 05 — Slave принял запрос и начал обрабатывать его, но на это потребуется время. Этот код предохраняет master от выдачи ошибки тайм-аута.
• 06 — Slave занят обработкой команды.Master должен повторить посылку сообщения позже, когда slave будет свободен.
• 07 —Slave не может выполнить функцию из запроса. Master должен послать запрос об диагностической информации или получить информацию об ошибках со slave.
• 08 — Slave пытается считать область памяти, но при этом обнаружена ошибка паритета. Master может повторить запрос, но обычно в таких случаях требуется ремонт.

Структура кадра Modbus TCP:


где:
• ID транзакции — два байта
• ID протокола — два байта (четыре нуля)
• длина пакета — два байта, размер последующих полей сообщения
• адрес ведомого устройства — адрес slave, которому адресован запрос протокола Modbus.
Особенность протокола Modbus TCP – отсутствие контрольной суммы, так как на транспортном уровне протокола TCP происходит проверка CRC. Поэтому проверка контрольной суммы в формате RTU не имеет смысла.

Tags

 
Поделиться в Ok Ok Ok Ok Share for Odnoklassniki Ok Ok

0 Комментариев

Вы можете первым оставить свой комментарий.

Оставить комментарий

 




 

Вы же не робот? *