Страница 2 из 6 ПерваяПервая 1234 ... ПоследняяПоследняя
Показано с 11 по 20 из 54

Тема: SysLibCom

  1. #11

    По умолчанию

    Ну да ладно. Отправка байтов налажена. Теперь есть проблемы с приемником. Пишем в программе:
    Код:
    myComRead(xExecute := TRUE, hCom := myComOpen.hCom, pBuffer := ADR(arrMassiveReceive), szBuffer := 10, udiTimeOut := 1000);
    Сую в порт одиночные символы / не сую в порт одиночные символы.

    xDone всегда отключен. xBusy всегда включен. Что можете посоветовать начинающему программисту?

  2. #12

  3. #13

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Как и раньше - внимательно изучить документ по ссылке из поста #5.
    Нет.

    У меня вопрос!
    В блоке Read есть параметр udiTimeOut. Он определяет время (толи в mS, толи в uS) через которое произойдет таймаут по приему.
    Я записал туда число 10 000 000.

    Что произойдет через этих 10 миллионов попугаев? Какой флаг должен установиться через это время? Что должно измениться?

  4. #14
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,147

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    В блоке Read есть параметр udiTimeOut. Он определяет время (толи в mS, толи в uS) через которое произойдет таймаут по приему.
    ?
    Это не так. Это таймаут доступа к буферу COM-порта.

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Что произойдет через этих 10 миллионов попугаев? Какой флаг должен установиться через это время? Что должно измениться?
    Если за это время не случится xDone или какая-то другая ошибка, то:

    xError - TRUE
    eError - COM.ERROR.TIME_OUT

  5. #15

    По умолчанию

    Правильно ли я понимаю, что функциональные блоки Write и Read реализованы по разному (что затрудняет их понимание и читаемость кода)?

    1. Ф-блок Write не отдаёт xDone до тех пор, пока физически не отдаст последний байт линию COM-порта. Я пробовал на скорости 1200 отдать 255 байтов. Ф-блок Write блокирует программу более 2-х секунд. Реализовано хорошо: исключается наложение отдаваемых пакетов (потому-что блокируется программа).

    2. Ф-блок Read отдаёт xDone сразу же, как только физически добрался до буфера. Придется сталкиваться с пустыми массивами, закольцованными массивами (придется проверять это). Параметр udiTimeOut выполняет непонятную своим смыслом функцию. Этот параметр должен был блокировать программу на указанное время, а после отдавать xDone, размер принятых байт (szSize) и принятый буфер (arrBuffer)! И ненужно было бы вводить свои кастомные таймера для таймаута, код был бы понятнее.

    Ну а если нельзя блокировать программу, то зачем это сделано в ф-блоке Write? Он тоже мог бы тупо перекидывать в буфер и сразу же отдавать xDone? Пусть байты вылетают из порта своим ходом (хардовым способом).

    В общем: Write блочит прогу, Read не блочит прогу.

    PS: А еще обратите внимание, что параметр szSize отдает не количество принятых байт, а указывает на последний байт в кольцевом (!) буфере приема (arrBuffer). И если принятая посылка будет больше буфера, то вы получите недостоверное значение.
    Последний раз редактировалось ВладОвен; 12.08.2022 в 18:19.

  6. #16
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,147

    По умолчанию

    Придется сталкиваться с пустыми массивами, закольцованными массивами (придется проверять это).
    Можно, наверное, и так.
    Или можно почитать документ, посмотреть пример из него - и обойтись без всех этих столкновений.
    Впрочем, я понимаю, что вы не ищите легких путей.

    Этот параметр должен был блокировать программу на указанное время, а после отдавать xDone, размер принятых байт (szSize) и принятый буфер (arrBuffer)!
    Должен кому?
    Библиотека CAA SerialCom включает в себя асинхронные ФБ, которые не блокируют задачу, в которой вызываются.
    В этом их преимущество - сохранение стабильного времени цикла без лишних джиттеров.

    Для любителей "блокировать программу" - есть библиотека SysCom.

    Он тоже мог бы тупо перекидывать в буфер и сразу же отдавать xDone? Пусть байты вылетают из порта своим ходом (хардовым способом).
    Тогда другой пользователь спрашивал бы: почему после отправки запроса я читаю приемный буфер и вижу в нем свои же отправленные байты?
    В общем, так себе решение.

    И если принятая посылка будет больше буфера, то вы получите недостоверное значение.
    А если читать документацию и разумно подходить к написанию кода - то таких проблем не будет.

  7. #17

    По умолчанию

    Ок. Спасибо за разъяснения.
    Получается, что эта библиотека асинхронная. По задумке не блокирует программу.
    Но отправка пакета реализована с блокировкой из-за того, что-бы не ловить свои-же байты.

  8. #18

    По умолчанию

    Евгений, здравствуйте.
    А можете объяснить почему не срабатывает такая конструкция при открытии порта?
    Код:
    WHILE NOT myComOpen.xDone DO
        myComOpen(xExecute := TRUE, usiListLength := SIZEOF(arrParams)/SIZEOF(COM.PARAMETER), pParameterList := ADR(arrParams));
    END_WHILE
    Правильно ли я понимаю, что из-за того, что я блокирую программу?

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

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Евгений, здравствуйте.
    А можете объяснить почему не срабатывает такая конструкция при открытии порта?
    Код:
    WHILE NOT myComOpen.xDone DO
        myComOpen(xExecute := TRUE, usiListLength := SIZEOF(arrParams)/SIZEOF(COM.PARAMETER), pParameterList := ADR(arrParams));
    END_WHILE
    Правильно ли я понимаю, что из-за того, что я блокирую программу?
    потому что while выполняется в рамках одного цикла, а необходимо несколько циклов плк, чтоб получить обмен с аппаратным сом-портом
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  10. #20

    По умолчанию

    Привет.
    Помогите решить такую проблему:
    Мне нужно получить посылку длинной 39 байт. Посылка должная прийти асинхронно. Т.е. чёрт знает когда.
    Мне приходится постоянно циклически слушать порт:
    Код:
    CASE bStep OF
        00: ...
        01: // Принимаем пакет
            myComRead(xExecute := TRUE, hcom := hCom, pBuffer := ADR(arrReceive), szBuffer := 255, udiTimeOut := 0);
            IF myComRead.xDone THEN
                bStep : = 2;
            END_IF
        02: // Проверяем длину принятого пакета
            IF myComRead.szSize = 0 THEN // Нулевая длина: уходим в начало
                myComRead(xExecute := FALSE);
                bStep := 1;
            ELSE
                bStep := 4;
            END_IF
        04: ...
    END_CASE
    Пакет принимается, но иногда поломанный. Я записывал длину каждого принятого пакета в массив и увидел вот что:
    arrBufferLen[] = 0, 0, 29, 10, 0, 0, 0, 0, 0, 0, 0
    Т.е. принимаемые 39 байт разбились на отдельные пакеты длиной 29 и 10 байт.
    Очевидно, что это происходит из-за рассинхронизации процессов.

    Как этого избежать? При этом длина входного пакета всегда разная.

Страница 2 из 6 ПерваяПервая 1234 ... ПоследняяПоследняя

Похожие темы

  1. SysLibCom
    от Антон12345 в разделе ПЛК1хх
    Ответов: 36
    Последнее сообщение: 21.11.2013, 15:44
  2. Syslibcom
    от Назаров Александр в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 28.04.2010, 17:34
  3. SysLibCom
    от demon в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 20.03.2009, 13:08
  4. ПЛК 150 и SysLibCom.lib.
    от Анатолий в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 13.12.2008, 13:48
  5. SysLibCom.lib
    от Nekit в разделе ПЛК1хх
    Ответов: 0
    Последнее сообщение: 05.05.2007, 11:14

Ваши права

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