Советы по программированию на LabVIEW

Простейшие вопросы в области инженерной разработки
rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Спасибо, Vitekkz88. Попробую.

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

С кластером разобрался, работает.
Только один момент не понятен.
Если кнопка типа Switch, то тип сохраняется везде - в ссылке, константе и узле свойств.
А если кнопка типа Latch, то константа получается не строгого типа (strict не указан), а узел свойств типа void.
Что непонятно:
1. В чём логика - почему константа для типа Latch нестрогого типа?
2. Как задать значение False для узла свойств в данном случае?
Вложения
Cluster.JPG

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

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

Re: Советы по программированию на LabVIEW

Сообщение Vitekkz88 »

rsv, это не тип void, это тип variant.
Если Вы хотите читать или писать состояние кнопки, то делайте её Switch.
Пример: поведение Latch when Released можно заменить на Switch when Released делая ход конём:
Вложения
Кнопка Boolean с механическим действием Switch when Released
Кнопка Boolean с механическим действием Switch when Released
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын

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

Activity Professionalism Автор
professor
professor
Сообщения: 3481
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2020
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение dadreamer »

Что непонятно:
1. В чём логика - почему константа для типа Latch нестрогого типа?
2. Как задать значение False для узла свойств в данном случае?


Как уже сказано, это Variant, а почему - ответ несколько туманный, но довольно близкий к истине.
It's so you know you're doing something bad.
https://forums.ni.com/t5/LabVIEW/Why-do ... anguage=en
Latch-кнопки с отскоком, т.е. сами отжимаются, когда где-либо на диаграмме выполнено чтение из контрола. Таким образом, если на диаграмме выполняется чтение в нескольких местах, то при первом чтении кнопка поменяет своё значение, в результате остальные участки кода получат значение False. Это одно из проявлений состояния гонки (race conditions). Поэтому разработчики обозначили Latch Action другим типом, кроме того для такой кнопки нельзя использовать локальные переменные, а узлы свойств (Value) выдают ошибку при чтении/записи. Это официальный постулат :labview: , однако есть неофициальный в виде свойства Latch Value, с помощью которого можно всё же читать и писать в контрол. Однако это бывает крайне редко нужно, например, обработка событий UI вынесена в отдельный SubVI и нет возможности поместить кнопку внутрь Event-структуры. В результате при возникновении события кнопка не отжимается. Её можно отжать с помощью Latch Value. Других случаев я не встречал на практике. Всегда проще поменять Mechanical Action вместо использования приватных свойств.

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

>> Пример: поведение Latch when Released можно заменить на Switch when Released делая ход конём:
Ход конём сделал, кнопка сразу отжимается.

Теперь другое непонятно. Я вынес инициализацию в SubVI, кластер передаю как параметр (собственно, получилось что я хотел). А после этого у кнопки BtnPlay поменял тип c Latch на Switch. В вызывающем модуле удалил ссылку и константу, а затем создал заново. Константа для кнопки BtnPlay теперь отражается как strict. А в SubVI это изменение не видно - узел свойств по прежнему отражается без strict. Удаление кластера и создание заново не помогло. Как распространить изменения типа кнопки на SubVI?
Вложения
Ini_VI.JPG

Artem.spb

Activity Автор
expert
expert
Сообщения: 1874
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: Советы по программированию на LabVIEW

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

rsv писал(а): А в SubVI это изменение не видно - узел свойств по прежнему отражается без strict. Удаление кластера и создание заново не помогло. Как распространить изменения типа кнопки на SubVI?
Как-то вы не так создали кластер, раз он всё ещё хранит старое значение.

И что это за странный ритуал у некоторых программистов? Если подать константу на вход Error программа стабильнее работает? :)
Снимок.PNG
Снимок.PNG (174.05 КБ) 2498 просмотров

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

>> Как-то вы не так создали кластер, раз он всё ещё хранит старое значение.
SubVI создана LabVIEW по команде из ПКМ.

>> И что это за странный ритуал у некоторых программистов? Если подать константу на вход Error программа стабильнее работает? :)
В какой-то книге прочитал рекомендацию так делать. Пока у меня своего мнения на этот счёт не сформировано, то пользуюсь рекомендациями.

Artem.spb

Activity Автор
expert
expert
Сообщения: 1874
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: Советы по программированию на LabVIEW

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

rsv писал(а): SubVI создана LabVIEW по команде из ПКМ.
Ну так если вы не поменяли кластер в сабе, то он и остался старым. В таких ситуациях рекомендуется использовать typedef. Тогда нужно будет поменять один файл контрола, чтобы распространить изменение на весь проект.
А собирать кластер примерно так
td.PNG
td.PNG (5.11 КБ) 2492 просмотра
В какой-то книге прочитал рекомендацию так делать. Пока у меня своего мнения на этот счёт не сформировано, то пользуюсь рекомендациями.
Пруфлинки в студию. Оч хочу знать, что за книга, и чем она это объясняет.

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

>> Ну так если вы не поменяли кластер в сабе, то он и остался старым.
Как его поменять в SubVI? Не нашёл способа создать кластер на основе входной ссылки. Также не смог у конкретного элемента входного кластера задать нужный тип.

>>Пруфлинки в студию. Оч хочу знать, что за книга, и чем она это объясняет.
В книге "Блюм П. LabVIEW - стиль программирования" в главе №7 приведены блок диаграммы с константами ошибок. Где-то ещё видел текстовую рекомендацию, но уже не помню где. Мотивировалось вроде чисто оформительскими причинами.

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

Activity Gold
expert
expert
Сообщения: 1067
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Репутация: 0
Версия LabVIEW: 2013-2017
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение Kosist »

ПКМ на контроле-кластере -> Make Type Def. -> отроется окно редактирования контрола -> сохраните его на диск. Затем, везде где используете этот кластер (как контрол/индикатор или константу) замените на этот новый тайпдеф (ПКМ -> Replace...). Затем, если нужно будет отредактировать его содержимое, откроете файл с ним, или же ПКМ на константе/контроле -> Open Type Def. -> редактируйте.
Если хотите быстро поменять тип ссылки на кнопку, то можно взять саму кнопку, и перетянуть на иконку ее ссылки в кластере например.
Ну а по поводу кластера ошибки - для узла свойств, тем более свойств базовых (Value) ошибку можно вообще не подключать. А если и хотите подключить вход ко всем ошибкам, то это можно сделать при помощи лишь одной константы. Так же и в случае булеан константы - одну константу подключите ко всем входам Value.
Мы делили апельсин - много наших полегло...

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

Activity Professionalism Автор
professor
professor
Сообщения: 3481
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2020
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение dadreamer »

Кроме прочего, можно улучшить читаемость кода, применив шаблон "Цикл с последовательностью / Sequence Loop": https://forums.ni.com/t5/Example-Code/q ... -p/3863728 Займёт гораздо меньше места на диаграмме. Также можно заигнорить возможные ошибки в Property / Invoke Nodes, нажав ПКМ на узле -> Ignore Errors inside Node (значок "?!" станет красным). На свойстве Value ошибка очень маловероятна, т.к. выполняется довольно простая операция, состоящая из двух переключений контекста и одной записи по адресу. Теоретически, конечно, ошибка может случиться, если например программе не хватит памяти. Но на практике мне подобное не встречалось ни разу. Однако на других свойствах ошибки могут случаться, так что провод error часто лучше подключать, иначе окошко с ошибкой выскочит в неподходящий момент.

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Реализовал Type Def в кластере, всё работает.
Осталось разобраться как проводить изменения в SubVI без Type Def.

Kosist, я попробовал сделать по Вашему совету, но ничего не получилось:
>> Если хотите быстро поменять тип ссылки на кнопку, то можно взять саму кнопку, и перетянуть на иконку ее ссылки в кластере например.

Что именно и куда надо перетянуть (в VI изменён тип кнопки BtnPlay, константа отображается как strict, а в SubVI она по прежнему нестрогая)?
Вложения
VI
VI
SubVI
SubVI

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

Activity Gold
expert
expert
Сообщения: 1067
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Репутация: 0
Версия LabVIEW: 2013-2017
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение Kosist »

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

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

>> А почему subVI без тайпдеф? В этом же ввесь смысл, чтобы везде использовать один и тот же тайпдеф.
Потому что я хотел понять, как обновить тип без TypeDef.

>> А перетягивать нужно кнопку не на константу, а на контрол например, в кластере.
Получилось. Перетянул кнопку с панели на соответствующий контрол в кластере SubVI и у него изменился тип. Спасибо.

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Добрый день.
У меня есть панель с 3-мя закладками (Tab Control). Все контролы на всех закладках относятся к одному устройству (считываются и записываются вместе). Поэтому, я решил поместить их в один кластер. Но, такое ощущение, что Tab Control и кластер не совместимы - контексная справка не видит элементы в кластере и компилятор выдаёт ошибку "This control has no elements so its type is undefined. Place the control you want inside it."
Как мне быть в данном случае - на каждую закладку создавать отдельный кластер или есть какой-то способ объединить контролы со всех закладок в один кластер?
Вложения
TabControl_In_Cluster.JPG

Ответить

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