Показано с 1 по 5 из 5

Тема: Какой же размер приёмного буфера у порта RS485?

  1. #1

    По умолчанию Какой же размер приёмного буфера у порта RS485?

    Здравствуйте.
    Столкнулся с непонятным явлением. При приёме посылки, если её размер больше 512 байт, к примеру 651 байт, первые 512 байт теряются и команда
    ResultOfSysComRead:= SysComRead(SerialPort, pnt_Response, 1024, 0);
    считывает только 139 байт.
    Если же принимаемая телеграмма размером меньше 512 байт, то считывается полностью. Получается, что размер буфера приёма не 1 килобайт, как было сказано ранее на форуме, а 512 байт. И если буфер приёма переполняется, то его содержимое сбрасывается и поступающие символы пишутся в очищеный буфер. То есть буфер не кольцевой.
    Как это понимать?

  2. #2

    По умолчанию

    Прошло 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. Надеюсь, что истина не посередине.

  3. #3

    По умолчанию

    Насчет продолжительности времени между вопросом и ответом. К сожалению летом значительное количество сотрудников уходит в отпуск. Так уж получается, что техподдержка не может ответить на все вопросы ( ответ знают только разработчики). Соотв. поскольку Филоненко сейчас в отпуске попробую ответить я.
    ....
    Как считать данные из буффера
    1) Буфер (внутренний) который находится внутри ядра контроллера - нужно игнорировать.
    2) Данные, которые считывются коммандой SysComRead пропадают из буфера (внутреннего) соотвественно надо их непрерывно добавлять во внешний буфер определенный в программе CoDeSys
    Т.о. если вы будете каждый цикл ПЛК считывать и добавлять несколько байт принятых за этот цикл в свой буфер (с контролем размера), а потом разбирать это гарантирует правильность приема. (Скажу по секрету - аналогично работает библиотека SysLibCom на любом другом контроллере под CoDeSys - Wago,Beckhoff,Turk - только никому не говорите - это тайна!!! )
    3) Как только процедура разбора буфера обнаружит правильный кадр в буфере программы -нужно с ним работать в соответствии с алгоритмом а потом очистить из буфера

    Ключ к работе с SysComRead - частота вызова - желательно раз в ms

    P.S. Приходилось работать с частотником через SysLibCom - вроде бы не было никаких проблем кроме формирования запроса/разбора ответа.
    Последний раз редактировалось Малышев Олег; 21.08.2008 в 09:31.

  4. #4

    По умолчанию

    Описаный Вами вариант универсален и, действительно, позволяет работать с внутренним буфером малого размера. Лишь бы не успевал заполниться между циклами ПЛК.
    Но. Такой вариант требует большего количества обслуживающего кода, а это не есть гут. Сложнее пишется, сложнее отлаживается, сложнее изучается другими. По этому, когда протокол позволяет, я предпочитаю другой алгоритм:
    Послал команду -> выждал паузу -> считал из внутреннего буфера весь ответ.
    Реализация получается проще, работает надёжно. Вот только знать бы заранее размер буфера

    P.S. Приходилось работать с вычислителем EK 260 через SysLibCom по описанному "простому" алгоритму - никаких проблем, кроме косяков в RS-485 в самом вычислителе, несоответствия настроек и описания и неполноты описания протокола.

  5. #5

    По умолчанию

    А Вы уверены что весь ответ без мусора уже в буфере? Всё равно для уверенного безошибочного разбора необходимо анализировать входной поток посимвольно.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •