Передача данных по UDP каждую секунду.
-
- assistant
- Сообщения: 118
- Зарегистрирован: 05 ноя 2020, 08:26
- Версия LabVIEW: 18, 20.0f1
- Благодарил (а): 23 раза
- Поблагодарили: 4 раза
- Контактная информация:
Передача данных по UDP каждую секунду.
Сервер получает с двух устройств (имитация в виде программы и реального устройства) данные по UDP протоколу с портов 61556 и 61557, и должен отправлять их на другое устройство с порта 61558. Отправка данных на сервер происходит с частотой в 100 Гц, а вот отправку с сервера нужно производить раз в секунду, то есть по факту последние пришедшие за эту секунду данные. Проблема в том, что при отправке на сервер просто случайных чисел всё работает как нужно, но при подключении реального устройства при отображении на экран (а соответственно и при отправке) происходят задержки по 15-30 секунд, и после отключения одного из устройств пакеты продолжают приходить. Подозреваю, что таймер нужно поставить по другому, чтобы как-то синхронизировать, да и циклы тоже, но не могу сообразить, каким образом. Кто что думает? Спасибо. Второй скрин - отправка с устройства, но опять же, данные без таймера доходят без задержки.
- Вложения
-
- Server.vi
- (21.51 КБ) 104 скачивания
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Передача данных по UDP каждую секунду.
Два независимых устройства в принципе не могут работать синхронно. В результате получается, что одно устройство шлёт данные чаще, условно говоря, не 100 пакетов в сек, а 101 или 102. А другое - реже. Гарантировано накапливается разница, которая хранится до поры-до времени в буфере UDP. Опять-же, появляются проблемы, когда одно из устройств не работает.
Здесь требуется четкое понимание того, по какому принципу собирается выходной пакет - по объему данных или по временному интервалу. Потому что одновременно соблюсти оба требования невозможно. В любом случае необходимо делать три независимых потока.
Ну и категорически нельзя эти циклы вставлять внутрь Event Node.
Здесь требуется четкое понимание того, по какому принципу собирается выходной пакет - по объему данных или по временному интервалу. Потому что одновременно соблюсти оба требования невозможно. В любом случае необходимо делать три независимых потока.
Ну и категорически нельзя эти циклы вставлять внутрь Event Node.
-
- professor
- Сообщения: 3410
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Передача данных по UDP каждую секунду.
На верхней диаграмме данные из порта вытаскиваются раз в секунду. Естественно, если они туда летят 100 раз в сек, то уже через 1 секунду там будет 100 пакетов, которые вычитаются только через 100сек.
Надо в одном цикле читать с нужной скоростью. Куда-то складировать (обработать при необходимости, просуммировать или просто всё выкинуть), и передать во второй цикл отправки.
Можно просто локальную переменную, можно нотификатор.
Надо в одном цикле читать с нужной скоростью. Куда-то складировать (обработать при необходимости, просуммировать или просто всё выкинуть), и передать во второй цикл отправки.
Можно просто локальную переменную, можно нотификатор.
-
- assistant
- Сообщения: 118
- Зарегистрирован: 05 ноя 2020, 08:26
- Версия LabVIEW: 18, 20.0f1
- Благодарил (а): 23 раза
- Поблагодарили: 4 раза
- Контактная информация:
Re: Передача данных по UDP каждую секунду.
А есть ещё способ иметь возможность запускать и останавливать сервер путём нажатия кнопок в любой момент времени?
Попробую, спасибо!
-
- beginner
- Сообщения: 24
- Зарегистрирован: 27 окт 2019, 21:21
- Версия LabVIEW: 17,20,nxg5
- Благодарил (а): 7 раз
- Контактная информация:
Re: Передача данных по UDP каждую секунду.
А есть примерчик как запустить два цикла да еще и данные между ними передавать. У меня очень похожая задача, никак решения не найдет.Artem.spb писал(а): ↑05 фев 2021, 01:07 На верхней диаграмме данные из порта вытаскиваются раз в секунду. Естественно, если они туда летят 100 раз в сек, то уже через 1 секунду там будет 100 пакетов, которые вычитаются только через 100сек.
Надо в одном цикле читать с нужной скоростью. Куда-то складировать (обработать при необходимости, просуммировать или просто всё выкинуть), и передать во второй цикл отправки.
Можно просто локальную переменную, можно нотификатор.
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Передача данных по UDP каждую секунду.
producer consumer architecture in labviewLevashovea писал(а): ↑05 фев 2021, 11:53А есть примерчик как запустить два цикла да еще и данные между ними передавать. У меня очень похожая задача, никак решения не найдет.Artem.spb писал(а): ↑05 фев 2021, 01:07 На верхней диаграмме данные из порта вытаскиваются раз в секунду. Естественно, если они туда летят 100 раз в сек, то уже через 1 секунду там будет 100 пакетов, которые вычитаются только через 100сек.
Надо в одном цикле читать с нужной скоростью. Куда-то складировать (обработать при необходимости, просуммировать или просто всё выкинуть), и передать во второй цикл отправки.
Можно просто локальную переменную, можно нотификатор.
Передача данных между циклами, как уже было сказано, можно вместо очереди просто локальную переменную, можно нотификатор.
По передаче данных можно поискать по теме inter process communication. Много вариантов.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 13 Ответы
- 2455 Просмотры
-
Последнее сообщение rsv
-
- 3 Ответы
- 877 Просмотры
-
Последнее сообщение IvanLis
-
- 13 Ответы
- 1230 Просмотры
-
Последнее сообщение Boxa
-
- 0 Ответы
- 505 Просмотры
-
Последнее сообщение Juri
-
- 3 Ответы
- 272 Просмотры
-
Последнее сообщение AndreyDmitriev