Страница 24 из 26

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

Добавлено: 11 мар 2020, 07:33
rsv
Спасибо, Vitekkz88. Попробую.

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

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

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

Добавлено: 12 мар 2020, 08:26
Vitekkz88
rsv, это не тип void, это тип variant.
Если Вы хотите читать или писать состояние кнопки, то делайте её Switch.
Пример: поведение Latch when Released можно заменить на Switch when Released делая ход конём:

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

Добавлено: 12 мар 2020, 11:04
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 вместо использования приватных свойств.

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

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

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

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

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

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

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

Добавлено: 12 мар 2020, 15:09
rsv
>> Как-то вы не так создали кластер, раз он всё ещё хранит старое значение.
SubVI создана LabVIEW по команде из ПКМ.

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 17 мар 2020, 08:42
rsv
Реализовал Type Def в кластере, всё работает.
Осталось разобраться как проводить изменения в SubVI без Type Def.

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

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

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

Добавлено: 17 мар 2020, 09:07
Kosist
А почему subVI без тайпдеф? В этом же ввесь смысл, чтобы везде использовать один и тот же тайпдеф.
А перетягивать нужно кнопку не на константу, а на контрол например, в кластере.

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

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

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

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

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