Цикл в цикле

Простейшие вопросы в области инженерной разработки
SusLiK495
beginner
beginner
Сообщения: 32
Зарегистрирован: 18 окт 2011, 18:10
Версия LabVIEW: 8.6;2012
Откуда: Москва
Контактная информация:

Re: Цикл в цикле

Сообщение SusLiK495 »

Re: Цикл в цикле
Сообщение dadreamer Вчера, 16:47

SusLiK495 писал(а):
Подскажите, есть ли смысл создания программы из большого количества подпрограмм(модулей)?

Если вы о SubVI, то смысл есть, но нужно понимать, зачем это делается. Вообще, согласно идеологии программирования в :labview: , любая диаграмма должна помещаться на экран монитора. Допускается создавать строго горизонтальный код (слева направо) или вертикальный (сверху вниз). Часто этот идеал бывает недостижим. Тогда имеет смысл поместить некоторые части кода в SubVI, чтобы обеспечить компактность всей программы. Другой пример, когда использование SubVI актуально, это использование одного и того же кода в разных местах программы. Проще вызывать один и тот же инструмент, чем копировать идентичный код. Плюс, отладка и модификация одного SubVI намного проще, нежели работа с одинаковыми участками кода. SubVI также могут быть использованы для работы в параллельных циклах при многопоточных вызовах (реентерантное выполнение). Так что вполне естественно рассматривать SubVI просто как подпрограмму (процедуру/функцию) в текстовых языках программирования.
В моем случае я выносил весь цикл чтения в отдельный subvi и просто добавил его в основный цикл. Я правильно понимаю, что это приницпиальная ошибка и он должен быть вне вообще основного цикла?
123.jpg
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Цикл в цикле

Сообщение dadreamer »

SusLiK495, правильно, только вот от двойного while loop всё равно придётся избавиться. В упрощенном виде у вас должно получиться что-то подобное:
2015-10-02_20-17-55.jpg
То есть, цикл обработки UI, цикл чтения с порта и цикл логических операций (обработка строки с порта, например). Нижний цикл по хорошему должен содержать шаблон state machine и несколько логических состояний. В данном случае я показал только одно - работа с данными из порта. Передача данных между циклами осуществляется через очереди и уведомители.

В вашем случае можно обойтись без SubVI в среднем цикле, так как там будет только VISA Read, а парсинг строки будет выполняться в нижнем цикле.
SusLiK495
beginner
beginner
Сообщения: 32
Зарегистрирован: 18 окт 2011, 18:10
Версия LabVIEW: 8.6;2012
Откуда: Москва
Контактная информация:

Re: Цикл в цикле

Сообщение SusLiK495 »

dadreamer писал(а):SusLiK495, правильно, только вот от двойного while loop всё равно придётся избавиться. В упрощенном виде у вас должно получиться что-то подобное:
2015-10-02_20-17-55.jpg
То есть, цикл обработки UI, цикл чтения с порта и цикл логических операций (обработка строки с порта, например). Нижний цикл по хорошему должен содержать шаблон state machine и несколько логических состояний. В данном случае я показал только одно - работа с данными из порта. Передача данных между циклами осуществляется через очереди и уведомители.

В вашем случае можно обойтись без SubVI в среднем цикле, так как там будет только VISA Read, а парсинг строки будет выполняться в нижнем цикле.
Так, с очередью я разобрался вроде. Подскажите, а как реализовать моё условие с 3-мя значениями в рамками event structure? Пытался, что-то не очень получается.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Цикл в цикле

Сообщение dadreamer »

Создайте ещё один параллельный цикл, в котором будет выполняться запись в COM-порт через инструменты VISA. Этот цикл свяжете очередью (строкового типа) с циклом обработки UI (где размещена Event структура). В Event добавьте событие изменения значения вашего Combo Box'а. При выборе нового значения в Combo Box'е в очередь должна записываться команда, которую вы хотите отправить в порт. В цикле записи в порт эта команда будет извлекаться из очереди и отправляться в порт. В принципе, это всё.
SusLiK495
beginner
beginner
Сообщения: 32
Зарегистрирован: 18 окт 2011, 18:10
Версия LabVIEW: 8.6;2012
Откуда: Москва
Контактная информация:

Re: Цикл в цикле

Сообщение SusLiK495 »

dadreamer писал(а):Создайте ещё один параллельный цикл, в котором будет выполняться запись в COM-порт через инструменты VISA. Этот цикл свяжете очередью (строкового типа) с циклом обработки UI (где размещена Event структура). В Event добавьте событие изменения значения вашего Combo Box'а. При выборе нового значения в Combo Box'е в очередь должна записываться команда, которую вы хотите отправить в порт. В цикле записи в порт эта команда будет извлекаться из очереди и отправляться в порт. В принципе, это всё.
Я вот всё в толк не возьму, а как мне конкретную команду к конкретному ивенту привязать?
Я сделал 4 кейса
1.
1.jpg

2.Выбор первого положения(остальные по аналогии)
2.jpg
Что я дела не так в ивент структуре, я даже по примерам не понял как привязать конкретный выбор к команде. Подскажите, пожалуйста
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Цикл в цикле

Сообщение dadreamer »

Вот пример, делаете по аналогии.
Вложения
Example.vi
lv2011
(16.2 КБ) 269 скачиваний
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Цикл в цикле

Сообщение Vitekkz88 »

SusLiK495 писал(а):...как мне конкретную команду к конкретному ивенту привязать...я даже по примерам не понял как привязать конкретный выбор к команде. Подскажите, пожалуйста
1.Создайте Event-структуру
2.Создайте цикл while.
3.Поместите Event-структуру в цикл.
4.Создайте кнопку остановки цикла Stop Button.
5.Щелкните правой кнопкой мышки по Event-структуре
6.Выберете пункт Add Event Case.
7.В появившемся меню в списке Event Source выберите объект, для которого будет обрабатываться событие. Пока что это единственный объект Stop Button. В таблице "Event" выберите событие типа Value Change. Нажмите кнопку Ок.
Всё. В результате получили объект и обработку события типа "изменение состояния" этого объекта.
Теперь, допустим у Вас есть другие контролы(numeric, enum, text ring). Проделайте для этих контролов тоже самое, что и для контрола Stop Button.
Для того, чтобы передавать данные с этих контролов в другие циклы используются очереди, уведомители, reference(ссылки), локальные и глобальные переменные и т.д.
Для передачи данных в SubVI используйте очереди и уведомители. Как ими пользоваться Вам выше уже приводили примеры.
Вложения
1.png
2.png
3.png
3.png (10.29 КБ) 7007 просмотров
4.png
5.png
6.png
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Ответить

Вернуться в «Для чайников»