Страница 111 из 1041 ПерваяПервая ... 1161101109110111112113121161211611 ... ПоследняяПоследняя
Показано с 1,101 по 1,110 из 10404

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #1101

    По умолчанию

    Простой как плинтус пример:

    Код:
    VAR_GLOBAL
      comsvc: COM_SERVICE;
      cs: COMSETTINGS;
    END_VAR
    Код:
    PROGRAM PLC_PRG
    VAR
      c: INT;
      rxbuf: ARRAY[0..511] OF BYTE;
    END_VAR
    
    IF XferCheck() THEN
      REPEAT
        c := DWORD_TO_INT(SysComRead(cs.Port, ADR(rxbuf), SIZEOF(rxbuf), 0));
        IF c > 0 THEN BYTESREAD := BYTESREAD + c; END_IF
      UNTIL c = 0
      END_REPEAT
    END_IF
    функция проверки порта:
    Код:
    IF NOT comsvc.ready THEN
      cs.Port := 1;
      cs.dwBaudRate := 115200;
      cs.byParity := 0;
      cs.dwTimeout := 0;
      cs.byStopBits := 0;
      cs.dwBufferSize := 0;
      cs.dwScan := 0;
      comsvc(Enable:=TRUE, Settings:=cs, Task:=OPEN_TSK);
    ELSE
      comsvc.Enable := FALSE;
    END_IF
    XferCheck := comsvc.ready;
    Запускаем пример, стартуем передачу в порт, ждем, тормозим передачу, получаем:
    передано байт: 27060
    BYTESREAD: 26981

    В порт каждые 30 мсек шлется посылка длиной 16 байт, цикл ПЛК 1мс. Кто-то может объяснить, какого лешего теряются данные?

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

    По умолчанию

    каждые 30 мсек шлется посылка длиной 16 байт
    посылка 20 байт, примерно 30 раз в секунду
    11 22 33 44 55 66 77 88 FF FF
    Все-таки какая длина посылок ?

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

    По умолчанию

    Цитата Сообщение от Sergey1024 Посмотреть сообщение
    Не очень понял, зачем нужна такая проверка?
    тут делаем попытку считать данные из порта:
    c := DWORD_TO_INT(SysComRead(acom.Settings.Port, ADR(rxbuf), SIZEOF(rxbuf), 0));

    если получили какие-то данные - сохраняем в приемный буфер:
    FOR i := 0 TO c - 1 DO
    buf[bufc] := rxbuf[i];
    bufc := bufc + 1;
    IF bufc >= SIZEOF(buf) THEN
    bufc := 0; (* тут я ставлю точку останова и смотрю содержимое buf *)
    END_IF
    END_FOR
    Можно было повторно не объяснять, лучше ответить что будет если всего приняли и присвоили переменной с меньше чем размер буфера
    PS попробуйте не прибавлять bufc в теле цикла а в условии цикла уменьшать до нуля переменную с. И после окончании работы тела цикла поставте останов и посмотрите на сколько заполняется массив

  4. #1104

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Все-таки какая длина посылок ?
    Посылки я уже просто имитирую с другого компа - разницы нет, что слать посылки в 20, что в 10, что в 50 байт - при большом количестве посылок на контроллере обязательно принимается меньше, чем посылается в порт.

  5. #1105

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Можно было повторно не объяснять, лучше ответить что будет если всего приняли и присвоили переменной с меньше чем размер буфера
    PS попробуйте не прибавлять bufc в теле цикла а в условии цикла уменьшать до нуля переменную с.
    Я пару постов назад написал код простейшего примера, где я просто инкрементирую счетчик, без заполнения какого-то буфера:
    c := DWORD_TO_INT(SysComRead(cs.Port, ADR(rxbuf), SIZEOF(rxbuf), 0));
    IF c > 0 THEN BYTESREAD := BYTESREAD + c; END_IF

    С другого компьютера просто шлю в порт последовательность посылок, потом отключаю посылку, и сравниваю - сколько отослано, сколько получено на контроллере. На контроллере BYTESREAD всегда отстает от количества отосланных байт (вот еще раз попробовал, 902 отослано, 896 принято).

    Цитата Сообщение от capzap Посмотреть сообщение
    И после окончании работы тела цикла поставте останов и посмотрите на сколько заполняется массив
    Поставил точку останова на строку BYTESREAD := BYTESREAD + c;, дал одиночную посылку в порт длиною 57 байт. В точке было два останова - сначала с=3, потом с=0F. Без точки останова принимается 57 байт, но при непрерывной передаче таких посылок 8 раз в сек получаю 4731 отправлено, 4708 принято.

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

    По умолчанию

    Цитата Сообщение от Sergey1024 Посмотреть сообщение
    Я пару постов назад написал код простейшего примера, где я просто инкрементирую счетчик, без заполнения какого-то буфера:
    c := DWORD_TO_INT(SysComRead(cs.Port, ADR(rxbuf), SIZEOF(rxbuf), 0));
    IF c > 0 THEN BYTESREAD := BYTESREAD + c; END_IF

    С другого компьютера просто шлю в порт последовательность посылок, потом отключаю посылку, и сравниваю - сколько отослано, сколько получено на контроллере. На контроллере BYTESREAD всегда отстает от количества отосланных байт (вот еще раз попробовал, 902 отослано, 896 принято).
    Ну и к чему Вы склоняетесь, виновато железо? В работе последовательных портов есть понятие таймаут, оно как раз на тот случай если данные пропали, а мы ждем определенное их количество
    Пример с таймаутом приведен не совсем удачно, но существуют всевозможные проверки, контроль четности контрольная сумма и т.п. Идеальной линии связи не бывает, данным свойственно теряться

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

    По умолчанию

    Цитата Сообщение от Sergey1024 Посмотреть сообщение
    Посылки я уже просто имитирую с другого компа - разницы нет, что слать посылки в 20, что в 10, что в 50 байт - при большом количестве посылок на контроллере обязательно принимается меньше, чем посылается в порт.
    512 плохо делицца на 20,10 и даже 50. Брекпоинт - внутри цикла. Вы тормозитесь не получив полностью даже текущую полсылку. Как там и что делается дальше - знаете только Вы. Повлиять может даже тип "с". Вдруг он WORD ? Кто кроме Вас знает ?
    И поменяйте местами ПЛК и комп для сравнения. Может пк чудит ? На ПЛК оба порта есть ?

  8. #1108

    По умолчанию

    [QUOTE=capzap;95140]Ну и к чему Вы склоняетесь, виновато железо?[/CODE]Я ни к чему пока не склоняюсь, только начал щупать ПЛК.

    Цитата Сообщение от capzap Посмотреть сообщение
    В работе последовательных портов есть понятие таймаут, оно как раз на тот случай если данные пропали, а мы ждем определенное их количество. Пример с таймаутом приведен не совсем удачно, но существуют всевозможные проверки, контроль четности контрольная сумма и т.п. Идеальной линии связи не бывает, данным свойственно теряться
    Почему же тогда компьютер вместо контроллера считывает абсолютно все посылки? Я бы понял потерю данных на длинной линии или с экстремальной плотностью посылок, но на линии длиной 10см терять до нескольких процентов данных непонятно куда - хз.

  9. #1109

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    512 плохо делицца на 20,10 и даже 50. Брекпоинт - внутри цикла. Вы тормозитесь не получив полностью даже текущую полсылку.
    Брейк поставлен просто для проверки количества принятых за один раз байт.
    Цитата Сообщение от Валенок Посмотреть сообщение
    Как там и что делается дальше - знаете только Вы.
    Ничего там не делается, вот весь код:
    REPEAT
    c := DWORD_TO_INT(SysComRead(cs.Port, ADR(rxbuf), SIZEOF(rxbuf), 0));
    IF c > 0 THEN BYTESREAD := BYTESREAD + c; END_IF
    UNTIL c = 0
    END_REPEAT

    Цитата Сообщение от Валенок Посмотреть сообщение
    И поменяйте местами ПЛК и комп для сравнения. Может пк чудит ? На ПЛК оба порта есть ?
    Оба порта есть, проверял на обоих - одинаково.
    С ПЛК на комп посылки отсылал - 20000 отправлено, 20000 принято на компе.

    P.S. Проверил еще раз преобразователи - комп1-> преобразователь1 232\485->преобразователь2 232\485->комп2
    В обе стороны - 300тыс байт без единой потери.
    Так что варианта всего три - мои кривые руки, кривость железа ПЛК73, кривость SysComLib. Очень хочется варианта 1, ибо в противном случае проект накрывается медным тазом просто :-(

    PPS. SysLibCom версии 20.2.06 12:31:08, может есть версии посвежее?

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

    По умолчанию

    Оба порта есть
    Пошлите с 1-ого на 2-ой

    PS
    Если проект накрывается тазом из-за каких-то потерь - однозначно руки.

Страница 111 из 1041 ПерваяПервая ... 1161101109110111112113121161211611 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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