-
Какой же размер приёмного буфера у порта RS485?
Здравствуйте.
Столкнулся с непонятным явлением. При приёме посылки, если её размер больше 512 байт, к примеру 651 байт, первые 512 байт теряются и команда
ResultOfSysComRead:= SysComRead(SerialPort, pnt_Response, 1024, 0);
считывает только 139 байт.
Если же принимаемая телеграмма размером меньше 512 байт, то считывается полностью. Получается, что размер буфера приёма не 1 килобайт, как было сказано ранее на форуме, а 512 байт. И если буфер приёма переполняется, то его содержимое сбрасывается и поступающие символы пишутся в очищеный буфер. То есть буфер не кольцевой.
Как это понимать?
-
Прошло 20 дней и ни ответа, ни привета. Впечатляет.
Для полноты картины приведу две ссылки с этого форума, где ответы на заданный мной вопрос, мягко говоря, отличаются.
http://www.owen.ru/forum/showthread....E1%F3%F4%E5%F0
и
http://www.owen.ru/forum/showthread....E1%F3%F4%E5%F0
Отвечал один и тот же человек. Между ответами - две недели.
P.S. Надеюсь, что истина не посередине.
-
Пользователь
Насчет продолжительности времени между вопросом и ответом. К сожалению летом значительное количество сотрудников уходит в отпуск. Так уж получается, что техподдержка не может ответить на все вопросы ( ответ знают только разработчики). Соотв. поскольку Филоненко сейчас в отпуске попробую ответить я.
....
Как считать данные из буффера
1) Буфер (внутренний) который находится внутри ядра контроллера - нужно игнорировать.
2) Данные, которые считывются коммандой SysComRead пропадают из буфера (внутреннего) соотвественно надо их непрерывно добавлять во внешний буфер определенный в программе CoDeSys
Т.о. если вы будете каждый цикл ПЛК считывать и добавлять несколько байт принятых за этот цикл в свой буфер (с контролем размера), а потом разбирать это гарантирует правильность приема. (Скажу по секрету - аналогично работает библиотека SysLibCom на любом другом контроллере под CoDeSys - Wago,Beckhoff,Turk - только никому не говорите - это тайна!!! )
3) Как только процедура разбора буфера обнаружит правильный кадр в буфере программы -нужно с ним работать в соответствии с алгоритмом а потом очистить из буфера
Ключ к работе с SysComRead - частота вызова - желательно раз в ms
P.S. Приходилось работать с частотником через SysLibCom - вроде бы не было никаких проблем кроме формирования запроса/разбора ответа.
Последний раз редактировалось Малышев Олег; 21.08.2008 в 09:31.
-
Описаный Вами вариант универсален и, действительно, позволяет работать с внутренним буфером малого размера. Лишь бы не успевал заполниться между циклами ПЛК.
Но. Такой вариант требует большего количества обслуживающего кода, а это не есть гут. Сложнее пишется, сложнее отлаживается, сложнее изучается другими. По этому, когда протокол позволяет, я предпочитаю другой алгоритм:
Послал команду -> выждал паузу -> считал из внутреннего буфера весь ответ.
Реализация получается проще, работает надёжно. Вот только знать бы заранее размер буфера
P.S. Приходилось работать с вычислителем EK 260 через SysLibCom по описанному "простому" алгоритму - никаких проблем, кроме косяков в RS-485 в самом вычислителе, несоответствия настроек и описания и неполноты описания протокола.
-
А Вы уверены что весь ответ без мусора уже в буфере? Всё равно для уверенного безошибочного разбора необходимо анализировать входной поток посимвольно.
Ваши права
- Вы не можете создавать новые темы
- Вы не можете отвечать в темах
- Вы не можете прикреплять вложения
- Вы не можете редактировать свои сообщения
-
Правила форума