Страница 1 из 2

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

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

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

Добавлено: 14 окт 2015, 08:00
Aleksey Feoktistov

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

Добавлено: 14 окт 2015, 08:20
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 КБ) 155 скачиваний

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

Добавлено: 14 окт 2015, 16:55
alan
IvanLis, у Вас в файле Cluster Refnum. Я уже все обыскал, как найти эту ссылку в панели инструментов?

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

Добавлено: 14 окт 2015, 17:05
Borjomy_1
На кластере ПКМ->Create->Reference. Константу можно превратить в контрол ПКМ->Change to Control

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

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

Z6i3Hd6gD90

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

Добавлено: 20 окт 2015, 15:14
alan
Спасибо, господа!

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

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

Добавлено: 20 окт 2015, 15:24
dadreamer
alan,

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

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

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

Добавлено: 23 сен 2022, 13:43
Artem.spb
rsv писал(а): 23 сен 2022, 10:10 Как можно по ссылке на кластер добратья до свойств элементов кластера, TipStrip например?
tipstrip.png
tipstrip.png (13.43 КБ) 1198 просмотров

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

Добавлено: 23 сен 2022, 14:13
ujin1
rsv писал(а): 23 сен 2022, 10:10
IvanLis писал(а): 14 окт 2015, 08:20
Внутри SubVI обращаетесь к этому кластеру через ссылку, а к отдельным элементам используя type definition.
Добрый день.
Как работать со значениями элементов кластера в SubVI понятно, но мне необходимо в SubVI изменить свойства элементов.
Как можно по ссылке на кластер добратья до свойств элементов кластера, TipStrip например?
ref1.png
ref1.png (7.17 КБ) 1194 просмотра
ref3.png
ref4.png
ref4.png (3.52 КБ) 1194 просмотра
ref6.png

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

Добавлено: 23 сен 2022, 14:41
rsv
Спасибо, Artem.spb и ujin1.
P.S.
А я всё искал возможность через ссылку на кластер создать ссылку на элемент и для него редактировать узел свойств...

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

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

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

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

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

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