Заполнение кластера одного VI в другом VI

Простейшие вопросы в области инженерной разработки
alan
advanced
advanced
Сообщения: 157
Зарегистрирован: 30 авг 2012, 13:16
Версия LabVIEW: 16
Откуда: Москва
Контактная информация:

Заполнение кластера одного VI в другом VI

Сообщение alan »

Добрый день!
Вопрос лаконичен: как лучше заполнить кластер, состоящий из контролов, который находится на лицевой панели одного VI, в другом VI?
Поясню. У меня есть кластер, состоящий из множества контролов, и его нужно хитрым образом заполнять.
Естественно делать это в основном VI я не хочу, так как забью все блок-диаграмму. Нужно вынести в отдельную функцию (отдельный VI).
Но тут лично у меня возникает вопрос, как передавать этот кластер в другой VI, идет ли передача данных по значению, или по ссылке.
В си, я бы передал указатель или ссылку на мою структуру. А в лабвью?
Могу создать новый VI, где входным и выходным параметром будут мои кластеры. Передавать на вход в кластер буду через свойство кластера Property node -> Value, выводить так же.
Но правильно ли так делать? Ведь если в контроле содержится большой объем данных, то я по сути буду несколько раз копировать эти данные в памяти, что не эффективно.
Или нужно делать через ссылку на контролы, которые составляют этот кластер?
Аватара пользователя
IvanLis

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

Re: Заполнение кластера одного VI в другом VI

Сообщение IvanLis »

alan писал(а):как лучше заполнить кластер, состоящий из контролов, который находится на лицевой панели одного VI, в другом VI
Делаете ссылку (reference) на этот кластер, для удобства задайте его структуру как type definition.
Задаете reference как входной параметр SubVI.
Внутри SubVI обращаетесь к этому кластеру через ссылку, а к отдельным элементам используя type definition.


------------ LV2010 -----------
MainVI.vi
(7.56 КБ) 164 скачивания
SubVI.vi
(8.47 КБ) 184 скачивания
ControlTypeDef.ctl
(4.92 КБ) 154 скачивания
alan
advanced
advanced
Сообщения: 157
Зарегистрирован: 30 авг 2012, 13:16
Версия LabVIEW: 16
Откуда: Москва
Контактная информация:

Re: Заполнение кластера одного VI в другом VI

Сообщение alan »

IvanLis, у Вас в файле Cluster Refnum. Я уже все обыскал, как найти эту ссылку в панели инструментов?
Borjomy_1

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

Re: Заполнение кластера одного VI в другом VI

Сообщение Borjomy_1 »

На кластере ПКМ->Create->Reference. Константу можно превратить в контрол ПКМ->Change to Control
Аватара пользователя
IvanLis

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

Re: Заполнение кластера одного VI в другом VI

Сообщение IvanLis »

Borjomy_1 писал(а):Константу можно превратить в контрол ПКМ->Change to Control
В Linux немного по другому, но принцип аналогичен:
Без имени1.png
Без имени1.png (11.44 КБ) 5245 просмотров
А вообще можно сделать и так:

Z6i3Hd6gD90
alan
advanced
advanced
Сообщения: 157
Зарегистрирован: 30 авг 2012, 13:16
Версия LabVIEW: 16
Откуда: Москва
Контактная информация:

Re: Заполнение кластера одного VI в другом VI

Сообщение alan »

Спасибо, господа!

А такой вопрос сопутствующий. У меня на входе в VI много ссылок на разные кластеры. Так как я их всех заполняю в одном VI.
Мне не всегда нужно подключать на вход все ссылки, поэтому встает вопрос: как мне проверить внутри VI подключена ли ссылка, и вообще, правильная она или нет.
Если не подключена, я просто не буду использовать определенный блок программы.
Аватара пользователя
dadreamer

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

Re: Заполнение кластера одного VI в другом VI

Сообщение dadreamer »

alan,
Вложения
2015-10-20_17-22-48.jpg
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Заполнение кластера одного VI в другом VI

Сообщение rsv »

IvanLis писал(а): 14 окт 2015, 08:20
Внутри SubVI обращаетесь к этому кластеру через ссылку, а к отдельным элементам используя type definition.
Добрый день.
Как работать со значениями элементов кластера в SubVI понятно, но мне необходимо в SubVI изменить свойства элементов.
Как можно по ссылке на кластер добратья до свойств элементов кластера, TipStrip например?
Artem.spb

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

Re: Заполнение кластера одного VI в другом VI

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

rsv писал(а): 23 сен 2022, 10:10 Как можно по ссылке на кластер добратья до свойств элементов кластера, TipStrip например?
tipstrip.png
tipstrip.png (13.43 КБ) 1193 просмотра
ujin1
adviser
adviser
Сообщения: 231
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 18 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Заполнение кластера одного VI в другом VI

Сообщение ujin1 »

rsv писал(а): 23 сен 2022, 10:10
IvanLis писал(а): 14 окт 2015, 08:20
Внутри SubVI обращаетесь к этому кластеру через ссылку, а к отдельным элементам используя type definition.
Добрый день.
Как работать со значениями элементов кластера в SubVI понятно, но мне необходимо в SubVI изменить свойства элементов.
Как можно по ссылке на кластер добратья до свойств элементов кластера, TipStrip например?
ref1.png
ref1.png (7.17 КБ) 1189 просмотров
ref3.png
ref4.png
ref4.png (3.52 КБ) 1189 просмотров
ref6.png
Изображение
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Заполнение кластера одного VI в другом VI

Сообщение rsv »

Спасибо, Artem.spb и ujin1.
P.S.
А я всё искал возможность через ссылку на кластер создать ссылку на элемент и для него редактировать узел свойств...
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Заполнение кластера одного VI в другом VI

Сообщение rsv »

В предложенных вариантах обращение к элементам кластера производится по порядковому номеру. Если для всех элементов действия аналогичные, то это будет нормально работать даже в случае смены сортировки элементов внутри кластера.
А если для элементов кластера нужны какие-то особые действия, то после смены сортировки модуль перестанет работать корректно.
Как обратиться к элементу кластера из другого модуля по имени чтобы избежать проблем при смене сортировки?
Borjomy_1

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

Re: Заполнение кластера одного VI в другом VI

Сообщение Borjomy_1 »

Берете массив элементов кластера, и для каждого вычитываете свойство "Label". Далее производите поиск в массиве этих свойств нужного имени через "Search 1D Array". Результат будет индексом нужного элемента в массиве.
Вычитывать свойства можно один раз при запуске программы, используя функцию "First Call?" и храня результат в "FeedBack Node", если функция используется с одним типом кластера. Если их предусмотрено несколько, то придется имена элементов считывать каждый раз.
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Заполнение кластера одного VI в другом VI

Сообщение rsv »

Borjomy_1 писал(а): 13 мар 2023, 14:58 Берете массив элементов кластера, и для каждого вычитываете свойство "Label". Далее производите поиск в массиве этих свойств нужного имени через "Search 1D Array". Результат будет индексом нужного элемента в массиве.
Вычитывать свойства можно один раз при запуске программы, используя функцию "First Call?" и храня результат в "FeedBack Node", если функция используется с одним типом кластера. Если их предусмотрено несколько, то придется имена элементов считывать каждый раз.
Спасибо, алгоритм понятен.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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