Вход

Просмотр полной версии : MODBUS TCP -> MODBUS RTU



v97ssv
07.11.2011, 10:09
Добрый день.
Написал конвертор MODBUS TCP в MODBUS RTU.
Проверил на следующем стенде комп (модбас TCP мастер) - овен - ноут (модбас рту слейв). Работает идельно, обрывов связи нет потерянных данных нет. Использовались программки MOBUS POLL и MODBUS SLAVE. при подключении заместо ноута самопальной платы (модбас рту слейв) начались потери пакетов и отсутствие ответов в 75 % запросов. причем отдельно плата с мастером MODBUS RTU работает отлично. ПОМОГИТЕ найти причину!!!! уже 4 дня мучаюсь (

capzap
07.11.2011, 10:40
как то Вы фривольно в конвертере относитесь к количеству бит на 4-5 знакоместе, и запросы на запись будут больше 12 байт а Вы равенство ставите
а по поводу потерь, если это программные проблемы, возможно все симуляторы модбаса могут автоматически определять порядок передачи байт,а в случае с Вашей самопальной платой Вы не угадали с порядком, отсюда в слейве возникает логическая ошибка, например несоответствие контрольной суммы и ответ не отправляется

v97ssv
07.11.2011, 13:03
спасибо что заинтересовались моей проблемой
12 байт это команды 3 и 6 (только их юзаю).
не понял на счет 4-5 знакоместа что это и где?
а так же не очень понял на счет передачи байт.. что то совсем запутался..( сама плата работает как модбас рту слейв. с мастером сопрягается напрямую без проблем.

capzap
07.11.2011, 14:11
работая с двумя этими функциями, значит и регистров не так много обрабатываете, поэтому длинна пакета уложится и в один байт.
Передача может осуществлятся четырьмя способами, старшим или младшим словом вперед и еще в каждом слове старшим или младшим байтом вперед, если Ваша плата запрограммирована на одну из этих комбинаций, при приеме остальных будет выдаваться ошибка контрольной суммы, по стандарту
2. Если Slave не принимает какого-либо значения, никакого ответа не отправляется. Master диагностирует ошибку по тайм-ауту.
3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC, or CRC), никакого ответа не отправляется. Master диагностирует ошибку по тайм-ауту.

v97ssv
07.11.2011, 14:32
так есть же вроде стандарт что в каком порядке слать.старший адрес вперед затем младший полуадрес ). вот на счет битиков не знаю.. поразбираюсь... спасибо за пинок в нужном направлении )

v97ssv
07.11.2011, 15:16
вот лог обмена со стороны модбас TCP мастера

v97ssv
07.11.2011, 15:17
те видно что приходит корректный ответ только на каждую 5-ую посылку

capzap
07.11.2011, 15:40
с последовательностью передачи отпадает, раз есть ответы, значит понимает расположение, а что модбас мастера , выдают ли какие нибудь ошибки по таймауту. Может период опроса увеличите и таймаут заодно

v97ssv
07.11.2011, 15:51
еще раз спасибо что не потеряли интерес к моей проблеме
увеличение времени опроса и таймаута никаких положительных последствий не имеет.

v97ssv
07.11.2011, 15:52
бесит то что просто связаться по модбасу рту с платой нет никаких проблем.. на 115200 отлично все работает

capzap
07.11.2011, 16:08
еще раз спасибо что не потеряли интерес к моей проблеме
увеличение времени опроса и таймаута никаких положительных последствий не имеет.

а где увеличиали, со стороны ТСР мастера или RTU мастера

v97ssv
07.11.2011, 16:12
и со стороны TCP и со стороны rtu и по проему rtu

capzap
07.11.2011, 16:52
В онлайне в ПЛК в буфере приема rcvbuf этапа psGET_MODBUS_RTU происходит при каждом запросе наполнение? И опять же я бы там знак равенства не ставил (IF sz = modbus_answer_size THEN), потому как ответ с ошибкой будет кажется всего пять байт, достаточно будет написать sz>0

capzap
07.11.2011, 17:14
и еще по точке psGET_MODBUS_RTU вот не совпало количество принятых данных, Вы перенапровляете снова на эту точку, и что получается таймер снова запускается на 200мс, а мастер ТСР то продолжает ждать ответ, каков же у него должен стоять таймаут в таком случае.И еще по поводу приема данных, надо читать порт пока sz не будет равно нулю, а в случае такого таймера чтения всего буфера неполучится, как бы вообще такой код не должен работать

v97ssv
07.11.2011, 17:14
IF sz = modbus_answer_size THEN этим я проверяю хотя бы корректность ответа (что пришла правильная длина )

v97ssv
07.11.2011, 17:16
согласен. читать нужно до тех пор пока буфер не пустой.. завтра перепишу , но не понятно почему на тестовых программах все работало...
причем всяески менял и длину считываемых данных и периоды опроса..

capzap
07.11.2011, 17:17
Тут можно намного все упростить, используя modbus.lib. Вам останется принять пакет ТСР, получить код функции, по нему выбрать соответствующий блок библиотеки, заполнить необходимыми данными, полученный ответ данных запихать в пакет ТСР и отправить мастеру

capzap
07.11.2011, 17:22
на тестовых программах все работало...

тестовые программы для того и нужны разработчикам, чтоб им понять где они ошибаются, поэтому эти программы не так критичны на некорректные запросы и времена

v97ssv
07.11.2011, 17:34
да использовать modbus lib можно, но есть идея расширить набор команд (функций) и тогда модбас либ становиться безполезной (

capzap
07.11.2011, 17:40
А кто мешает потом добавить подобные функции в проекте, главное же отработать преобразование в ПЛК, начните с того что гарантированно работает, когда пропадут ошибки в проекте, займетесь и доработкой функций библиотеки

v97ssv
07.11.2011, 17:43
эхххх спасибо что уделили мне время. думаю что я домучаю то что уже сделано. как говориться наши руки не для скуки

capzap
07.11.2011, 17:58
можно еще сократить код и вместо
FOR _i:=0 TO 255 BY 1 DO
rcvBUF[ _i ] :=0;
sendTCPBuffer[ _i ] :=0;
END_FOR
написать к примеру SysMemSet(ADR(rcvBUF[0]),0,256);SysMemSet(ADR(sendTCPBuffer[0]),0,256);

v97ssv
08.11.2011, 08:03
ну например приема - передачи строковой инфы , файлов или разношерстной служебной информации