Просмотр полной версии : MODBUS TCP -> MODBUS RTU
Добрый день.
Написал конвертор MODBUS TCP в MODBUS RTU.
Проверил на следующем стенде комп (модбас TCP мастер) - овен - ноут (модбас рту слейв). Работает идельно, обрывов связи нет потерянных данных нет. Использовались программки MOBUS POLL и MODBUS SLAVE. при подключении заместо ноута самопальной платы (модбас рту слейв) начались потери пакетов и отсутствие ответов в 75 % запросов. причем отдельно плата с мастером MODBUS RTU работает отлично. ПОМОГИТЕ найти причину!!!! уже 4 дня мучаюсь (
как то Вы фривольно в конвертере относитесь к количеству бит на 4-5 знакоместе, и запросы на запись будут больше 12 байт а Вы равенство ставите
а по поводу потерь, если это программные проблемы, возможно все симуляторы модбаса могут автоматически определять порядок передачи байт,а в случае с Вашей самопальной платой Вы не угадали с порядком, отсюда в слейве возникает логическая ошибка, например несоответствие контрольной суммы и ответ не отправляется
спасибо что заинтересовались моей проблемой
12 байт это команды 3 и 6 (только их юзаю).
не понял на счет 4-5 знакоместа что это и где?
а так же не очень понял на счет передачи байт.. что то совсем запутался..( сама плата работает как модбас рту слейв. с мастером сопрягается напрямую без проблем.
работая с двумя этими функциями, значит и регистров не так много обрабатываете, поэтому длинна пакета уложится и в один байт.
Передача может осуществлятся четырьмя способами, старшим или младшим словом вперед и еще в каждом слове старшим или младшим байтом вперед, если Ваша плата запрограммирована на одну из этих комбинаций, при приеме остальных будет выдаваться ошибка контрольной суммы, по стандарту
2. Если Slave не принимает какого-либо значения, никакого ответа не отправляется. Master диагностирует ошибку по тайм-ауту.
3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC, or CRC), никакого ответа не отправляется. Master диагностирует ошибку по тайм-ауту.
так есть же вроде стандарт что в каком порядке слать.старший адрес вперед затем младший полуадрес ). вот на счет битиков не знаю.. поразбираюсь... спасибо за пинок в нужном направлении )
вот лог обмена со стороны модбас TCP мастера
те видно что приходит корректный ответ только на каждую 5-ую посылку
с последовательностью передачи отпадает, раз есть ответы, значит понимает расположение, а что модбас мастера , выдают ли какие нибудь ошибки по таймауту. Может период опроса увеличите и таймаут заодно
еще раз спасибо что не потеряли интерес к моей проблеме
увеличение времени опроса и таймаута никаких положительных последствий не имеет.
бесит то что просто связаться по модбасу рту с платой нет никаких проблем.. на 115200 отлично все работает
еще раз спасибо что не потеряли интерес к моей проблеме
увеличение времени опроса и таймаута никаких положительных последствий не имеет.
а где увеличиали, со стороны ТСР мастера или RTU мастера
и со стороны TCP и со стороны rtu и по проему rtu
В онлайне в ПЛК в буфере приема rcvbuf этапа psGET_MODBUS_RTU происходит при каждом запросе наполнение? И опять же я бы там знак равенства не ставил (IF sz = modbus_answer_size THEN), потому как ответ с ошибкой будет кажется всего пять байт, достаточно будет написать sz>0
и еще по точке psGET_MODBUS_RTU вот не совпало количество принятых данных, Вы перенапровляете снова на эту точку, и что получается таймер снова запускается на 200мс, а мастер ТСР то продолжает ждать ответ, каков же у него должен стоять таймаут в таком случае.И еще по поводу приема данных, надо читать порт пока sz не будет равно нулю, а в случае такого таймера чтения всего буфера неполучится, как бы вообще такой код не должен работать
IF sz = modbus_answer_size THEN этим я проверяю хотя бы корректность ответа (что пришла правильная длина )
согласен. читать нужно до тех пор пока буфер не пустой.. завтра перепишу , но не понятно почему на тестовых программах все работало...
причем всяески менял и длину считываемых данных и периоды опроса..
Тут можно намного все упростить, используя modbus.lib. Вам останется принять пакет ТСР, получить код функции, по нему выбрать соответствующий блок библиотеки, заполнить необходимыми данными, полученный ответ данных запихать в пакет ТСР и отправить мастеру
на тестовых программах все работало...
тестовые программы для того и нужны разработчикам, чтоб им понять где они ошибаются, поэтому эти программы не так критичны на некорректные запросы и времена
да использовать modbus lib можно, но есть идея расширить набор команд (функций) и тогда модбас либ становиться безполезной (
А кто мешает потом добавить подобные функции в проекте, главное же отработать преобразование в ПЛК, начните с того что гарантированно работает, когда пропадут ошибки в проекте, займетесь и доработкой функций библиотеки
эхххх спасибо что уделили мне время. думаю что я домучаю то что уже сделано. как говориться наши руки не для скуки
можно еще сократить код и вместо
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);
ну например приема - передачи строковой инфы , файлов или разношерстной служебной информации
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot