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

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

  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
    Адрес
    Центророссийск
    Сообщений
    3,154

    По умолчанию

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

  3. #1103
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    Цитата Сообщение от 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
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    Цитата Сообщение от 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
    Адрес
    Центророссийск
    Сообщений
    3,154

    По умолчанию

    Цитата Сообщение от 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
    Адрес
    Центророссийск
    Сообщений
    3,154

    По умолчанию

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

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

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

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

Ваши права

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