Вопрос по event structure

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

Вопрос по event structure

Сообщение miklo »

Всем привет.
Есть алгоритм, который включает в себя опрос кнопок, в том числе опрос тумблеров. Работа алгоритма начинается со взведения какого-нибудь тумблера (переход в true). В середине алгоритма этот тумблер опускается (переходит в false). Реализован алгоритм в виде нескольких машин состояний. Все машины однотипны. Эти машины состояний я включил в event-структуру. Таким образом имеются несколько эвентов, в каждом из которых машина состояний. И все это в общий цикл while. Задал в качестве условия запуска того или иного эвента параметр value change тумблера. Проблема в том, что тумблер в процессе работы того или иного эвента опускается вниз (происходит value change), что влечет за собой повторный запуск того же эвента по окончании выполнения предыдущего. И так снова и снова. Нельзя ли в эвент структуре сделать параметр запуска не просто value change, а value change from false to true, например? Чтобы эвент запускался только тогда, когда тумблер взводится. Или же, может быть, посоветуете что-то еще?
Аватара пользователя
kiparym
advanced
advanced
Сообщения: 178
Зарегистрирован: 06 сен 2011, 08:52
Версия LabVIEW: 8.2 & 2011
Откуда: г. Саров
Поблагодарили: 1 раз
Контактная информация:

Re: Вопрос по event structure

Сообщение kiparym »

Для анализа состояния можно использовать значение «New Val (Old Val)».
Пример контроля включения одного из возможных переключателей.
Bool.png
Bool.png (5.53 КБ) 2365 просмотров
Последний раз редактировалось kiparym 24 июл 2020, 20:37, всего редактировалось 1 раз.
Artem.spb

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

Re: Вопрос по event structure

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

miklo писал(а): 22 июл 2020, 15:59 Эти машины состояний я включил в event-структуру.
это уже не есть хорошо. А что если машина будет долго работать?
Проблема в том, что тумблер в процессе работы того или иного эвента опускается вниз (происходит value change), что влечет за собой повторный запуск того же эвента по окончании выполнения предыдущего.
А как (или зачем) вы программно генерируете событие изменения значения?
Во-первых, если это просто "кнопки", то им можно назначить режим "с отскоком", тогда им выключать не придётся.
Во-вторых, если значение менять программно, то события не случается. Для генерации события существует спец свойство Val change Signaling. только оно генерирует событие, которое ловится в event-str
miklo
beginner
beginner
Сообщения: 17
Зарегистрирован: 02 июл 2020, 10:39
Версия LabVIEW: 17
Контактная информация:

Re: Вопрос по event structure

Сообщение miklo »

Artem.spb писал(а): 23 июл 2020, 01:18 А что если машина будет долго работать?
Машина действительно может долго работать в моем случае. Как эвент-структура может этому помешать? Я так думал, что запускается эвент и в нем соответствующая машина. И работает себе этот эвент, пока не будет подана команда остановки цикла машины состояний...
Artem.spb писал(а): 23 июл 2020, 01:18 А как (или зачем) вы программно генерируете событие изменения значения?
В этом суть работы моей программы: пользователь взводит тумблер, выполняет некоторые действия, получает тот или иной сигнал и дает соответствующий отклик. Потом то же самое, но уже проверяется реакция на опускание тумблера (в той же state machine). То есть алгоритм предполагает, что тумблер в течение полного набора циклов машины состояний будет поднят, а потом опущен. Поэтому value change происходит два раза и два раза прилетает в виде команды для эвент-структуры. И таких тумблерорв несколько, соответственно несколько стейт-машин.
Аватара пользователя
kiparym
advanced
advanced
Сообщения: 178
Зарегистрирован: 06 сен 2011, 08:52
Версия LabVIEW: 8.2 & 2011
Откуда: г. Саров
Поблагодарили: 1 раз
Контактная информация:

Re: Вопрос по event structure

Сообщение kiparym »

Для отработки состояний дискретных элементов, необходимо применять «Булевскую алгебру».
Если не знаете, как оптимизировать дискретные уравнения, то можно дискретный автомат построить в общем виде:
1. «Even Structure» предназначен для фиксации изменения состояния дискретных элементов. При отсутствии изменений, «Timeout» пропускает блок обработки;
2. из дискретных элементов формируется таблица истинности. Общее количество строк таблиц K=2^N. Где N- количества дискретных элементов;
3. вручную заполняется «Case Structure» (таблица истинности) - реакция автомата на ситуацию.
Автомат.png
При необходимости, учитывать предыдущее состояние дискретных элементов, в таблицу вводятся новые элементы «Boolean Old _№».
Последний раз редактировалось kiparym 24 июл 2020, 17:37, всего редактировалось 1 раз.
miklo
beginner
beginner
Сообщения: 17
Зарегистрирован: 02 июл 2020, 10:39
Версия LabVIEW: 17
Контактная информация:

Re: Вопрос по event structure

Сообщение miklo »

kiparym,
Спасибо за идею с кейсом! Засунул в каждую эвент-структуру по кейсу. Кейс пуст, если тумблер фолс, а если тумблер - тру, то в кейсе соответствующая машина состояний. А в самой машине состояний использую локальную переменную тумблера. Работает.
Artem.spb

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

Re: Вопрос по event structure

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

miklo писал(а): 24 июл 2020, 07:53 Машина действительно может долго работать в моем случае. Как эвент-структура может этому помешать? Я так думал, что запускается эвент и в нем соответствующая машина. И работает себе этот эвент, пока не будет подана команда остановки цикла машины состояний...
тут может возникнуть путаница. Есть машина состояний - вообще машина в целом. И есть конкретное состояние, в котором она находится.
Я говорю про время работы состояния. Если оно целиком обрабатывается в одном кейсе, то пока работа не закончена, интерфейс заморожен, и пользователь будет думать, что программа зависла.
То есть алгоритм предполагает, что тумблер в течение полного набора циклов машины состояний будет поднят, а потом опущен.
так в чём проблема? я думал оно как-то "само" случается, а если вы так и задумали, то что же вас не устраивает. Отследить, куда переключили кнопку можно, как сказал kiparym, использовать кейсы.
И таких тумблерорв несколько, соответственно несколько стейт-машин.
машина должна быть одна, а в ней - сколько угодно состояний.
miklo
beginner
beginner
Сообщения: 17
Зарегистрирован: 02 июл 2020, 10:39
Версия LabVIEW: 17
Контактная информация:

Re: Вопрос по event structure

Сообщение miklo »

Artem.spb писал(а): 24 июл 2020, 15:08 пока работа не закончена, интерфейс заморожен, и пользователь будет думать, что программа зависла.
Я убрал галочку в чекбоксе "block panel" в параметрах всех эвентов.
Artem.spb писал(а): 24 июл 2020, 15:08 машина должна быть одна, а в ней - сколько угодно состояний.
Тоже хотел так сделать изначально, но запутался с тем, как это можно реализовать в моем случае. Не стал долго думать над этим и сделал несколько машин. Сначала просто разместил их параллельно, а теперь в эвентах. А какие преимущества дает использование только одной машины для всех этих нескольких однотипных алгоритмов?
Аватара пользователя
kiparym
advanced
advanced
Сообщения: 178
Зарегистрирован: 06 сен 2011, 08:52
Версия LabVIEW: 8.2 & 2011
Откуда: г. Саров
Поблагодарили: 1 раз
Контактная информация:

Re: Вопрос по event structure

Сообщение kiparym »

Использование таблицы истинности гарантирует, что обрабатываются все возможные варианты событий. Разбивка на несколько эвент- структур, без знаний Булевой алгебры, допускает появление ситуации не предусмотренной в обработчике событий. Расположение модулей обработки в кейс-структуре возможно, но при условии, что время для обработки любого события гарантировано не превышает 0,1-0,2 сек.(время не заметное для пользователя). Лучше в кейсе формировать очередь команд, а их исполнение поручить параллельному процессу.
Artem.spb

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

Re: Вопрос по event structure

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

miklo писал(а): 27 июл 2020, 07:59
Artem.spb писал(а): 24 июл 2020, 15:08 пока работа не закончена, интерфейс заморожен, и пользователь будет думать, что программа зависла.
Я убрал галочку в чекбоксе "block panel" в параметрах всех эвентов.
это даже хуже, чем морозить. Пользователь будет уверен ,что программа его игнорирует, и начнёт жать всё подряд. И это всё выстроится в очередь, что ещё больше затянет ожидание.

А какие преимущества дает использование только одной машины для всех этих нескольких однотипных алгоритмов?
На уровне абстракция тяжело рассуждать, что лучше/хуже.
несколько машин - это по сути та же одна, но на несколько веток. Тут дело не в методах подсчёта количества машин, а в том, что вы все шаги впихнули в один кейс и провоцируете пользователя на ненужные действия.
машину и интерфейс лучше разнести.
У Блюма есть спорный на мой взгляд "Событийно управляемый конечный автомат" Начните хотя бы с него.

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

Re: Вопрос по event structure

Сообщение miklo »

Благодарю за советы, друзья.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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