Вопрос по TabControl

Простейшие вопросы в области инженерной разработки
Ответить
miklo
beginner
beginner
Сообщения: 17
Зарегистрирован: 02 июл 2020, 10:39
Версия LabVIEW: 17
Контактная информация:

Вопрос по TabControl

Сообщение miklo »

Всем привет!
Пишу программу, в которой будет несколько вкладок на лицевой панели. Мне нужно, чтобы при переключении между вкладками начинал выполняться код в них. В том числе, чтобы выводилась строка, содержащая подсказки для пользователя ("Помощь"). Проблема в том, при переключении на вторую вкладку ничего не происходит. Для наглядности у меня там (во второй вкладке) есть индикатор, ну и сама строка. Ни то ни другое не начинает работать при переключении TabControla, т.е. не выводится строка "установите переключатель "режим работы" в любое положение" и индикатор не загорается. Более того, пробовал ставить во второй вкладке кнопку, нажатие на которую зажигает индикатор. Тоже не работает.
Что я делаю не так?
Вложения
1.png
2.png
2.png (10.02 КБ) 2770 просмотров
Аватара пользователя
kiparym
advanced
advanced
Сообщения: 178
Зарегистрирован: 06 сен 2011, 08:52
Версия LabVIEW: 8.2 & 2011
Откуда: г. Саров
Поблагодарили: 1 раз
Контактная информация:

Re: Вопрос по TabControl

Сообщение kiparym »

«Even Structure» является элементом обработки событий, поэтому всегда должен располагаться на активной странице. Опасно располагать «Even Structure» внутри «Case Structure».
Если «Case Structure» не активна, то и события не будут отрабатываться. А если переключение страницы произойдёт в момент обработки события, то произойдёт зависание программы.
Аватара пользователя
Favorit
interested
interested
Сообщения: 4
Зарегистрирован: 09 дек 2016, 19:22
Версия LabVIEW: 8-15
Контактная информация:

Re: Вопрос по TabControl

Сообщение Favorit »

miklo писал(а): 03 авг 2020, 08:29 Всем привет!
Пишу программу, в которой будет несколько вкладок на лицевой панели. Мне нужно, чтобы при переключении между вкладками начинал выполняться код в них. В том числе, чтобы выводилась строка, содержащая подсказки для пользователя ("Помощь"). Проблема в том, при переключении на вторую вкладку ничего не происходит. Для наглядности у меня там (во второй вкладке) есть индикатор, ну и сама строка. Ни то ни другое не начинает работать при переключении TabControla, т.е. не выводится строка "установите переключатель "режим работы" в любое положение" и индикатор не загорается. Более того, пробовал ставить во второй вкладке кнопку, нажатие на которую зажигает индикатор. Тоже не работает.
Что я делаю не так?
Безымянный.png
miklo
beginner
beginner
Сообщения: 17
Зарегистрирован: 02 июл 2020, 10:39
Версия LabVIEW: 17
Контактная информация:

Re: Вопрос по TabControl

Сообщение miklo »

kiparym писал(а): 03 авг 2020, 12:19 «Even Structure» является элементом обработки событий, поэтому всегда должен располагаться на активной странице. Опасно располагать «Even Structure» внутри «Case Structure».
Если «Case Structure» не активна, то и события не будут отрабатываться. А если переключение страницы произойдёт в момент обработки события, то произойдёт зависание программы.
Да, действительно, если исключить эвент-структуру, то таб контрол управляет кейсами как положено. Но мне нужно использовать эвенты в моей программе... Нужно ведь как-то отслеживать действия пользователя, нажатия на кнопки. Как же мне "подружить" таб контрол, управляющий кейсами, с эвент-структурами, входящими в кейсы?

Favorit,
Не понимаю, как работает ваша идея :(
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Вопрос по TabControl

Сообщение Borjomy_1 »

Эвенты обрабатываются в отдельном цикле.
Аватара пользователя
kiparym
advanced
advanced
Сообщения: 178
Зарегистрирован: 06 сен 2011, 08:52
Версия LabVIEW: 8.2 & 2011
Откуда: г. Саров
Поблагодарили: 1 раз
Контактная информация:

Re: Вопрос по TabControl

Сообщение kiparym »

Для каждой страницы формируйте таблицу истинности (http://www.labviewportal.org/viewtopic. ... 485#p83485) для «Control» расположенных на данной странице. Применяя «Enqueue Element» создаём очередь команд, которая исполняётся на параллельном цикле, при этом не забываем про сигнализацию при затяжных по времени команд.
Tabl_1.png
Если не требуется контролировать комбинации нескольких «Control_N», то программу можно упростить:
Tabl_2a.png
p.s. Имя очереди произвольное. Stop отрабатывается как отдельная команда.
Последний раз редактировалось kiparym 07 авг 2020, 12:24, всего редактировалось 7 раз.
miklo
beginner
beginner
Сообщения: 17
Зарегистрирован: 02 июл 2020, 10:39
Версия LabVIEW: 17
Контактная информация:

Re: Вопрос по TabControl

Сообщение miklo »

kiparym
Спасибо, буду пробовать.
Есть вопрос: что писать в строку Comand в блоке Obtain queue? В помощи сказано, что эта строка задает имя очереди. Оно может быть произвольным? Ведь у меня же в итоге должна получиться одна единственная очередь на всю программу?
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Вопрос по TabControl

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

miklo писал(а): 07 авг 2020, 09:39 что писать в строку Comand в блоке Obtain queue?
где ж вы нашли такой терминал?
В помощи сказано, что эта строка задает имя очереди. Оно может быть произвольным?
может быть любым включая пустое.
Ведь у меня же в итоге должна получиться одна единственная очередь на всю программу?
тут два варианта: или один раз создать и везде протянуть провода.
или создавать в разных местах с одним и тем же именем.
Аватара пользователя
kiparym
advanced
advanced
Сообщения: 178
Зарегистрирован: 06 сен 2011, 08:52
Версия LabVIEW: 8.2 & 2011
Откуда: г. Саров
Поблагодарили: 1 раз
Контактная информация:

Re: Вопрос по TabControl

Сообщение kiparym »

В программах на параллельных циклах есть существенный недостаток:
при возникновении ошибки в одном цикле – нарушается нормальная работа всей программы и исправные циклы зависают.
Для решения этой проблемы, я предлагаю установить в конце каждого цикла принудительный выход.
Stop.png
Stop.png (1.74 КБ) 2455 просмотров
Второе предложение - отказаться от Shift по ошибкам, тогда каждый новый цикл начнётся с «чистого» листа, это поможет только при случайных ошибках. Необходим обработчик ошибок. Возможно, существуют более «красивые» решения?
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Вопрос по TabControl

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

kiparym писал(а): 08 авг 2020, 08:49 Для решения этой проблемы, я предлагаю установить в конце каждого цикла принудительный выход.
Stop.png
Для решения этой проблемы вы предлагаете создать другую проблему :)
Это очень и очень плохой вариант вообще, а особенно при работе с оборудованием. Если вы рубите программу от незначительной ошибки, то все выходы останутся как есть.
Этот вариант применяется в т.н. наступательном программировании, когда вы останавливаете проограмму при любой ошибке, но ТОЛЬКО при написании/отладке. В конечном релизе это должно отключаться автоматом. Такое "издевательство" над самим собой делается только с одной целью - чтобы было большое желание исправить ошибку, а не пропустить сообщение и тут же забыть о нём.
Необходим обработчик ошибок.
именно так. Эго вид и действия зависят в том числе и от релиза. Если это дебаг, то он должен материться как можно громче. Если это релиз, то максимум лог ошибок, ну и по возможности обходить/исправлять такие ситуации на ходу автоматом.
Аватара пользователя
kiparym
advanced
advanced
Сообщения: 178
Зарегистрирован: 06 сен 2011, 08:52
Версия LabVIEW: 8.2 & 2011
Откуда: г. Саров
Поблагодарили: 1 раз
Контактная информация:

Re: Вопрос по TabControl

Сообщение kiparym »

Схема построения программы с обработкой ошибок. Модуль «Stop_k.vi» обеспечивает принудительное завершение циклов.
Схема.png
Схема.png (11.06 КБ) 2397 просмотров
miklo
beginner
beginner
Сообщения: 17
Зарегистрирован: 02 июл 2020, 10:39
Версия LabVIEW: 17
Контактная информация:

Re: Вопрос по TabControl

Сообщение miklo »

Artem.spb писал(а): 07 авг 2020, 23:04 где ж вы нашли такой терминал?
Ну, в ЛабВью этот терминал называется "name", просто у Kiparym на скрине туда подходит строчная константа "comand".
может быть любым включая пустое.
Понятно, спасибо
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Вопрос по TabControl

Сообщение Borjomy_1 »

kiparym писал(а): 08 авг 2020, 16:37 Схема построения программы с обработкой ошибок. Модуль «Stop_k.vi» обеспечивает принудительное завершение циклов.
Схема.png
Нельзя таким образом глобальную переменную "стоп" инициализировать. Нет НИКАКОЙ гарантии, что она будет проинициализирована ПЕРЕД выполнением функций в циклах. Очередность сброса переменной и выполнение циклов должна быть обозначена ЯВНО.
Аватара пользователя
kiparym
advanced
advanced
Сообщения: 178
Зарегистрирован: 06 сен 2011, 08:52
Версия LabVIEW: 8.2 & 2011
Откуда: г. Саров
Поблагодарили: 1 раз
Контактная информация:

Re: Вопрос по TabControl

Сообщение kiparym »

Нельзя таким образом глобальную переменную "стоп" инициализировать.
Правильно!
Сброс глобальной «Стоп» должен (логично) располагаться в обработчике ошибок. Расположив сброс во внешнем цикле – я указал на необходимость проведение сброса. Предложенный вариант (не явно выражен) работоспособен! Транслятор LabView не начнёт обработку внутренних циклов, пока не закончит обработку локальных значений внешнего цикла.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Вопрос по TabControl

Сообщение Borjomy_1 »

Транслятор LabView не начнёт обработку внутренних циклов, пока не закончит обработку локальных значений внешнего цикла.
Это неправда. Я ЛИЧНО натыкался, на заре своего опыта, на то, что цикл может начать выполняться раньше, чем не связанные с ним вычисления. В том числе в подобной ситуации. Притом, что последовательность выполнения может меняться, в зависимости от того, в режиме отладки или скомпилированного приложения выполняется код. И первое правило программирования на LabView - это установление явных зависимостей последовательности выполнения кода.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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