QNX.ORG.RU

Разработка => Языки и алгоритмы => Тема начата: juvf от Июля 15, 2009, 03:04:58 pm



Название: Modbus/TCP ошибочный пакет
Отправлено: juvf от Июля 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 - что делать? Разрывать соединение? или игнорировать пакет(молчать), или ответить исключением с кодом ошибки?




Название: Re: Modbus/TCP ошибочный пакет
Отправлено: ed1k от Июля 15, 2009, 04:32:05 pm
TCP имеет свою CRC и гарантирует доставку неискаженного пакета. Если мастер-идиот и шлет что не попадя, то хоть игнорируй, хоть отвечай исключением, это вряд ли поможет. Но вроде бы, игнорировать надо таких мастеров, ИМХО.


Название: Re: Modbus/TCP ошибочный пакет
Отправлено: juvf от Июля 15, 2009, 09:13:07 pm
Цитировать
Но вроде бы, игнорировать надо таких мастеров, ИМХО.

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


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

Самое надёжое - выйти из строя.  ;) Чтоб знали, сволочи.  ;D
А ещё, классная идея, если есть саунд, - материться в динамик.  ;)


Название: Re: Modbus/TCP ошибочный пакет
Отправлено: juvf от Июля 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.

т.е. просто молчим