Передача данных по UDP каждую секунду.

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Ответить
Sergey Puzanov
assistant
assistant
Сообщения: 118
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 23 раза
Поблагодарили: 4 раза
Контактная информация:

Передача данных по UDP каждую секунду.

Сообщение Sergey Puzanov »

Сервер получает с двух устройств (имитация в виде программы и реального устройства) данные по UDP протоколу с портов 61556 и 61557, и должен отправлять их на другое устройство с порта 61558. Отправка данных на сервер происходит с частотой в 100 Гц, а вот отправку с сервера нужно производить раз в секунду, то есть по факту последние пришедшие за эту секунду данные. Проблема в том, что при отправке на сервер просто случайных чисел всё работает как нужно, но при подключении реального устройства при отображении на экран (а соответственно и при отправке) происходят задержки по 15-30 секунд, и после отключения одного из устройств пакеты продолжают приходить. Подозреваю, что таймер нужно поставить по другому, чтобы как-то синхронизировать, да и циклы тоже, но не могу сообразить, каким образом. Кто что думает? Спасибо. Второй скрин - отправка с устройства, но опять же, данные без таймера доходят без задержки.
1.png
2.png
Вложения
Server.vi
(21.51 КБ) 104 скачивания
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Передача данных по UDP каждую секунду.

Сообщение Borjomy_1 »

Два независимых устройства в принципе не могут работать синхронно. В результате получается, что одно устройство шлёт данные чаще, условно говоря, не 100 пакетов в сек, а 101 или 102. А другое - реже. Гарантировано накапливается разница, которая хранится до поры-до времени в буфере UDP. Опять-же, появляются проблемы, когда одно из устройств не работает.
Здесь требуется четкое понимание того, по какому принципу собирается выходной пакет - по объему данных или по временному интервалу. Потому что одновременно соблюсти оба требования невозможно. В любом случае необходимо делать три независимых потока.
Ну и категорически нельзя эти циклы вставлять внутрь Event Node.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 175 раз
Контактная информация:

Re: Передача данных по UDP каждую секунду.

Сообщение Artem.spb »

На верхней диаграмме данные из порта вытаскиваются раз в секунду. Естественно, если они туда летят 100 раз в сек, то уже через 1 секунду там будет 100 пакетов, которые вычитаются только через 100сек.
Надо в одном цикле читать с нужной скоростью. Куда-то складировать (обработать при необходимости, просуммировать или просто всё выкинуть), и передать во второй цикл отправки.
Можно просто локальную переменную, можно нотификатор.
Sergey Puzanov
assistant
assistant
Сообщения: 118
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 23 раза
Поблагодарили: 4 раза
Контактная информация:

Re: Передача данных по UDP каждую секунду.

Сообщение Sergey Puzanov »

Borjomy_1 писал(а): 05 фев 2021, 00:58 Ну и категорически нельзя эти циклы вставлять внутрь Event Node.
А есть ещё способ иметь возможность запускать и останавливать сервер путём нажатия кнопок в любой момент времени?
Artem.spb писал(а): 05 фев 2021, 01:07 Можно просто локальную переменную, можно нотификатор.
Попробую, спасибо!
Levashovea
beginner
beginner
Сообщения: 24
Зарегистрирован: 27 окт 2019, 21:21
Версия LabVIEW: 17,20,nxg5
Благодарил (а): 7 раз
Контактная информация:

Re: Передача данных по UDP каждую секунду.

Сообщение Levashovea »

Artem.spb писал(а): 05 фев 2021, 01:07 На верхней диаграмме данные из порта вытаскиваются раз в секунду. Естественно, если они туда летят 100 раз в сек, то уже через 1 секунду там будет 100 пакетов, которые вычитаются только через 100сек.
Надо в одном цикле читать с нужной скоростью. Куда-то складировать (обработать при необходимости, просуммировать или просто всё выкинуть), и передать во второй цикл отправки.
Можно просто локальную переменную, можно нотификатор.
А есть примерчик как запустить два цикла да еще и данные между ними передавать. У меня очень похожая задача, никак решения не найдет.
ujin1
adviser
adviser
Сообщения: 231
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 18 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Передача данных по UDP каждую секунду.

Сообщение ujin1 »

Levashovea писал(а): 05 фев 2021, 11:53
Artem.spb писал(а): 05 фев 2021, 01:07 На верхней диаграмме данные из порта вытаскиваются раз в секунду. Естественно, если они туда летят 100 раз в сек, то уже через 1 секунду там будет 100 пакетов, которые вычитаются только через 100сек.
Надо в одном цикле читать с нужной скоростью. Куда-то складировать (обработать при необходимости, просуммировать или просто всё выкинуть), и передать во второй цикл отправки.
Можно просто локальную переменную, можно нотификатор.
А есть примерчик как запустить два цикла да еще и данные между ними передавать. У меня очень похожая задача, никак решения не найдет.
producer consumer architecture in labview
Передача данных между циклами, как уже было сказано, можно вместо очереди просто локальную переменную, можно нотификатор.
По передаче данных можно поискать по теме inter process communication. Много вариантов.
Изображение
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»