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

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

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

Postby Ermak337 on 28 Mar 2017, 14:05

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

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

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

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

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

Буду благодарен за любые мнения и советы. Заранее спасибо
Ermak337
interested
interested
 
Posts: 9
Joined: 10 Apr 2013, 09:13
LabVIEW Version: 10
Karma: 0

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

Postby IvanLis on 28 Mar 2017, 14:48

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

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

-----------
Свое мнение по поводу всего остального опущу.
User avatar
IvanLis
professor
professor
 
Posts: 4425
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 685
hardware VIP bloggers teachers

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

Postby Artem.spb on 28 Mar 2017, 14:56

дополнение к предыдущему, на сонове существенной строки
Ermak337 wrote:Типы проставлял руками согласно типам объектов - не помогло

правой на интересующем контроле - создать реф. дальше собрать все рефы в кластер (bundle), правой на выходе bundle - создать константу.
И менно эту константу поместить в typedef. Тогда типы ссылок будут точно соотвесттвовать типам контролов.
Artem.spb
expert
expert
 
Posts: 1184
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 212
CLD hardware I/O VIP freelance

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

Postby Ermak337 on 28 Mar 2017, 15:31

На счет typedef недопонял. Что это и где? Заранее спасибо
Ermak337
interested
interested
 
Posts: 9
Joined: 10 Apr 2013, 09:13
LabVIEW Version: 10
Karma: 0

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

Postby Artem.spb on 28 Mar 2017, 15:37

Artem.spb
expert
expert
 
Posts: 1184
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 212
CLD hardware I/O VIP freelance

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

Postby dadreamer on 28 Mar 2017, 15:47

Ermak337 wrote:SubVi со ссылками в качестве аргументов невозможно инлайнить вообще и скорость их выполнения выбешивает;

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

По передаче большого числа параметров в СабВИ см. тему viewtopic.php?f=35&t=8488&p=67757
User avatar
dadreamer
doctor
doctor
 
Posts: 2826
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 699
I/O VIP vision internet

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

Postby Ermak337 on 29 Mar 2017, 14:24

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

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

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

Зы: Всем за поддержку спасибо. Решением своей проблемы выбрал тупую копипасту кусков кода. Только так и никак иначе увы, а очень жаль. LabView хороший язык для своих задач, а все извращенцы вроде меня, которые пытаются совместить на нем реализацию сложных пользовательских интерфейсов и реальную обработку сигналов получат все, что полагается за это получить.
Ermak337
interested
interested
 
Posts: 9
Joined: 10 Apr 2013, 09:13
LabVIEW Version: 10
Karma: 0

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

Postby Artem.spb on 29 Mar 2017, 15:33

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

судя по праведному гневу это вы поленились прочиать/воспроизвести.
Artem.spb wrote:правой на интересующем контроле - создать реф. дальше собрать все рефы в кластер (bundle), правой на выходе bundle - создать константу.
И менно эту константу поместить в typedef. Тогда типы ссылок будут точно соотвесттвовать типам контролов.
Artem.spb
expert
expert
 
Posts: 1184
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 212
CLD hardware I/O VIP freelance

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

Postby dadreamer on 29 Mar 2017, 15:53

Ermak337 wrote:На счет можно будет инлайнить. Уважаемый dadreamer, попробуй выставить в VI propertis/Execution параметр inline для чего либо, содержащего на входе кластер из двух и более разнородных ссылок, а потом рассказывай.

Так?
2017-03-29_17-21-43.jpg

Другой вопрос, что дальше вам :labview: разрешит с этими ссылками делать в инлайн SubVI.
Ermak337 wrote:Если же вы рассказать мне хотите, что проперти мне не нужны

Я вообще-то ясно написал:
dadreamer wrote:Не вызывайте в СабВИ Property / Invoke Nodes и вообще не дёргайте UI Thread

Ни слова о том, чтобы не использовать Property / Invoke Nodes в других циклах и ВП, где не требуется инлайн и времякритичные операции.
Ermak337 wrote:расскажите заодно как мне выводить на график (который на мордопанели) данные, полученные на основе этих 25000 точек

Уже говорил. Вся работа с UI-потоком оформляется как отдельный цикл, связь этого цикла с остальными выполняется через очередь или какой-то другой инструмент синхронизации. Очередь может быть, например, строкового типа. Команда для отправки может иметь базовый вид "объект:действие:[данные]", скажем, "WFGraph1:Отобразить:Y1,Y2,Y3". Вам лишь нужно сделать простенький парсер на принимающей стороне и формирователь команд на отправляющей.
Ermak337 wrote:Сказать "не используй в подпрограммах ничего, кроме самых простых действий" всякий может, но толку от таких подпрограмм?

Вам такого не говорили. Было сказано о том, что не стоит переключаться в UI-поток, если важна скорость работы SubVI и inline. Кроме собственно Property / Invoke Nodes в этом случае не следует использовать не реентерантные DLL и CIN (оранжевый цвет), работу с экраном, с клавой и с мышью. Более подробно написано здесь:
Multitasking in LabVIEW
The UI Thread, Root Loop, and LabVIEW: What You Need to Know
Все остальные инструменты использовать не возбраняется.
Ermak337 wrote:По поводу "вынеси GUI отдельно" легко говорить тем, кто с сигналами не работает. А я не могу выплюхивать результаты их обработы как цифорки: надпись "Недостаточно памяти для завершения операции" не радует меня ни сколько. И для вывода их в мне кучу промежуточных преобразований надо делать. Однотипных. Часто-часто.... Ну вы поняли о чем я

Использовать :vi: с палитры Synchronization религия не позволяет?
Ermak337 wrote:Зы: Всем за поддержку спасибо. Решением своей проблемы выбрал тупую копипасту кусков кода. Только так и никак иначе увы, а очень жаль.

Сами спросили, сами себе ответили. Зачем было тему на форуме создавать... :dntknw:
User avatar
dadreamer
doctor
doctor
 
Posts: 2826
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 699
I/O VIP vision internet

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

Postby Ermak337 on 29 Mar 2017, 16:52

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

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

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

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

Кстати, адекватные люди подсказали решение: запустил цикл, в котором все критичные мне проперти всех нужных контролов постоянно переустанавливаются переменными вида кластеров и ифами вызываются методы. В субвиайках делаю что хочу, а на выводе нужные состояния вгужаю в эти перемннные. Работает без проблем, хотя по вашей религии может и неправильно
Ermak337
interested
interested
 
Posts: 9
Joined: 10 Apr 2013, 09:13
LabVIEW Version: 10
Karma: 0

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

Postby Borjomy_1 on 29 Mar 2017, 17:38

Ermak337, Так в кластер надо реальные референсы ваших контролов закидывать, т.е перед передачей в SubVI ее надо заполнять. А так структура обеспечивает только контроль типов и соответственно доступ к определенных методов для контролов.
Borjomy_1
expert
expert
 
Posts: 1739
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 307
VIP

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

Postby IvanLis on 29 Mar 2017, 18:14

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

Получается разговор глухого с немым.
Вам с самого начала говорят, как нужно сделать, посмотрите видео, может станет понятнее.
По поводу inline...
Ermak337 wrote:На счет можно будет инлайнить. Уважаемый 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.
.....


https://youtu.be/hGisgGgv6-Y

сценарий не продумывал, так что извиняйте.
Untitled.vi
LV2010
(13.43 KiB) Downloaded 13 times
Untitled_SubVI.vi
(15.47 KiB) Downloaded 13 times
Control.ctl
(7.21 KiB) Downloaded 14 times
User avatar
IvanLis
professor
professor
 
Posts: 4425
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2010
Karma: 685
hardware VIP bloggers teachers

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

Postby Artem.spb on 29 Mar 2017, 19:07

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

нет, конечно. Зачем пробовать? я сразу даю глупые советы, чтобы поиздеваться над людьми.
я не только пробовал, но и постоянно так делаю.
__main__Inline__Blenderd.png

впрочем, Иван уже выложил видеоинструкцию.
Artem.spb
expert
expert
 
Posts: 1184
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 212
CLD hardware I/O VIP freelance

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

Postby Borjomy_1 on 29 Mar 2017, 21:23

Есть еще один вариант: использование Shared Variables. Контролам назначается переменная через Data Binding в их свойствах. Тогда никаких референсов тянуть не надо. А если еще данные группировать в кластеры, то получается весьма компактная конструкция, без этих извращений с референсами.
Но вообще - если индицированных данных много, то что-то с программой.
Borjomy_1
expert
expert
 
Posts: 1739
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 307
VIP

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

Postby Vitekkz88 on 30 Mar 2017, 06:54

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 свойства графика в том числе).А это следствие того, что кто-то выбрал плохую архитекртуру для приложения, напрограммировал что называется "как смог", а теперь имеет любовь с этим делом.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 911
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 250
hardware I/O VIP

Next

Return to Для чайников

Who is online

Users browsing this forum: Yahoo, Yandex and 4 guests

cron