Страниц: [1]
  Печать  
Автор Тема: Modbus/TCP ошибочный пакет  (Прочитано 5221 раз)
juvf
Участник
*
Offline Offline

Сообщений: 22


Просмотр профиля
« : Июля 15, 2009, 03:04:58 pm »

Что делать слэйву, если пакет с ошибкой?

В Modbus RTU всё понятно. Если адрес не тот, или CRC не совпал, то молчим. А если не то значение или не допустимые данные, то отвечаем исключением. А как в Modbus/TCP ?

В спецификации протокола описан следующий формат:

Цитировать
Запрос и ответ предваряются шестью следующими байтами:
байт 0: идентификатор транзакции – копируется сервером – обычно 0
байт 1: идентификатор транзакции – копируется сервером – обычно 0
байт 2: идентификатор протокола = 0
байт 3: идентификатор протокола = 0
байт 4: поле длины (старший байт) = 0 (так как все сообщения меньше 256)
байт 5: поле длины (младший байт) = количество следующих байтов
байт 6: идентификатор устройства (раньше «адрес SLAVE»)
байт 7: код функции MODBUS
байт 8:  данные, если требуется

Существует транспорто-зависимый префикс, который в случае MODBUS/TCP включает в себя семь байт:
ref ref 00 00 00 len unit
«ref ref» – два байта «смещения транзакции» - число, которое не имеет значения на сервере, но копируется дословно от запроса к ответу для удобства клиента. Простые клиенты обычно оставляют эти значения нулевыми.

Слэйв получит пакет по TCP, в котором транспорто-зависимый префикс будет с ошибкой, например идентификатор протокола будет не равен 0, или поле длины будет равно 1234, при допустимом 255 - что делать? Разрывать соединение? или игнорировать пакет(молчать), или ответить исключением с кодом ошибки?


Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #1 : Июля 15, 2009, 04:32:05 pm »

TCP имеет свою CRC и гарантирует доставку неискаженного пакета. Если мастер-идиот и шлет что не попадя, то хоть игнорируй, хоть отвечай исключением, это вряд ли поможет. Но вроде бы, игнорировать надо таких мастеров, ИМХО.
Записан
juvf
Участник
*
Offline Offline

Сообщений: 22


Просмотр профиля
« Ответ #2 : Июля 15, 2009, 09:13:07 pm »

Цитировать
Но вроде бы, игнорировать надо таких мастеров, ИМХО.

Я сейчас пока решил тоже по "имхо" реализовывать, т.е. игнорировать. Но как такие ситуации стандарт оговаривает? Например в МЭК 104 (МЭК по TCP) чётко оговорено, что если пакет содержит бред, то нужно разорвать соединение. А в Modbus/TCP как?
Записан
oder
Гость
« Ответ #3 : Июля 15, 2009, 09:27:05 pm »

Я сейчас пока решил тоже по "имхо" реализовывать, т.е. игнорировать. Но как такие ситуации стандарт оговаривает? Например в МЭК 104 (МЭК по TCP) чётко оговорено, что если пакет содержит бред, то нужно разорвать соединение. А в Modbus/TCP как?

Самое надёжое - выйти из строя.  Wink Чтоб знали, сволочи.  Grin
А ещё, классная идея, если есть саунд, - материться в динамик.  Wink
« Последнее редактирование: Июля 15, 2009, 09:29:13 pm от oder » Записан
juvf
Участник
*
Offline Offline

Сообщений: 22


Просмотр профиля
« Ответ #4 : Июля 16, 2009, 08:17:57 am »

Нашел. В "MODBUS Messaging on TCP/IP Implementation Guide V1.0b" от 2006 года говорится

Цитировать
The MODBUS PDU Checking function consists of first parsing the MBAP Header. The Protocol Identifier field has to be checked :
       If it is different from MODBUS protocol type, the indication is simply discarded.

т.е. просто молчим
Записан
Страниц: [1]
  Печать  
 
Перейти в: