Прошу совета

Простейшие вопросы в области инженерной разработки
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Прошу совета

Сообщение Blackman »

Если они находятся в одном потоке (While Loop).

Если они находятся в двух потоках (2 параллельных While Loop), то кнопка Stop в потоке "Основной программы" не будет ждать завершения работы счетчика в потоке "Подпрограммы" (если этого не требуется).
Аватара пользователя
dadreamer

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

Re: Прошу совета

Сообщение dadreamer »

Ну, или так, да - разнести по параллельным циклам. Это, пожалуй, самое простое.
Artem.spb

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

Re: Прошу совета

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

decibel писал(а): Ну как я понял, впринципи не организовать такого, чтоб в проекте была именно подпрограмма, а не просто таймер/счетчик в основной программе и по кнопке стоп происходила бы остановка основной программы, а подпрограмма продолжала работать сама по себе...
а какова цель такой странности?
так как в любом случае основная программа будет ждать данные от ПП, а получить она их и сможет только по завершению или остановке ПП, судя по концепции DataFlow?!
Короче сказать, кнопка стоп сработает только по завершению ПП, так как в это время будет исключительно выполняться ПП.
сделайте две программы, которые будут обмениваться данными. Вариантов много. Один из самых простых - shared variable
decibel
beginner
beginner
Сообщения: 24
Зарегистрирован: 02 фев 2016, 19:10
Версия LabVIEW: 8.5.1

Re: Прошу совета

Сообщение decibel »

Мне кажется параллельность тут не устроить, так как связь между двумя while loop будет присутствовать полюбому, а на сколько я знаю, если существует хотя бы одна связь, то параллельность уже теряется.
Artem.spb, цель такой странности: подпрограмма-она же счетчик, взята для отладки программы и для простоты написания начальной программы...на самом же деле вместо автономного счетчика будет стоять ПП по работе примерно схожая со счетчиком, но других масштабов и она будет получать данные с некого устройства. И в случае непредвиденной ошибки необходимо будет по нажатию кнопки стоп-отправить основную программу в режим ожидания, а ПП оставить работать, но так как основная программа уже "ушла в спячку", то оказывать влияния на нее она уже не будет. А оставляем мы ПП в режиме работы так как, повторюсь, она будет работать с реальным устройством, и закрывать ее не рекомендуется.
Аватара пользователя
dadreamer

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

Re: Прошу совета

Сообщение dadreamer »

decibel писал(а):Мне кажется параллельность тут не устроить, так как связь между двумя while loop будет присутствовать полюбому, а на сколько я знаю, если существует хотя бы одна связь, то параллельность уже теряется.
Ну почему же, у вас получается классический подход в виде state machine с несколькими параллельными циклами:
- цикл обработки UI (нажатия кнопок и т.п.);
- цикл по работе с устройством-"счётчиком" (приём/отправка данных);
- цикл состояний конечного автомата (state machine).
В принципе, это всё, можно больше ничего не городить. Цикл state machine вы всегда можете перевести в спячку, нажав какую-нибудь кнопку типа "пауза" на FP и, таким образом, задействуете цикл обработки UI, который пошлёт команду в цикл state machine через очередь/уведомитель. Ну, а цикл по работе со "счётчиком" у вас крутится независимо от всего остального. Когда надо, берём оттуда данные или высылаем команду по состоянию или по кнопке.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Прошу совета

Сообщение Blackman »

decibel писал(а):Мне кажется параллельность тут не устроить, так как связь между двумя while loop будет присутствовать полюбому...
Попробуйте нарисовать картинку как это будет выглядеть.
Поэтому и называются параллельные, что работают независимо друг от друга (параллельно).

dadreamer уже и архитектуру сделал. Осталось перенести на BD) Примеры реализации в шаблонах LabVIEW и Example Finder.
decibel
beginner
beginner
Сообщения: 24
Зарегистрирован: 02 фев 2016, 19:10
Версия LabVIEW: 8.5.1

Re: Прошу совета

Сообщение decibel »

Премного благодарен, эта архитектура-то что нужно, с одной оговоркой, "счетчик" не должен крутиться пока мы не скажем ему этого делать...этот счетчик-по сути расходомер подключенный к устройству...во время работы программы и до обращения к расходомеру (счетчику) он просто фиксирует колличество вещества на графиках, как только программа доходит до того места, где необходимо включить счетчик - необходимо обратиться к расходомеру и зупустить подсчет кол-ва вещества, как только порог будет достигнут счетчик вырубается. Так как самого устройства, к которому подключается расходомер, нет, точнее у меня нет доступа пока, решено было заменить его на обычный счетчик.
Сегодня посидел подумал, и окончательно описал режимы работы, запечатлю его тут, чтоб ничего не упустить)
1) Нормальный режим:
а)кнопками задаем начальное условие (цикл 1) и запускаем расходомер--он не считает ничего, просто осуществился вход в цикл (цикл 3).
б)После нажимаем на кнопку, чтоб запустить автоматический режим - это то, что описано в state machine (цикл 2), как только машина доходит до состояния "counter", необходимо подать сигнал на счетчик, я так понимаю с помощью события, но это я пока так сказал-догадки).
в)Как счетчик достигнет порога поступает сигнал в машину состояний, о том что можно работать дальше...меняются состояния до конечного, а затем опять включается ручной режим(тот в котором мы задавали начальное условие).
2)Режим ошибки во время работы счетчика
Пункты а) и б) режима 1).
Во время работы счетчика жмем кнопку (или как-то по-другому прерываем) - должен включиться ручной режим, при этом счетчик продолжает считать, и до конца мы управляем уже вручную.
3)Режим ошибки уже после работы счетчика
Переход в ручное состояние по кнопке или по чему-то еще.
Вложения
Снимок.JPG
SM1.rar
(21.79 КБ) 131 скачивание
Аватара пользователя
dadreamer

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

Re: Прошу совета

Сообщение dadreamer »

decibel, внешний While Loop можно было бы оформить как отдельный цикл по обработке GUI-событий панели (таких, как нажатие на "Стоп"). Логику счётчика вполне можно реализовать внутри цикла state machine, выделив для этого отдельный кадр (скажем, "состояние подсчёта"), т.е. этот цикл по идее убрать можно. Если не нужно, то можем и не считать никакие импульсы с расходомера, пусть себе данные поступают и исчезают, как только понадобилось - перешли в кадр "состояние подсчёта" и начинаем считать импульсы.
decibel писал(а):необходимо подать сигнал на счетчик, я так понимаю с помощью события, но это я пока так сказал-догадки
Можно, конечно, User Events использовать. Но по-моему уведомитель (notifier) типа boolean попроще будет, т.к. у него всего два состояния - true или false - чем мы можем пользоваться. Цикл получения данных от расходомера можно связать с циклом state machine через очередь конкретного типа (например, расход в формате Double, то и очередь типа Double).
В общем, всё-таки посмотрите примеры по "конечному автомату". Изучите, как работают механизмы синхронизации, на примере http://www.ni.com/white-paper/3023/en/ (подход "Producer - Consumer"). Посмотрите схожие темы на форуме, например http://www.labviewportal.org/viewtopic. ... 096#p66096

А также вот вам литература и примеры:
1) "LabVIEW Основы II: Разработка" : шаблон «Производитель-потребитель» + материал в главе 2 "Передача данных между несколькими циклами"
2) Питер Блюм "LabVIEW: стиль программирования", в частности глава 8 "Шаблоны" и раздел 8.3.1 "Параллельные циклы"
3) примеры в папке C:\Program Files (x86)\National Instruments\LabVIEW 2014\examples\Synchronization
decibel
beginner
beginner
Сообщения: 24
Зарегистрирован: 02 фев 2016, 19:10
Версия LabVIEW: 8.5.1

Re: Прошу совета

Сообщение decibel »

Еще раз большое спасибо за советы, все прочел, изучил-более-менее прояснилась ситуация) На самом деле поправить в моей программе надо было не много, чтоб она заработала как мне нужно. Но, остался один вопрос: можно ли не меняя сильно программу как-то заменить передачу сигнала по диоду(на рисунке показал). Пробовал нотифаеры, очереди, основная программа дожидается ПП и стоп не срабатывает, а с локальной переменной все отлично) Оставил бы и так, но все время перед запуском "тушить" диод надоело)
Вложения
2.png
SM.rar
(22.97 КБ) 141 скачивание
Аватара пользователя
dadreamer

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

Re: Прошу совета

Сообщение dadreamer »

decibel, посмотрите, может, вот такой пример подойдёт.
Вложения
Example.vi
lv8.5
(26.82 КБ) 156 скачиваний
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Прошу совета

Сообщение Blackman »

... Оставил бы и так, но все время перед запуском "тушить" диод надоело)
Эту переменную надо инициализировать (false) не перед запуском, а перед каждым включением счетчика.
Вложения
MB Master-Eth_COILWRITE_Ed1.vi
(51.68 КБ) 129 скачиваний
State Machine+DAQ Loop.PNG
decibel
beginner
beginner
Сообщения: 24
Зарегистрирован: 02 фев 2016, 19:10
Версия LabVIEW: 8.5.1

Re: Прошу совета

Сообщение decibel »

Blackman, даже не знаю как вас и благодарить!) Понял как нужно было сделать! Но я уже переделал с диода на уведомитель, все работает :super: Не знаю как дело дальше пойдет, возможно, что и верну как было. В любом случае спасибо огромное за помощь :thank:
Проект dadreamer также был полезен! И вам спасибо!
decibel
beginner
beginner
Сообщения: 24
Зарегистрирован: 02 фев 2016, 19:10
Версия LabVIEW: 8.5.1

Re: Прошу совета

Сообщение decibel »

Приветствую всех) Возник вопрос следующего плана: можно ли каким-нибудь образом создать подпрограмму, которая "опрашивала" свои входы на изменение данных..как, к примеру, делает это в моей программе приложения из библиотеки modbus? Объясню ситуацию, в подпрограмму я отправляю два значения, одно true, другое false, как видно по рисунку просто осуществляется вход в счетчик, но ничего не считается. Когда "основная" машина состояний доходит до состояния counter, с помощью уведомителя вторая машина состояний должна перейти в другое состояние и выдать два значения true. Загвоздка в том, что ПП уже функционирует, и не принимает сменившиеся состояния, и счетчик внутри не запускается.
Прошу прощения за столь бестолковую программу, но приходится доносить только таким образом, так как на руках нет основы..суть впринципи таже) Заранее спасибо!
Вложения
sm1.png
SM.rar
(33.26 КБ) 135 скачиваний
Счетчик.JPG
Artem.spb

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

Re: Прошу совета

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

1) можно использовать те же нотификаторы.
2) можно использовать сдвиговые регистры для хранения данных

придётся переделать суть счётчика в любом случае. В нынешнем виде нижний цикл неработоспособен, он даже не получит сообщение по нотификатору, потому что будет ждать завершение работы subVI.
что этот счётчик должен считать, какой результат его работы и вообще нижнего цикла ожидается?
Аватара пользователя
dadreamer

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

Re: Прошу совета

Сообщение dadreamer »

decibel, вы по видимому руководствовались чем-то своим при разработке программы. Почему для уведомителей используется Wait on Notification с бесконечным ожидаением, а не Get Notifier Status, который моментально отрабатывает и дальше делаем, что хотим?..
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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