Трудности использования SubVi

Простейшие вопросы в области инженерной разработки
Ermak337
interested
interested
Сообщения: 9
Зарегистрирован: 10 апр 2013, 09:13
Версия LabVIEW: 10

Трудности использования SubVi

Сообщение Ermak337 »

День добрый, уважаемые знатоки.

Меня мучает проблема следующего характера: очень часто складывается ситуация, что при выполнении тех или иных задач (чаще связаных с графикой, листбоксами или Вейформграфами) приходится оперировать со свойствами объектов, причем код получается внушительных размеров и вызываться должен многократно во многих местах программы. Моя головная боль, что я не могу нормально упаковать такой код в SubVi.

Передача ссылок в SubVi ни к чему особо хорошему не приводит по следующим причинам: 1) не выполняются никакие события => невозможно сделать готовую библиотеку стандартной работы с графикой на базе SubVi; 2) Случаются утечки памяти и конфликты типизации при работе с Вейформграфами. 3) SubVi со ссылками в качестве аргументов невозможно инлайнить вообще и скорость их выполнения выбешивает; 4) каждый раз увазяать ниточками и передавать по 20 ссылок в виайку некруто, а попытки создать некий кластер, содержащий ссылки на все нужные мне элементы управления, и передавать уже именно его добром не закончились (а именно была ругань со стороны SubVi на неопределенные типы, с которыми она знаться не желает. Типы проставлял руками согласно типам объектов - не помогло)

В связи с вышеизложенным вопрос: могу я как-то добраться до внутренних свойств у объектов лицевой панели, дабы перетаскивать непосредственно их? Особо это касается Листбоксов, так как они вообще не оборудованы методами обработки содержимого, а удобство использования публичных свойств оставляет желать лучшего.

Ну или как еще можно свернуть в SubVi нечто, что оперирует со свойствами объектов лицевой панели таким образом, чтобы это выполнялось достаточно быстро.
Версия LabView 2010

Буду благодарен за любые мнения и советы. Заранее спасибо
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5461
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Re: Трудности использования SubVi

Сообщение IvanLis »

Для доступа к свойствам объекта в SubVI в него нужно передавать ссылку (вы об этом в принципе знаете).
Чтобы не тянуть 20 ссылок, объединяйте их в кластер (тоже делаете).

Единственная проблема, которая мне видится, это неправильная организация именно кластера. Для этого делается control (Type Def) и сохраняется, далее в проекте используется именно он, что бы структура везде была типизирована. Это позволит решить множество проблем при модифицировании.

-----------
Свое мнение по поводу всего остального опущу.
Artem.spb

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

Re: Трудности использования SubVi

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

дополнение к предыдущему, на сонове существенной строки
Ermak337 писал(а):Типы проставлял руками согласно типам объектов - не помогло
правой на интересующем контроле - создать реф. дальше собрать все рефы в кластер (bundle), правой на выходе bundle - создать константу.
И менно эту константу поместить в typedef. Тогда типы ссылок будут точно соотвесттвовать типам контролов.
Ermak337
interested
interested
Сообщения: 9
Зарегистрирован: 10 апр 2013, 09:13
Версия LabVIEW: 10

Re: Трудности использования SubVi

Сообщение Ermak337 »

На счет typedef недопонял. Что это и где? Заранее спасибо
Artem.spb

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

Re: Трудности использования SubVi

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

Аватара пользователя
dadreamer

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

Re: Трудности использования SubVi

Сообщение dadreamer »

Ermak337 писал(а):SubVi со ссылками в качестве аргументов невозможно инлайнить вообще и скорость их выполнения выбешивает;
Не вызывайте в СабВИ Property / Invoke Nodes и вообще не дёргайте UI Thread, тогда и инлайнить сможете, и скорость работы будет максимально возможная (в тех пределах, что позволяет ОСь и железо). А вообще, выносите работу с (G)UI в отдельный поток (цикл), тогда и не будет таких проблем. Больше здесь мне добавить нечего.

По передаче большого числа параметров в СабВИ см. тему http://labviewportal.org/viewtopic.php? ... 88&p=67757
Ermak337
interested
interested
Сообщения: 9
Зарегистрирован: 10 апр 2013, 09:13
Версия LabVIEW: 10

Re: Трудности использования SubVi

Сообщение Ermak337 »

Господа, еще раз. При засовывании в кластер ссылок на такие динамически изменяемые объекты, как Вейформграфы, о да, в пределах окна я могу использовать строгие ссылки на данные окна, разворачивать их из кластера и все такое. Но мне лично никаким способом не удалось передать кластера такого вида в SubVi (о чем и тема), так как ссылки получаются не строгими на сколько я понимаю и далеко не все свойства можно будет менять. И с методами та же байда.
Даже к свойству Value доступ будет только через вариант, а про остальное я вообще молчу.

На счет можно будет инлайнить. Уважаемый dadreamer, попробуй выставить в VI propertis/Execution параметр inline для чего либо, содержащего на входе кластер из двух и более разнородных ссылок, а потом рассказывай. И 25000 double это тоже не баран чихнул, так что инлайнить я вынужден. Если же вы рассказать мне хотите, что проперти мне не нужны, то расскажите заодно как мне выводить на график (который на мордопанели) данные, полученные на основе этих 25000 точек, с учетом того что я вынужден пересчитывать их вручную, переставлять шкалы, выставлять смещение и умножение и еще кучу разных вещей. И на 200 разных событий обработку плотов по мыши тоже бы хотелось субвиайкой, а плоты - это снова свойства. Сказать "не используй в подпрограммах ничего, кроме самых простых действий" всякий может, но толку от таких подпрограмм?

По поводу "вынеси GUI отдельно" легко говорить тем, кто с сигналами не работает. А я не могу выплюхивать результаты их обработы как цифорки: надпись "Недостаточно памяти для завершения операции" не радует меня ни сколько. И для вывода их в мне кучу промежуточных преобразований надо делать. Однотипных. Часто-часто.... Ну вы поняли о чем я

Зы: Всем за поддержку спасибо. Решением своей проблемы выбрал тупую копипасту кусков кода. Только так и никак иначе увы, а очень жаль. LabView хороший язык для своих задач, а все извращенцы вроде меня, которые пытаются совместить на нем реализацию сложных пользовательских интерфейсов и реальную обработку сигналов получат все, что полагается за это получить.
Artem.spb

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

Re: Трудности использования SubVi

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

Ermak337 писал(а):Господа, еще раз. При засовывании в кластер ссылок на такие динамически изменяемые объекты, как Вейформграфы, о да, в пределах окна я могу использовать строгие ссылки на данные окна, разворачивать их из кластера и все такое. Но мне лично никаким способом не удалось передать кластера такого вида в SubVi (о чем и тема), так как ссылки получаются не строгими на сколько я понимаю и далеко не все свойства можно будет менять. И с методами та же байда.
судя по праведному гневу это вы поленились прочиать/воспроизвести.
Artem.spb писал(а):правой на интересующем контроле - создать реф. дальше собрать все рефы в кластер (bundle), правой на выходе bundle - создать константу.
И менно эту константу поместить в typedef. Тогда типы ссылок будут точно соотвесттвовать типам контролов.
Аватара пользователя
dadreamer

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

Re: Трудности использования SubVi

Сообщение dadreamer »

Ermak337 писал(а):На счет можно будет инлайнить. Уважаемый dadreamer, попробуй выставить в VI propertis/Execution параметр inline для чего либо, содержащего на входе кластер из двух и более разнородных ссылок, а потом рассказывай.
Так?
2017-03-29_17-21-43.jpg
Другой вопрос, что дальше вам :labview: разрешит с этими ссылками делать в инлайн SubVI.
Ermak337 писал(а):Если же вы рассказать мне хотите, что проперти мне не нужны
Я вообще-то ясно написал:
dadreamer писал(а):Не вызывайте в СабВИ Property / Invoke Nodes и вообще не дёргайте UI Thread
Ни слова о том, чтобы не использовать Property / Invoke Nodes в других циклах и ВП, где не требуется инлайн и времякритичные операции.
Ermak337 писал(а):расскажите заодно как мне выводить на график (который на мордопанели) данные, полученные на основе этих 25000 точек
Уже говорил. Вся работа с UI-потоком оформляется как отдельный цикл, связь этого цикла с остальными выполняется через очередь или какой-то другой инструмент синхронизации. Очередь может быть, например, строкового типа. Команда для отправки может иметь базовый вид "объект:действие:[данные]", скажем, "WFGraph1:Отобразить:Y1,Y2,Y3". Вам лишь нужно сделать простенький парсер на принимающей стороне и формирователь команд на отправляющей.
Ermak337 писал(а):Сказать "не используй в подпрограммах ничего, кроме самых простых действий" всякий может, но толку от таких подпрограмм?
Вам такого не говорили. Было сказано о том, что не стоит переключаться в UI-поток, если важна скорость работы SubVI и inline. Кроме собственно Property / Invoke Nodes в этом случае не следует использовать не реентерантные DLL и CIN (оранжевый цвет), работу с экраном, с клавой и с мышью. Более подробно написано здесь:
Multitasking in LabVIEW
The UI Thread, Root Loop, and LabVIEW: What You Need to Know
Все остальные инструменты использовать не возбраняется.
Ermak337 писал(а):По поводу "вынеси GUI отдельно" легко говорить тем, кто с сигналами не работает. А я не могу выплюхивать результаты их обработы как цифорки: надпись "Недостаточно памяти для завершения операции" не радует меня ни сколько. И для вывода их в мне кучу промежуточных преобразований надо делать. Однотипных. Часто-часто.... Ну вы поняли о чем я
Использовать :vi: с палитры Synchronization религия не позволяет?
Ermak337 писал(а):Зы: Всем за поддержку спасибо. Решением своей проблемы выбрал тупую копипасту кусков кода. Только так и никак иначе увы, а очень жаль.
Сами спросили, сами себе ответили. Зачем было тему на форуме создавать... :dntknw:
Ermak337
interested
interested
Сообщения: 9
Зарегистрирован: 10 апр 2013, 09:13
Версия LabVIEW: 10

Re: Трудности использования SubVi

Сообщение Ermak337 »

В ближайшее время выкину снапшоты того, что пробовал и что из этого вышло. Сейчас сделать не могу, ибо попытки успехом не увенчались и как следствие не выжили. Но набрать руками кластер для тайпдефа из референсов... А вы пробовали? Там штуковины типо локал вариэйблов. Я пораждал от них индикаторы и складывал в кластер - к добру не привело. То есть в пределах окна свертывается и развертывается, но не далее.

Неименованными кластерами религия пользоваться не позволяла - так что извеняйте. Но потом, науки ради, может я и попробую (но пользоваться неименованными кластерами все равно не буду - при наличии однотипных параметров в кластере немыслимо для меня это)

Я извиняюсь, что своевременно не сделал все необходимые снапшеты. Воспроизведу в течении пары дней (сейчас очень все срочно и напряжно. Сначала результат, потом чистая наука)

dadreamer, еще раз. У меня в данный момент массив длинной 17000 точек на 200 параметров (двумерный массив). Он бывает и другим (больше или меньше) и я его должен выводить в форме графиков, с возможностью динамического масштабирования. Такое кол-во точек ни в один граф вывести нельзя - по памяти отвалимся, да и не нужно - видно их не будет. Поэтому у меня идет преобразование до разрешения 600х200 из рассматриваемого куска и выкидываю на график уже это и живем. При этом мне надо согласно масштабированию накрутить график в смысле состояния его офсетов, мултиплеров и пределов. Я лишь говорю, что было бы хорошо мочь менять проперти в SubVI и это сэкономило бы мне кучу кода.

Кстати, адекватные люди подсказали решение: запустил цикл, в котором все критичные мне проперти всех нужных контролов постоянно переустанавливаются переменными вида кластеров и ифами вызываются методы. В субвиайках делаю что хочу, а на выводе нужные состояния вгужаю в эти перемннные. Работает без проблем, хотя по вашей религии может и неправильно
Borjomy_1

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

Re: Трудности использования SubVi

Сообщение Borjomy_1 »

Ermak337, Так в кластер надо реальные референсы ваших контролов закидывать, т.е перед передачей в SubVI ее надо заполнять. А так структура обеспечивает только контроль типов и соответственно доступ к определенных методов для контролов.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5461
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Re: Трудности использования SubVi

Сообщение IvanLis »

Ermak337 писал(а):В ближайшее время выкину снапшоты того, что пробовал и что из этого вышло. Сейчас сделать не могу, ибо попытки успехом не увенчались и как следствие не выжили. Но набрать руками кластер для тайпдефа из референсов... А вы пробовали? Там штуковины типо локал вариэйблов. Я пораждал от них индикаторы и складывал в кластер - к добру не привело. То есть в пределах окна свертывается и развертывается, но не далее.
Получается разговор глухого с немым.
Вам с самого начала говорят, как нужно сделать, посмотрите видео, может станет понятнее.
По поводу inline...
Ermak337 писал(а):На счет можно будет инлайнить. Уважаемый dadreamer, попробуй выставить в VI propertis/Execution параметр inline для чего либо, содержащего на входе кластер из двух и более разнородных ссылок, а потом рассказывай.
Вы не верно ассоциируете причинно следственные связи.
Не получается нормально сделать, т.к. (http://zone.ni.com/reference/en-XX/help ... I_Overhead):
A subVI that you want to inline cannot have any of the following characteristics:
- Contains recursion
- Uses automatic error handling
- Contains certain block diagram nodes, such as Property Nodes and Invoke Nodes. These nodes generate edit-time error messages if you enable subVI inlining.
.....

hGisgGgv6-Y
сценарий не продумывал, так что извиняйте.
Untitled.vi
LV2010
(13.43 КБ) 127 скачиваний
Untitled_SubVI.vi
(15.47 КБ) 131 скачивание
Control.ctl
(7.21 КБ) 136 скачиваний
Artem.spb

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

Re: Трудности использования SubVi

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

Ermak337 писал(а):В ближайшее время выкину снапшоты того, что пробовал и что из этого вышло. Сейчас сделать не могу, ибо попытки успехом не увенчались и как следствие не выжили. Но набрать руками кластер для тайпдефа из референсов... А вы пробовали?
нет, конечно. Зачем пробовать? я сразу даю глупые советы, чтобы поиздеваться над людьми.
я не только пробовал, но и постоянно так делаю.
__main__Inline__Blenderd.png
впрочем, Иван уже выложил видеоинструкцию.
Borjomy_1

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

Re: Трудности использования SubVi

Сообщение Borjomy_1 »

Есть еще один вариант: использование Shared Variables. Контролам назначается переменная через Data Binding в их свойствах. Тогда никаких референсов тянуть не надо. А если еще данные группировать в кластеры, то получается весьма компактная конструкция, без этих извращений с референсами.
Но вообще - если индицированных данных много, то что-то с программой.
Аватара пользователя
Vitekkz88

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

Re: Трудности использования SubVi

Сообщение Vitekkz88 »

Ermak337, у вас нет понимания того, что Вам рекомендуют. А рекомендуют всё верно.
Начинать нужно с архитектуры приложения. Необходимый минимум:
1. Цикл с по работе с UI
2. Цикл на сбор данных
3. Цикл на обработку данных
4. Цикл на визуализацию
5. Цикл сохранения данных
6. Цикл логирования
7. Цикл на property/invoke(в вашем случае для масштабирования графиков)
Связь между циклами через очереди/уведомители(надеюсь вы ими не брезгуете пользоваться).
Ermak337 писал(а):Но набрать руками кластер для тайпдефа из референсов... А вы пробовали?
У меня есть проект, в котором ~300 контролов/индикаторов. Эти контролы/индикаторы разделены на 17 кластеров. 17, Карл!!! На каждый кластер создан референс, все референсы в отдельный кластер. Так же на сотню контролов созданы отдельные рефы и так же собраны в кластер, для того чтоб можно было их свойства дёргать(цвет менять, дизейблить, скрывать и т.д.).
Ermak337 писал(а):Даже к свойству Value доступ будет только через вариант, а про остальное я вообще молчу
Можно и через вариант. Что в этом такого? Не умеете работать с этим типом данных? Выше вон рассказали про TypeDef-ы, кластера, и т.д. Не надо это игнорить, это решение проблемы.
Ermak337 писал(а):У меня в данный момент массив длинной 17000 точек на 200 параметров (двумерный массив). Он бывает и другим (больше или меньше) и я его должен выводить в форме графиков, с возможностью динамического масштабирования. Такое кол-во точек ни в один граф вывести нельзя - по памяти отвалимся, да и не нужно - видно их не будет.
А давайте посчитаем память? Значит : 17000(кол-во точек)х8(размерность типа данных double,8 байт)х200(кол-во параметров) = 27.200 000 байт(27 МБ)! У вас нет 27 МБ памяти? :D А теперь проведём натуральный эксперимент: создаём двумерный массив: 200 "типа параметров", каждый содержит 17000 точек. Всё работает. Другое дело, сколько времени потратится на отрисовку и визуальный анализ всего этого хозяйства. Поэтому для таких объемов информации создают несколько графиков и по ним группируют отображаемые сигналы. Можно еще и децимацию добавить, если точность не так важна.
Ermak337 писал(а):Я лишь говорю, что было бы хорошо мочь менять проперти в SubVI и это сэкономило бы мне кучу кода.

Ну дк можно же менять. Другое дело, что из-за этого у вас производительность просядет(если будете дёргать постоянно в SubVI свойства графика в том числе).А это следствие того, что кто-то выбрал плохую архитекртуру для приложения, напрограммировал что называется "как смог", а теперь имеет любовь с этим делом.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Ответить

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