Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 20

Тема: SysLibCom.lib (SysComRead) потеря байтов.

  1. #1

    По умолчанию SysLibCom.lib (SysComRead) потеря байтов.

    Приветствую, столкнулся со следующей проблемой на ПЛК 110-30. порт RS232(COM1)
    При чтении из буфера КОМ порта теряются байты, причем не начало или конец а середина.
    Для отладки, в ком писал буфер 255байт со значениями от 1 до 255, заметил что пропадают
    значения ....1,2,3,5,7,8,9,10,15,16,17, т.е куда то делись 4, 6 ,11 и, тд. закономерности особой нет,
    могут теряться и другие.
    Если оставить в проекте только процедуру чтения из порта то все вродебы в порядке, если сменить скорость на 9600, тоже становится легче.
    Но в проекте крутится 5 сокетов, 1 ПИД и деть их никуда нельзя. И вот когда это все в куче работает получаю потерю байт.
    Время цикла(MinCycleLength) менял в пределах от 1 до 50, остановился на 0, не помогло.
    параметр dwBytesToRead, функции SysComRead, менял, было 1,2,3,4,8,16,32,64,128,255.

    ReadTimeout(IN:=(ByteResive=0),PT:=T#10ms); Таймаут приема менял до 1000мс, Т.к данные шлю я то я их отправлял с интервалом 1 раз в 3 сек.
    на скорости 9600 теряется 5% посылок
    на скорости 19200 уже 50%
    на скорости 115200 потеря 95% битых посылок

    Кусок кода чтения из порта:
    IF SerialOpen THEN
    ByteResive := SysComRead(Port,ReciveBuffer+totalBytesResive,255, 0);
    ReadTimeout(IN:=(ByteResive=0),PT:=T#10ms);
    IF ByteResive > 0 THEN
    totalBytesResive := totalBytesResive + ByteResive;
    END_IF
    IF ReadTimeout.Q THEN
    ReadTimeout(IN:=FALSE);
    IF totalBytesResive > 0 THEN
    uiBytesResive := DWORD_TO_UINT(totalBytesResive);
    END_IF
    totalBytesResive := 0;
    DataReceptionFinish := INIT;
    serSTATE := serREAD;
    INIT:=TRUE;
    END_IF
    ELSE
    serSTATE := serOPEN;
    END_IF
    кто что посоветует?
    Какой физический буфер ком порта?
    Как отследить его переполнение?
    Что будет если я буду забирать данные из ком порта 1 раз в 2 цикла(куда они денутся если я их не заберу)?
    if (i MOD 2) = 0 then
    ByteResive := SysComRead(Port,ReciveBuffer+totalBytesResive,255, 0);
    end_if
    i:=i+1;
    Поиде данные должны остаться в буфере, и считаны при следующем обращении, или нет?
    Последний раз редактировалось AlexPC1; 06.10.2014 в 15:26.

  2. #2
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,251

    По умолчанию

    Где-то тут есть обсуждение легенды про якобы пропадающие байты. Ищите. Вместе с байтами.
    http://www.owen.ru/forum/showthread....ight=SysLibCom

    1.По фотографии уха сложно судить о красоте женщины. А простому человеке иногда еще сложно определить - а женщина ли вообще.
    2.Интересно - кокой размер буфера ?
    Последний раз редактировалось Валенок; 06.10.2014 в 16:08.

  3. #3

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Где-то тут есть обсуждение легенды про якобы пропадающие байты. Ищите. Вместе с байтами.
    http://www.owen.ru/forum/showthread....ight=SysLibCom

    1.По фотографии уха сложно судить о красоте женщины. А простому человеке иногда еще сложно определить - а женщина ли вообще.
    2.Интересно - кокой размер буфера ?
    Размер буффера 255 байт. Как написано выше.

  4. #4

    По умолчанию

    ByteMiss.jpg
    На скрине видно потерю байт.

  5. #5

    По умолчанию

    Пока остаюсь на скорости 9600, других вариантов нет. Использование UNM исключено, только SysLibCom и SysLibSockets.
    Основная проблема в том, что если исключить из проекта работу с 5 сокетами(MODBUS MASTER TCP опрос 5 ПЛК по ETH ), то SysComRead не теряет данные на любых скоростях.
    Время цикла при выполнении всей программы замеренное SysLibTime в пределах 1.4мс - 3,5мс не более.

    тихо сам с собою....блин.
    Последний раз редактировалось AlexPC1; 06.10.2014 в 19:20.

  6. #6

    По умолчанию

    Господа Разработчики, ваш выход....
    http://www.owen.ru/forum/showthread....ight=SysLibCom <- в этой теме ответа нет

  7. #7
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    ссылка же не открывается

    А какие претензии к UNM
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  8. #8
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ссылка же не открывается
    TO AlexPC1
    Ссылки нужно вставлять этой кнопкойЗахват-1.png
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  9. #9
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,251

    По умолчанию

    Цитата Сообщение от AlexPC1 Посмотреть сообщение
    Размер буффера 255 байт. Как написано выше.
    Так и думал.
    ByteResive := SysComRead(Port,ReciveBuffer+totalBytesResive,255, 0);
    ReadTimeout(IN:=(ByteResive=0),PT:=T#10ms);
    IF ByteResive > 0 THEN
    totalBytesResive := totalBytesResive + ByteResive;
    Редкий момент - рождение легенды про глюк системы.
    Пришлите извне байт так 300..500. Разом. И Вы запорете данные расположенные после буфера.
    А если буфер в разделе объявлений последний - получите би-и-п и перезагрузку. И начнете жалавацца начальству - овен такой, овен сякой, выходите подлые трусы
    А Вы, блин, сдвигаете константное окно для приема за пределы буфера. Не факт что именно Ваша проблема - из-за этого. Но легенда - пойдет в мир.

    Может кто и поднялся на 11й уровень, но я не Герасимов, не могу по берцовой кости восстановить облик неардентальца. И, например, предсказать когда и где упадет SerialOpen - по
    Кусок кода чтения из порта:
    не в состоянии.
    Последний раз редактировалось Валенок; 07.10.2014 в 00:29.

  10. #10

    По умолчанию

    ReciveBuffer : POINTER TO ARRAY [0..511] OF BYTE;(*с запасом*)


    IF NOT SerialOpen THEN
    Delay := Delay + 1;
    IF (Delay MOD 100) = 0 THEN
    IF Opened = FALSE THEN
    IF SysComOpen(Settings.Port) = 16#FFFFFFFF THEN
    SysComClose(Settings.Port);
    SerialOpen := FALSE;
    Opened := FALSE;
    ELSE
    Opened := TRUE;
    END_IF
    ELSE
    SerialOpen := NOT SysComSetSettings(Settings.Port, ADR(Settings));
    END_IF
    END_IF
    ELSE
    Delay := 0;
    serSTATE := serSEND;
    END_IF

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Функция SysComRead из библиотеки SysLibCom.Com
    от Newcomer в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 01.06.2014, 11:25
  2. ПЛК63 + SysLibCom, потеря байтов
    от monteg в разделе ПЛК63/73
    Ответов: 202
    Последнее сообщение: 18.04.2013, 10:11
  3. SysLibCom.lib помощ
    от lpp в разделе ПЛК1хх
    Ответов: 12
    Последнее сообщение: 25.06.2012, 15:24
  4. потеря байтов в ответной посылке с периодом 4-5 с.
    от Смирнов Роман в разделе ПЛК1хх
    Ответов: 44
    Последнее сообщение: 23.04.2009, 08:16
  5. SysLibCom.lib
    от Nekit в разделе ПЛК1хх
    Ответов: 0
    Последнее сообщение: 05.05.2007, 11:14

Ваши права

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