ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
20 октября
1467115 Топик полностью
Kyкycик (03.10.2024 02:02, просмотров: 9) ответил IBAH на А кто силен в чтении аглицких стандартов? В стандарте ModbasTCP где нибудь написано, что "один пакет Модбас - один пакет TCP/UDP", допускается бить пакет Модбас на несколько пакетов TCP/UDP? Распространяются ли эти требования на Modbus(RTU/ASCII) over TCP/UDP?
Ответ аффтару. 

Причем на мой ответ можно 100% полагаться, так как и modbus, и tcp и udp и ip я использовал и использую.

TCP по своему устройству и логике устроен как "две трубы", передающая и принимающая. Эмбеддеру TCP можно представлять себе как две линии UART, RX и TX, всё остальное программно. Именно вот в TCP нет никаких "пакетов". Нельзя на уровне TCP явно и гарантированно определить приход пакета потому что это просто поток, тут получается так, что вообще-то если ты укладываешься в MTU к принимающему устройству придет в точности такой же фрагмент данных который ты послал, но прям полагаться на это и закладывать в свою программу никак нельзя, так что понять "начало" и "конец" ты не можешь. В особенности потому что реальные IP пакеты лежащие под TCP могут изменять свой размер прям по ходу действа. Также по времени (паузам) понять нельзя, потому что даже в локалке могут быть ретрансмиссии, фрагментация, вклинивания других приоритетных пакетов других протоколов, внезапный Ethernet трафик да и вообще никаких гарантий нет.

Для того чтобы различать MODBUS TCP посылки (т.е. определять начало и конец) необходимо строить программный (логический) парсер, который из бесконечного потока передаваемого через TCP "трубу" будет программно определять MODBUS посылку и ее длину. И только так. Иного пути нет. Это элементарно понятно если спросить поисковик "modbus tcp protocol"

https://ipc2u.ru/articles/prostye-resheniya/modbus-tcp/

По ссылке надо быть аккуратным и не торопыжничать, они зачем-то в статье приводят примеры Modbus RTU в которых есть CRC, в Modbus TCP ее нет, потому что TCP гарантирует доставку, фрагмент данных (из бесконечного потока) с битой CRC тебе никак не придет и на уровне протокола будет перезапрошен.

На уровне UDP в отличие от TCP факт прихода пакетов существует прям явно, однако никто Modbus посылки в UDP пакеты не заворачивает, как это собрался делать ты. UDP используют тоже как передачу произвольного потока и в точности так же, парсят поток данных на логическом уровне для выделения MODBUS посылок. Гарантий доставки и невыпадения пакетов (кусков потока) в UDP в отличие от TCP нет, поэтому потоковый механизм и гарантии доставки через UDP предстоит реализовать самому, полностью программно-логически.

Модбас библиотек вагон и маленькая тележка, Libmodbus например.