Советы по программированию на LabVIEW
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
С кластером разобрался, работает.
Только один момент не понятен.
Если кнопка типа Switch, то тип сохраняется везде - в ссылке, константе и узле свойств.
А если кнопка типа Latch, то константа получается не строгого типа (strict не указан), а узел свойств типа void.
Что непонятно:
1. В чём логика - почему константа для типа Latch нестрогого типа?
2. Как задать значение False для узла свойств в данном случае?
Только один момент не понятен.
Если кнопка типа Switch, то тип сохраняется везде - в ссылке, константе и узле свойств.
А если кнопка типа Latch, то константа получается не строгого типа (strict не указан), а узел свойств типа void.
Что непонятно:
1. В чём логика - почему константа для типа Latch нестрогого типа?
2. Как задать значение False для узла свойств в данном случае?
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Советы по программированию на LabVIEW
rsv, это не тип void, это тип variant.
Если Вы хотите читать или писать состояние кнопки, то делайте её Switch.
Пример: поведение Latch when Released можно заменить на Switch when Released делая ход конём:
Если Вы хотите читать или писать состояние кнопки, то делайте её Switch.
Пример: поведение Latch when Released можно заменить на Switch when Released делая ход конём:
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
Что непонятно:
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) выдают ошибку при чтении/записи. Это официальный постулат , однако есть неофициальный в виде свойства Latch Value, с помощью которого можно всё же читать и писать в контрол. Однако это бывает крайне редко нужно, например, обработка событий UI вынесена в отдельный SubVI и нет возможности поместить кнопку внутрь Event-структуры. В результате при возникновении события кнопка не отжимается. Её можно отжать с помощью Latch Value. Других случаев я не встречал на практике. Всегда проще поменять Mechanical Action вместо использования приватных свойств.
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) выдают ошибку при чтении/записи. Это официальный постулат , однако есть неофициальный в виде свойства Latch Value, с помощью которого можно всё же читать и писать в контрол. Однако это бывает крайне редко нужно, например, обработка событий UI вынесена в отдельный SubVI и нет возможности поместить кнопку внутрь Event-структуры. В результате при возникновении события кнопка не отжимается. Её можно отжать с помощью Latch Value. Других случаев я не встречал на практике. Всегда проще поменять Mechanical Action вместо использования приватных свойств.
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
>> Пример: поведение Latch when Released можно заменить на Switch when Released делая ход конём:
Ход конём сделал, кнопка сразу отжимается.
Теперь другое непонятно. Я вынес инициализацию в SubVI, кластер передаю как параметр (собственно, получилось что я хотел). А после этого у кнопки BtnPlay поменял тип c Latch на Switch. В вызывающем модуле удалил ссылку и константу, а затем создал заново. Константа для кнопки BtnPlay теперь отражается как strict. А в SubVI это изменение не видно - узел свойств по прежнему отражается без strict. Удаление кластера и создание заново не помогло. Как распространить изменения типа кнопки на SubVI?
Ход конём сделал, кнопка сразу отжимается.
Теперь другое непонятно. Я вынес инициализацию в SubVI, кластер передаю как параметр (собственно, получилось что я хотел). А после этого у кнопки BtnPlay поменял тип c Latch на Switch. В вызывающем модуле удалил ссылку и константу, а затем создал заново. Константа для кнопки BtnPlay теперь отражается как strict. А в SubVI это изменение не видно - узел свойств по прежнему отражается без strict. Удаление кластера и создание заново не помогло. Как распространить изменения типа кнопки на SubVI?
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 175 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
Как-то вы не так создали кластер, раз он всё ещё хранит старое значение.rsv писал(а): А в SubVI это изменение не видно - узел свойств по прежнему отражается без strict. Удаление кластера и создание заново не помогло. Как распространить изменения типа кнопки на SubVI?
И что это за странный ритуал у некоторых программистов? Если подать константу на вход Error программа стабильнее работает? :)
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
>> Как-то вы не так создали кластер, раз он всё ещё хранит старое значение.
SubVI создана LabVIEW по команде из ПКМ.
>> И что это за странный ритуал у некоторых программистов? Если подать константу на вход Error программа стабильнее работает? :)
В какой-то книге прочитал рекомендацию так делать. Пока у меня своего мнения на этот счёт не сформировано, то пользуюсь рекомендациями.
SubVI создана LabVIEW по команде из ПКМ.
>> И что это за странный ритуал у некоторых программистов? Если подать константу на вход Error программа стабильнее работает? :)
В какой-то книге прочитал рекомендацию так делать. Пока у меня своего мнения на этот счёт не сформировано, то пользуюсь рекомендациями.
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 175 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
Ну так если вы не поменяли кластер в сабе, то он и остался старым. В таких ситуациях рекомендуется использовать typedef. Тогда нужно будет поменять один файл контрола, чтобы распространить изменение на весь проект.rsv писал(а): SubVI создана LabVIEW по команде из ПКМ.
А собирать кластер примерно так
Пруфлинки в студию. Оч хочу знать, что за книга, и чем она это объясняет.В какой-то книге прочитал рекомендацию так делать. Пока у меня своего мнения на этот счёт не сформировано, то пользуюсь рекомендациями.
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
>> Ну так если вы не поменяли кластер в сабе, то он и остался старым.
Как его поменять в SubVI? Не нашёл способа создать кластер на основе входной ссылки. Также не смог у конкретного элемента входного кластера задать нужный тип.
>>Пруфлинки в студию. Оч хочу знать, что за книга, и чем она это объясняет.
В книге "Блюм П. LabVIEW - стиль программирования" в главе №7 приведены блок диаграммы с константами ошибок. Где-то ещё видел текстовую рекомендацию, но уже не помню где. Мотивировалось вроде чисто оформительскими причинами.
Как его поменять в SubVI? Не нашёл способа создать кластер на основе входной ссылки. Также не смог у конкретного элемента входного кластера задать нужный тип.
>>Пруфлинки в студию. Оч хочу знать, что за книга, и чем она это объясняет.
В книге "Блюм П. LabVIEW - стиль программирования" в главе №7 приведены блок диаграммы с константами ошибок. Где-то ещё видел текстовую рекомендацию, но уже не помню где. Мотивировалось вроде чисто оформительскими причинами.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
ПКМ на контроле-кластере -> Make Type Def. -> отроется окно редактирования контрола -> сохраните его на диск. Затем, везде где используете этот кластер (как контрол/индикатор или константу) замените на этот новый тайпдеф (ПКМ -> Replace...). Затем, если нужно будет отредактировать его содержимое, откроете файл с ним, или же ПКМ на константе/контроле -> Open Type Def. -> редактируйте.
Если хотите быстро поменять тип ссылки на кнопку, то можно взять саму кнопку, и перетянуть на иконку ее ссылки в кластере например.
Ну а по поводу кластера ошибки - для узла свойств, тем более свойств базовых (Value) ошибку можно вообще не подключать. А если и хотите подключить вход ко всем ошибкам, то это можно сделать при помощи лишь одной константы. Так же и в случае булеан константы - одну константу подключите ко всем входам Value.
Если хотите быстро поменять тип ссылки на кнопку, то можно взять саму кнопку, и перетянуть на иконку ее ссылки в кластере например.
Ну а по поводу кластера ошибки - для узла свойств, тем более свойств базовых (Value) ошибку можно вообще не подключать. А если и хотите подключить вход ко всем ошибкам, то это можно сделать при помощи лишь одной константы. Так же и в случае булеан константы - одну константу подключите ко всем входам Value.
Мы делили апельсин - много наших полегло...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
Кроме прочего, можно улучшить читаемость кода, применив шаблон "Цикл с последовательностью / Sequence Loop": https://forums.ni.com/t5/Example-Code/q ... -p/3863728 Займёт гораздо меньше места на диаграмме. Также можно заигнорить возможные ошибки в Property / Invoke Nodes, нажав ПКМ на узле -> Ignore Errors inside Node (значок "?!" станет красным). На свойстве Value ошибка очень маловероятна, т.к. выполняется довольно простая операция, состоящая из двух переключений контекста и одной записи по адресу. Теоретически, конечно, ошибка может случиться, если например программе не хватит памяти. Но на практике мне подобное не встречалось ни разу. Однако на других свойствах ошибки могут случаться, так что провод error часто лучше подключать, иначе окошко с ошибкой выскочит в неподходящий момент.
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
Реализовал Type Def в кластере, всё работает.
Осталось разобраться как проводить изменения в SubVI без Type Def.
Kosist, я попробовал сделать по Вашему совету, но ничего не получилось:
>> Если хотите быстро поменять тип ссылки на кнопку, то можно взять саму кнопку, и перетянуть на иконку ее ссылки в кластере например.
Что именно и куда надо перетянуть (в VI изменён тип кнопки BtnPlay, константа отображается как strict, а в SubVI она по прежнему нестрогая)?
Осталось разобраться как проводить изменения в SubVI без Type Def.
Kosist, я попробовал сделать по Вашему совету, но ничего не получилось:
>> Если хотите быстро поменять тип ссылки на кнопку, то можно взять саму кнопку, и перетянуть на иконку ее ссылки в кластере например.
Что именно и куда надо перетянуть (в VI изменён тип кнопки BtnPlay, константа отображается как strict, а в SubVI она по прежнему нестрогая)?
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Советы по программированию на LabVIEW
А почему subVI без тайпдеф? В этом же ввесь смысл, чтобы везде использовать один и тот же тайпдеф.
А перетягивать нужно кнопку не на константу, а на контрол например, в кластере.
А перетягивать нужно кнопку не на константу, а на контрол например, в кластере.
Мы делили апельсин - много наших полегло...
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
>> А почему subVI без тайпдеф? В этом же ввесь смысл, чтобы везде использовать один и тот же тайпдеф.
Потому что я хотел понять, как обновить тип без TypeDef.
>> А перетягивать нужно кнопку не на константу, а на контрол например, в кластере.
Получилось. Перетянул кнопку с панели на соответствующий контрол в кластере SubVI и у него изменился тип. Спасибо.
Потому что я хотел понять, как обновить тип без TypeDef.
>> А перетягивать нужно кнопку не на константу, а на контрол например, в кластере.
Получилось. Перетянул кнопку с панели на соответствующий контрол в кластере SubVI и у него изменился тип. Спасибо.
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Советы по программированию на LabVIEW
Добрый день.
У меня есть панель с 3-мя закладками (Tab Control). Все контролы на всех закладках относятся к одному устройству (считываются и записываются вместе). Поэтому, я решил поместить их в один кластер. Но, такое ощущение, что Tab Control и кластер не совместимы - контексная справка не видит элементы в кластере и компилятор выдаёт ошибку "This control has no elements so its type is undefined. Place the control you want inside it."
Как мне быть в данном случае - на каждую закладку создавать отдельный кластер или есть какой-то способ объединить контролы со всех закладок в один кластер?
У меня есть панель с 3-мя закладками (Tab Control). Все контролы на всех закладках относятся к одному устройству (считываются и записываются вместе). Поэтому, я решил поместить их в один кластер. Но, такое ощущение, что Tab Control и кластер не совместимы - контексная справка не видит элементы в кластере и компилятор выдаёт ошибку "This control has no elements so its type is undefined. Place the control you want inside it."
Как мне быть в данном случае - на каждую закладку создавать отдельный кластер или есть какой-то способ объединить контролы со всех закладок в один кластер?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 0 Ответы
- 1894 Просмотры
-
Последнее сообщение Anastasia
-
- 3 Ответы
- 2065 Просмотры
-
Последнее сообщение PozhiloyGoblin
-
- 0 Ответы
- 343 Просмотры
-
Последнее сообщение maxim_MA
-
- 23 Ответы
- 2395 Просмотры
-
Последнее сообщение dadreamer
-
- 2 Ответы
- 390 Просмотры
-
Последнее сообщение ujin1