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

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

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

Postby rsv on 11 Mar 2020, 07:33

Спасибо, Vitekkz88. Попробую.
rsv
user
user
 
Posts: 77
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby rsv on 12 Mar 2020, 08:00

С кластером разобрался, работает.
Только один момент не понятен.
Если кнопка типа Switch, то тип сохраняется везде - в ссылке, константе и узле свойств.
А если кнопка типа Latch, то константа получается не строгого типа (strict не указан), а узел свойств типа void.
Что непонятно:
1. В чём логика - почему константа для типа Latch нестрогого типа?
2. Как задать значение False для узла свойств в данном случае?
Attachments
Cluster.JPG
rsv
user
user
 
Posts: 77
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby Vitekkz88 on 12 Mar 2020, 08:26

rsv, это не тип void, это тип variant.
Если Вы хотите читать или писать состояние кнопки, то делайте её Switch.
Пример: поведение Latch when Released можно заменить на Switch when Released делая ход конём:
Attachments
Button.png
Кнопка Boolean с механическим действием Switch when Released
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
expert
expert
 
Posts: 1097
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 307
hardware I/O VIP

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

Postby dadreamer on 12 Mar 2020, 11:04

Что непонятно:
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 вместо использования приватных свойств.
User avatar
dadreamer
professor
professor
 
Posts: 3438
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 859
I/O VIP vision internet

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

Postby rsv on 12 Mar 2020, 12:37

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

Теперь другое непонятно. Я вынес инициализацию в SubVI, кластер передаю как параметр (собственно, получилось что я хотел). А после этого у кнопки BtnPlay поменял тип c Latch на Switch. В вызывающем модуле удалил ссылку и константу, а затем создал заново. Константа для кнопки BtnPlay теперь отражается как strict. А в SubVI это изменение не видно - узел свойств по прежнему отражается без strict. Удаление кластера и создание заново не помогло. Как распространить изменения типа кнопки на SubVI?
Attachments
Ini_VI.JPG
rsv
user
user
 
Posts: 77
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby Artem.spb on 12 Mar 2020, 15:04

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

И что это за странный ритуал у некоторых программистов? Если подать константу на вход Error программа стабильнее работает? :)
Снимок.PNG
Снимок.PNG (174.05 KiB) Viewed 872 times
Artem.spb
expert
expert
 
Posts: 1755
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 270
CLD hardware I/O VIP freelance

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

Postby rsv on 12 Mar 2020, 15:09

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

>> И что это за странный ритуал у некоторых программистов? Если подать константу на вход Error программа стабильнее работает? :)
В какой-то книге прочитал рекомендацию так делать. Пока у меня своего мнения на этот счёт не сформировано, то пользуюсь рекомендациями.
rsv
user
user
 
Posts: 77
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby Artem.spb on 12 Mar 2020, 15:26

[quote=="rsv"] SubVI создана LabVIEW по команде из ПКМ.[/quote]
Ну так если вы не поменяли кластер в сабе, то он и остался старым. В таких ситуациях рекомендуется использовать typedef. Тогда нужно будет поменять один файл контрола, чтобы распространить изменение на весь проект.
А собирать кластер примерно так
td.PNG
td.PNG (5.11 KiB) Viewed 866 times


В какой-то книге прочитал рекомендацию так делать. Пока у меня своего мнения на этот счёт не сформировано, то пользуюсь рекомендациями.
Пруфлинки в студию. Оч хочу знать, что за книга, и чем она это объясняет.
Artem.spb
expert
expert
 
Posts: 1755
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 270
CLD hardware I/O VIP freelance

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

Postby rsv on 16 Mar 2020, 13:29

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

>>Пруфлинки в студию. Оч хочу знать, что за книга, и чем она это объясняет.
В книге "Блюм П. LabVIEW - стиль программирования" в главе №7 приведены блок диаграммы с константами ошибок. Где-то ещё видел текстовую рекомендацию, но уже не помню где. Мотивировалось вроде чисто оформительскими причинами.
rsv
user
user
 
Posts: 77
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby Kosist on 16 Mar 2020, 18:36

ПКМ на контроле-кластере -> Make Type Def. -> отроется окно редактирования контрола -> сохраните его на диск. Затем, везде где используете этот кластер (как контрол/индикатор или константу) замените на этот новый тайпдеф (ПКМ -> Replace...). Затем, если нужно будет отредактировать его содержимое, откроете файл с ним, или же ПКМ на константе/контроле -> Open Type Def. -> редактируйте.
Если хотите быстро поменять тип ссылки на кнопку, то можно взять саму кнопку, и перетянуть на иконку ее ссылки в кластере например.
Ну а по поводу кластера ошибки - для узла свойств, тем более свойств базовых (Value) ошибку можно вообще не подключать. А если и хотите подключить вход ко всем ошибкам, то это можно сделать при помощи лишь одной константы. Так же и в случае булеан константы - одну константу подключите ко всем входам Value.
Мы делили апельсин - много наших полегло...
User avatar
Kosist
expert
expert
 
Posts: 1031
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 283
CLAD I/O VIP students

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

Postby dadreamer on 16 Mar 2020, 19:47

Кроме прочего, можно улучшить читаемость кода, применив шаблон "Цикл с последовательностью / Sequence Loop": https://forums.ni.com/t5/Example-Code/q ... -p/3863728 Займёт гораздо меньше места на диаграмме. Также можно заигнорить возможные ошибки в Property / Invoke Nodes, нажав ПКМ на узле -> Ignore Errors inside Node (значок "?!" станет красным). На свойстве Value ошибка очень маловероятна, т.к. выполняется довольно простая операция, состоящая из двух переключений контекста и одной записи по адресу. Теоретически, конечно, ошибка может случиться, если например программе не хватит памяти. Но на практике мне подобное не встречалось ни разу. Однако на других свойствах ошибки могут случаться, так что провод error часто лучше подключать, иначе окошко с ошибкой выскочит в неподходящий момент.
User avatar
dadreamer
professor
professor
 
Posts: 3438
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 859
I/O VIP vision internet

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

Postby rsv on 17 Mar 2020, 08:42

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

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

Что именно и куда надо перетянуть (в VI изменён тип кнопки BtnPlay, константа отображается как strict, а в SubVI она по прежнему нестрогая)?
Attachments
Cluster_3.jpg
VI
Cluster_2.jpg
SubVI
rsv
user
user
 
Posts: 77
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby Kosist on 17 Mar 2020, 09:07

А почему subVI без тайпдеф? В этом же ввесь смысл, чтобы везде использовать один и тот же тайпдеф.
А перетягивать нужно кнопку не на константу, а на контрол например, в кластере.
Мы делили апельсин - много наших полегло...
User avatar
Kosist
expert
expert
 
Posts: 1031
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 283
CLAD I/O VIP students

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

Postby rsv on 18 Mar 2020, 08:42

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

>> А перетягивать нужно кнопку не на константу, а на контрол например, в кластере.
Получилось. Перетянул кнопку с панели на соответствующий контрол в кластере SubVI и у него изменился тип. Спасибо.
rsv
user
user
 
Posts: 77
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

Previous

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

Who is online

Users browsing this forum: Yandex and 3 guests

cron