Event, While, Case и Timed
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Event, While, Case и Timed
Доброго времени суток. Стоит задача опроса 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" на входе, то опрос идет только по нажатию кнопки (однократно). Что мне надо поменять, подскажите.
1. Запускаю программу - жмем Run.
2. Налаживаем связь с устройством - жмем кнопку "Включение/Выключение". Кнопка переходит в состояние "Включено".
3. Запускаем опрос датчика температуры - жмем кнопку "Датчик Т1". Кнопка переходит в состояние "Включено".
4. Идет опрос датчика (генерация случайных чисел) с выводом один раз в секунду (для примера) полученного значения.
4. При повторном нажатии кнопки "Датчик Т1" цикл опроса конкретно этого датчика (генерации случайных чисел) должен остановится. Кнопка должна перейти в состояние "Выключено". При этом другие вкладки структуры Event Structure должны работать как и работали. Если снова нажать кнопку "Датчик Т1" опрос должен возобновиться. И так далее.
Как это реализовать теоретически понимаю, но по факту выходит не то, что должно. В приложенном примере при нажатии "Включение/Выключение" и "Датчик Т1" опрос запускается, но остановить я его не могу кнопками, только принудительно самим Labview. Если изменить Loop Condition внутри Timed Loop на выключение при "True" на входе, то опрос идет только по нажатию кнопки (однократно). Что мне надо поменять, подскажите.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Event, While, Case и Timed
Нельзя цикл опроса датчика заводить в Event Node. В нем можно делать только управление другими циклами.
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 174 раза
- Контактная информация:
Re: Event, While, Case и Timed
При такой архитектуре он не остановится в принципе. Провод - это не ссылка на кнопку, это само значение в первый момент. И дальше оно "навечно" останется таким в этом проводе. Поэтому цикл будет работать вечно.
Более того, пока не остановится цикл (= никогда), остальные события не будут работать.
Для начала надо поменять фундаментальное представление о LabVIEW :)Что мне надо поменять, подскажите.
Не знаю, что у вас в других циклах, но судя по описанию что-то такое же. И если вы ожидаете, что все кейсы работают параллельно, то вы коренным образом заблуждаетесь.
Цикл он на то и цикл, что следующая итерация начнётся только после того, как полностью завершится предыдущая. Если нужно, чтобы несколько циклов работали параллельно, то и надо их располагать "параллельно", т.е. рядом, а не внутри другого цикла.
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Re: Event, While, Case и Timed
Я пока с TCP не начал работать, много чего не использовал и обходился более простыми и очевидными решениями. Я понимаю, что мне в данном случае лучше уйти от Event Structure, но при этом я не понимаю, как мне запускать по нажатию разных кнопок разные циклы опроса 32-х датчиков! При этом не отключаясь от сервера и, соответственно, не останавливая другие части кода. Пока я вижу, что нужно 32 Case в каждом из которых будет Timed Loop. Но опять же, как выйти из бесконечного опроса.. Можете простенький примерчик набросать? Ну или на пальцах объяснить хотя бы. Либо литературу подходящую. Хотя в принципе я несколько имеющихся в наличии книжек прочитал, подходящего не нашел.
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Re: Event, While, Case и Timed
Так, в принципе получился нижеприведенный вариант. Жду критики
Единственно напрягает, что неудобно без Event Structure. До этого раскидывал разные фрагменты кода на разные кнопки, как мне этого хотелось. И подключение к устройствам производилась по нажатию на кнопку. А сейчас приходится перед запуском кода (Run) активировать кнопку для нормального запуска Case (в данном случае кнопка "Опрос") и только потом запускать код.
Единственно напрягает, что неудобно без Event Structure. До этого раскидывал разные фрагменты кода на разные кнопки, как мне этого хотелось. И подключение к устройствам производилась по нажатию на кнопку. А сейчас приходится перед запуском кода (Run) активировать кнопку для нормального запуска Case (в данном случае кнопка "Опрос") и только потом запускать код.
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 174 раза
- Контактная информация:
Re: Event, While, Case и Timed
Вот ту совершено непонятно, как идёт опрос, и что такое сервер.
И от этого зависит архитектура. Потому что если всё идёт с одного сервера, то это один цикл, если на каждый датчик отдельное соединение, то придётся делать 32 цикла.
А в целом изучите Producer/Consumer Architecture
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Re: Event, While, Case и Timed
Всего 32 датчика (16 приборов, каждый имеет два датчика). Связаны они по одной шине и информация от них поступает последовательно. Меняем в посылке адрес датчика (01, 02, 03 и т.д.). Я понимаю как делать опрос, выстраиваю очереди и т.д. Но получается слишком много циклов и условий, из-за чего и идет путаница. Я выше уже писал ведь алгоритм работы. Пока не надо смотреть на количество датчиков. Мне надо с циклами разобраться, как правильно запускать и выключать. Тот вариант примера, что я привел вроде бы рабочий. Но мне кажется есть что-то правильнее и оптимальнее
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 174 раза
- Контактная информация:
Re: Event, While, Case и Timed
Именно это и не правильно.
Зачем много циклов? Если все сидят на одной шине, то опрашивать надо последовательно в одном цикле. Иначе посыпятся конфликты запросов-ответов.
-
- beginner
- Сообщения: 24
- Зарегистрирован: 27 окт 2019, 21:21
- Версия LabVIEW: 17,20,nxg5
- Благодарил (а): 7 раз
- Контактная информация:
Re: Event, While, Case и Timed
Я сделал так 9 приборов по 2 сенсора на каждом прибореzorg25406 писал(а): ↑11 фев 2021, 18:21 Всего 32 датчика (16 приборов, каждый имеет два датчика). Связаны они по одной шине и информация от них поступает последовательно. Меняем в посылке адрес датчика (01, 02, 03 и т.д.). Я понимаю как делать опрос, выстраиваю очереди и т.д. Но получается слишком много циклов и условий, из-за чего и идет путаница. Я выше уже писал ведь алгоритм работы. Пока не надо смотреть на количество датчиков. Мне надо с циклами разобраться, как правильно запускать и выключать. Тот вариант примера, что я привел вроде бы рабочий. Но мне кажется есть что-то правильнее и оптимальнее
Схема рабочая, но не совсем правильная (делалась быстро, для эксперимента), идея думаю будет понятна.
-
IvanLis
- guru
- Сообщения: 5463
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Event, While, Case и Timed
Вам же написали, что нужно уходить от множества циклов и структур.
Представьте, что Вам нужно сделать опрос 150 устройств, на каждом из которых разное количество датчиков от 3 до 10, а еще если и у каждого параметра своя схема преобразования.
Что Вы делать будете? Так в любом случае не нужно делать : viewtopic.php?f=35&t=10378
Особенно когда Вам потребуется сделать перезапрос или переподключение, с циклами вообще никак не получится, там все жестко.
Должно быть примерно так: Здесь постоянно, по кругу датчики опрашиваются, а в массиве данные обновляются.
Представьте, что Вам нужно сделать опрос 150 устройств, на каждом из которых разное количество датчиков от 3 до 10, а еще если и у каждого параметра своя схема преобразования.
Что Вы делать будете? Так в любом случае не нужно делать : viewtopic.php?f=35&t=10378
Особенно когда Вам потребуется сделать перезапрос или переподключение, с циклами вообще никак не получится, там все жестко.
Должно быть примерно так: Здесь постоянно, по кругу датчики опрашиваются, а в массиве данные обновляются.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 6 Ответы
- 231 Просмотры
-
Последнее сообщение Artem.spb