|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Эмуляция задержки по времени
Добрый день, коллеги.
Прошу навести на мысль. Пишу эмулятор некоторых приборов, которые висят на одной шине RS-485. Работа идет через COM-порт. Суть: от главного контроллера приходит запрос. На запрос нужно послать ответ с задержкой (у разных "приборов" разная). Моя реализация выглядит так: 1. Виртуальная шина данных, к которой аттачатся виртуальные "приборы". 2. Шина открывает COM-порт и получая с него данные бродкастит на все приаттаченные виртуальные устройства (вызов функции обработки сообщения всех "приборов" в цикле). 3. "Прибор" получив запрос формирует ответ и отправляет в шину. 4. Шина перенаправляет ответ в COM-порт. Как я уже сказал, ответ должен улетать с задержкой. И эта задержка не должна влиять на "работу" других виртуальных приборов. Ломаю голову, как сделать эту временную задержку (для каждого прибора свою) на одной шине. Использовать по окну и таймеру для каждого виртуального устройства как-то расточительно. Есть идеи? Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#2
|
||||
|
||||
А что, sleep() не помогает? Можно ведь в одном обработчике таймера задать разный период задержки для разных "приборов"
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
Всего один таймер + софтовые счётчики по числу необходимых каналов.
|
#4
|
||||
|
||||
Один queue таймер CreateTimerQueue и несколько CreateTimerQueueTimer() со своими задержками и параметрами для идентификации в callback-процедуре.
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
dr. F.I.N. (11.12.2017)
|
#5
|
||||
|
||||
Решил попробовать так:
1. Отсортировать "приборы" по времени задержки ответа. 2. Передавать прибору в обработку данные со штампом времени получения 3. Прибор обрабатывает данные и Sleep() на необходимое кол-во мс. 4. Следующий прибор поступает аналогично, но его пауза ожидания будет рассчитываться с учетом прошедшего времени с момента получения данных из порта. Вариант с очередями таймеров очень интересен, но думаю с максимальной задержкой в 200-300мс это будут лишние заморочки. Будем посмотреть. Спасибо за идеи. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#6
|
||||
|
||||
Да с таймером тоже вариант хороший, он может использоваться как независимый от основного приложения заменитель цикла опроса, стабильности будет больше
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
||||
|
||||
Цитата:
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#8
|
||||
|
||||
Цитата:
485 так не работает. Мастер шлет запрос, слэйв должен на него ответить за определенный таймаут. Если таймаут вышел - все заткнулись и ждут, что скажет мастер. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#9
|
||||
|
||||
Цитата:
1. От Мастера - бродкаст- рассчитайсь! 2. От Слейва 1 - (зажержка 10мс от рассылки) - Я! 3. От Слейва 2 (другое устройство) - задержка 20мс от рассылки - Я! 4. и т.д. Устройства в сети все разные, задержка соответственно тоже. Почему такую реализацию выбрал производитель - мне не ясно. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |