Показано с 1 по 7 из 7

Тема: SysComWrite() & SysComRead()

  1. #1

    Question SysComWrite() & SysComRead()

    Подскажите или дайте ссылку на информацию, пожалуйста.
    В какой момент времени ПЛК серии 100/150/154 выполняет отправку буффера при использовании функции SysComWrite() : непосредственно выполняя остановку выполнения задачи или между задачами? Когда после отправки запроса выполнять прием ответа посредством SysComRead() - сразу после SysComWrite() или при следующем вызове задачи?

  2. #2

    По умолчанию

    Эти функции возвращают количество прочитанных (переданных) байт. соотв. читать (писать новый) буфер нужно как только это количество сравняецо с dwBytesToRead (dwBytesToWrite).

  3. #3
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    непосредственно выполняя остановку выполнения задачи или между задачами?
    Это синхронные функции, т.е. они выполняются блокируя вызывающий поток.
    Когда после отправки запроса выполнять прием ответа посредством SysComRead() - сразу после SysComWrite() или при следующем вызове задачи?
    Когда вам удобнее с точки зрения написания кода. Временем выполнения одного цикла ПЛК в данном случае можно пренебречь. Я обычно жду ответ со следующего цикла — это получается естественным образом в автомате опроса (пример — см. библиотеку). Можете и сразу SysComRead вызвать — всё-равно получите ноль и в итоге продолжите ждать.

  4. #4
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,686

    По умолчанию

    Цитата Сообщение от spectrum48k Посмотреть сообщение
    Подскажите или дайте ссылку на информацию, пожалуйста.
    В какой момент времени ПЛК серии 100/150/154 выполняет отправку буффера при использовании функции SysComWrite() : непосредственно выполняя остановку выполнения задачи или между задачами? Когда после отправки запроса выполнять прием ответа посредством SysComRead() - сразу после SysComWrite() или при следующем вызове задачи?
    В "Примеры программ и полезности" раздела ПЛК есть(Должны быть - были) примеры работы с этими функциями .

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

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Это синхронные функции, т.е. они выполняются блокируя вызывающий поток...
    Пример : отправка 512-ти байт на 38400 реально займет 150..200мс, а тупая засечка времени до/после syscomwrite - 1мс.
    ?

    Имхо :
    syscomwrite - пересылка данных в внутренний буффер. Дальше - отправка данных системой на прерываниях а не между циклами.
    Именно прерывания - т.к., например, модбасную транзакцию (запрос-ответ) можно провести в течении одного рабочего цикла (т.е. не выходя из него). Делать так в реальных проектах не нужно.

    С остальным полностью согласен.
    Последний раз редактировалось Валенок; 17.05.2015 в 21:04.

  6. #6
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Ну да, асинхронные без обратной связи. Или синхронные с буферизацией. Момент отправки по проводам как бы не должен волновать пользователя SysComWrite ))

    Я обычно таких правил придерживаюсь:
    1) Больше одного раза за цикл для одного порта SysComRead или SysComWrite не вызывать (разве что для опустошения буфера).
    2) SysComRead вызывать скользящим способом: iCount := iCount + SysComRead(hPort, pBuf + iCount, iExpected - iCount).
    Последний раз редактировалось Yegor; 18.05.2015 в 06:54.

  7. #7
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,686

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Ну да, асинхронные без обратной связи. Или синхронные с буферизацией. Момент отправки по проводам как бы не должен волновать пользователя SysComWrite ))

    Я обычно таких правил придерживаюсь:
    1) Больше одного раза за цикл для одного порта SysComRead или SysComWrite не вызывать (разве что для опустошения буфера).
    2) SysComRead вызывать скользящим способом: iCount := iCount + SysComRead(hPort, pBuf + iCount, iExpected - iCount).
    Правильно функции асинхронные , да и сам обмен асинхронный .
    SysComRead читает за раз (вызов в цикле программы) содержимое буфера приема , буфер в микросхеме - 4кБ (вроде как , но не суть) , но в течении одного цикла при обмене (приеме пакетов от прибора) залезет около 4х байт . Поэтому принятые байты надо "склеивать" (складывать) до получения полного пакета . Напр ответ от прибора должен быть 16 байт - результат получится примерно за 4 цикла . Можно конечно читать с задержкой и вытаскивать сразу все из буфера , но тогда не будет гарантии отсутствия "лишних" байт .
    Поэтому буфер приема надо постоянно подчищать .
    Все с опытом приходит , т.к "детальное"-подробное описание работы (принципа правильной работы) этих функций отсутствует .

Похожие темы

  1. SysLibCom.lib (SysComRead) потеря байтов.
    от AlexPC1 в разделе ПЛК1хх
    Ответов: 19
    Последнее сообщение: 13.10.2014, 22:38
  2. Функция SysComRead из библиотеки SysLibCom.Com
    от Newcomer в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 01.06.2014, 11:25
  3. РАДИОМОДЕМ & ПЛК
    от Пьер в разделе Помощь Разработчикам
    Ответов: 8
    Последнее сообщение: 13.09.2013, 07:36
  4. AC7 & СМИ1
    от Extremator в разделе Подбор Оборудования
    Ответов: 6
    Последнее сообщение: 04.10.2011, 17:19
  5. PLC150.I-L & RS232 & Teleport---> modem
    от kma в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 21.04.2009, 11:42

Ваши права

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