Страница 1 из 1

Event, While, Case и Timed

Добавлено: 09 фев 2021, 21:28
zorg25406
Доброго времени суток. Стоит задача опроса 32 датчиков температуры, связанных по TCP (сервер-клиент) с компьютером через преобразователь RS-485 - LAN со своим протоколом обмена. В настоящее время могу делать стабильный опрос одного датчика (все 32 пока не пробовал) только однократно по нажатию кнопки с использованием Event Structure. Когда же пытаюсь реализовать постоянный опрос, начинается истерия циклов. Либо не останавливается внешний цикл, либо внутренний, либо вообще шляпу получаю в результате. На примере простого генератора чисел (по сути аналог моей ситуации с постоянным опросом) хочу разобраться раз и навсегда с циклами в labview. Ниже приведен пример того, что хочу реализовать:
1. Запускаю программу - жмем Run.
2. Налаживаем связь с устройством - жмем кнопку "Включение/Выключение". Кнопка переходит в состояние "Включено".
3. Запускаем опрос датчика температуры - жмем кнопку "Датчик Т1". Кнопка переходит в состояние "Включено".
4. Идет опрос датчика (генерация случайных чисел) с выводом один раз в секунду (для примера) полученного значения.
4. При повторном нажатии кнопки "Датчик Т1" цикл опроса конкретно этого датчика (генерации случайных чисел) должен остановится. Кнопка должна перейти в состояние "Выключено". При этом другие вкладки структуры Event Structure должны работать как и работали. Если снова нажать кнопку "Датчик Т1" опрос должен возобновиться. И так далее.
Как это реализовать теоретически понимаю, но по факту выходит не то, что должно. В приложенном примере при нажатии "Включение/Выключение" и "Датчик Т1" опрос запускается, но остановить я его не могу кнопками, только принудительно самим Labview. Если изменить Loop Condition внутри Timed Loop на выключение при "True" на входе, то опрос идет только по нажатию кнопки (однократно). Что мне надо поменять, подскажите. :help: :help: :help:
Пример.png

Re: Event, While, Case и Timed

Добавлено: 09 фев 2021, 21:48
Borjomy_1
Нельзя цикл опроса датчика заводить в Event Node. В нем можно делать только управление другими циклами.

Re: Event, While, Case и Timed

Добавлено: 09 фев 2021, 22:41
Artem.spb
zorg25406 писал(а): 09 фев 2021, 21:28 4. При повторном нажатии кнопки "Датчик Т1" цикл опроса конкретно этого датчика (генерации случайных чисел) должен остановится.
При такой архитектуре он не остановится в принципе. Провод - это не ссылка на кнопку, это само значение в первый момент. И дальше оно "навечно" останется таким в этом проводе. Поэтому цикл будет работать вечно.
Более того, пока не остановится цикл (= никогда), остальные события не будут работать.
dataflow.PNG
Что мне надо поменять, подскажите.
Для начала надо поменять фундаментальное представление о LabVIEW :)
Не знаю, что у вас в других циклах, но судя по описанию что-то такое же. И если вы ожидаете, что все кейсы работают параллельно, то вы коренным образом заблуждаетесь.
Цикл он на то и цикл, что следующая итерация начнётся только после того, как полностью завершится предыдущая. Если нужно, чтобы несколько циклов работали параллельно, то и надо их располагать "параллельно", т.е. рядом, а не внутри другого цикла.

Re: Event, While, Case и Timed

Добавлено: 10 фев 2021, 06:52
zorg25406
Artem.spb писал(а): 09 фев 2021, 22:41 Для начала надо поменять фундаментальное представление о LabVIEW :)
Я пока с TCP не начал работать, много чего не использовал и обходился более простыми и очевидными решениями. Я понимаю, что мне в данном случае лучше уйти от Event Structure, но при этом я не понимаю, как мне запускать по нажатию разных кнопок разные циклы опроса 32-х датчиков! При этом не отключаясь от сервера и, соответственно, не останавливая другие части кода. Пока я вижу, что нужно 32 Case в каждом из которых будет Timed Loop. Но опять же, как выйти из бесконечного опроса.. Можете простенький примерчик набросать? Ну или на пальцах объяснить хотя бы. Либо литературу подходящую. Хотя в принципе я несколько имеющихся в наличии книжек прочитал, подходящего не нашел.

Re: Event, While, Case и Timed

Добавлено: 10 фев 2021, 08:23
zorg25406
Так, в принципе получился нижеприведенный вариант. Жду критики :suicide:
Единственно напрягает, что неудобно без Event Structure. До этого раскидывал разные фрагменты кода на разные кнопки, как мне этого хотелось. И подключение к устройствам производилась по нажатию на кнопку. А сейчас приходится перед запуском кода (Run) активировать кнопку для нормального запуска Case (в данном случае кнопка "Опрос") и только потом запускать код.
Рабочий вариант.png

Re: Event, While, Case и Timed

Добавлено: 10 фев 2021, 14:26
Artem.spb
zorg25406 писал(а): 10 фев 2021, 06:52 как мне запускать по нажатию разных кнопок разные циклы опроса 32-х датчиков! При этом не отключаясь от сервера и, соответственно, не останавливая другие части кода.
Вот ту совершено непонятно, как идёт опрос, и что такое сервер.
И от этого зависит архитектура. Потому что если всё идёт с одного сервера, то это один цикл, если на каждый датчик отдельное соединение, то придётся делать 32 цикла.
А в целом изучите Producer/Consumer Architecture

Re: Event, While, Case и Timed

Добавлено: 11 фев 2021, 18:21
zorg25406
Всего 32 датчика (16 приборов, каждый имеет два датчика). Связаны они по одной шине и информация от них поступает последовательно. Меняем в посылке адрес датчика (01, 02, 03 и т.д.). Я понимаю как делать опрос, выстраиваю очереди и т.д. Но получается слишком много циклов и условий, из-за чего и идет путаница. Я выше уже писал ведь алгоритм работы. Пока не надо смотреть на количество датчиков. Мне надо с циклами разобраться, как правильно запускать и выключать. Тот вариант примера, что я привел вроде бы рабочий. Но мне кажется есть что-то правильнее и оптимальнее

Re: Event, While, Case и Timed

Добавлено: 11 фев 2021, 20:00
Artem.spb
zorg25406 писал(а): 11 фев 2021, 18:21 Но получается слишком много циклов и условий, из-за чего и идет путаница.
Именно это и не правильно.
Зачем много циклов? Если все сидят на одной шине, то опрашивать надо последовательно в одном цикле. Иначе посыпятся конфликты запросов-ответов.

Re: Event, While, Case и Timed

Добавлено: 12 фев 2021, 07:57
Levashovea
zorg25406 писал(а): 11 фев 2021, 18:21 Всего 32 датчика (16 приборов, каждый имеет два датчика). Связаны они по одной шине и информация от них поступает последовательно. Меняем в посылке адрес датчика (01, 02, 03 и т.д.). Я понимаю как делать опрос, выстраиваю очереди и т.д. Но получается слишком много циклов и условий, из-за чего и идет путаница. Я выше уже писал ведь алгоритм работы. Пока не надо смотреть на количество датчиков. Мне надо с циклами разобраться, как правильно запускать и выключать. Тот вариант примера, что я привел вроде бы рабочий. Но мне кажется есть что-то правильнее и оптимальнее
Я сделал так 9 приборов по 2 сенсора на каждом приборе
Схема рабочая, но не совсем правильная (делалась быстро, для эксперимента), идея думаю будет понятна.
опрос 9 датчиков.PNG

Re: Event, While, Case и Timed

Добавлено: 12 фев 2021, 14:48
IvanLis
Вам же написали, что нужно уходить от множества циклов и структур.
Представьте, что Вам нужно сделать опрос 150 устройств, на каждом из которых разное количество датчиков от 3 до 10, а еще если и у каждого параметра своя схема преобразования.
Что Вы делать будете? Так в любом случае не нужно делать :wink: : viewtopic.php?f=35&t=10378
Особенно когда Вам потребуется сделать перезапрос или переподключение, с циклами вообще никак не получится, там все жестко.

Должно быть примерно так:
1.png
Здесь постоянно, по кругу датчики опрашиваются, а в массиве данные обновляются.

Re: Event, While, Case и Timed

Добавлено: 12 фев 2021, 20:28
zorg25406
Спасибо всем за советы, дальше буду думать :think: