Показано с 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.

Похожие темы

  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

Ваши права

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