Вернуться   Форум > LabVIEW > FAQ

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.09.2007, 12:44
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
Стрелка Серия заметок от ipc

Да простит меня уважаемый ipc но уж больно он долго отмалчивается. Так что если будут ко мне какие-то претензии, то пусть пеняет сам на себя. Ну а я, пока он думает, примерю на себе шкурку Брута.

Начнем-с по правилам хорошего тона с лицензионного соглашения:
ЛИЦЕНЗИОННО СОГЛАШЕНИЕ:
1. Ни ипц ни шуш не несут ответственности за ниже написанное.
2. Почти все идеи принадлежат только ipc.
3. Всё поставляется по принципу «как есть» и с этим вы должны смериться.
4. НИКАКИХ ГАРАНТИЙ НЕ ПРИЛАГАЕТСЯ И НЕ ПРЕДУСМАТРИВАЕТСЯ. ВЫ ИСПОЛЬЗУЕТЕ ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ НА СВОЙ РИСК.
5. При коммерческом использовании приведенного материла обязательно ссылка на ipc и гуманитарная помощь в размере N-ного процента от возможной прибыли.
6. ipc оставляет за собой право отменить действие данной лицензии для любой из последующих версий событиек.
7.Все права не предоставленные здесь явно сохраняются за ipc.
8.Если вы с чем-то не согласны, то дальше можете не читать и просто обязаны все удалить!
Ну вот, теперь можно и начать!
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #2  
Старый 16.09.2007, 12:46
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

И так. Как вы все прекрасно знаете одно из главных весчей в программе есть ничто иное как ее state-машина. Вот с нее мы пожалуй и начнем. Хотя… Стоп! Начать надо с представления данных. А именно с идеи СуперКластера (SuperCluster). В общем то, это обычный кластер в котором просто структурированы данные. На небольшой такой по своим размерам СуперКластер можно посмотреть на рис.0.
Состав СуперКластера:
0.Кластер “SuperCluster” (Custom control, typedef)
1.Кластер “Events”
1.1.Массив “Actios” -> Enum (Custom control, typedef)
2.Кластер “Flags”
2.1.Boolean “Exit” (Custom control, typedef)
Как видите пока у нас в СуперКластаре только два кластера – это кластер событий “Events” с массивом действий “Action” и кластер флагов “Flags” пока с одним флагом “Exit”. Хочу обратить ваше внимание на то что сам СуперКластер а так же Enum “Action” (тот что в массиве) и кластер “Flags” вынесены в Custom Control и им задан атрибут Type Def (пример рис 1.).
Надо отметить идея СуперКластера родилась у ipc очень давно: официально наверно лет семь назад, а мне так кажется что с пеленок. И заключается она в следующем – объединить и структурировать все данные в одном кластере, что вполне логично и наглядно (особо одаренные могут для большой наглядности раскрасить кластера в свои цвета). Но хочу сразу оговориться – не стоит очень большой кластер спускать целиком в подпрограммы! Связанно это с тем, что Labview каждый раз при входе в оные копирует весь кластер целиком, а этот процесс отъедает у вас драгоценную память и время.
Изображения
  
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #3  
Старый 17.09.2007, 13:57
Аватар для Fakir
Fakir Fakir вне форума
Мастер
 
Регистрация: 16.06.2006
Сообщения: 241
По умолчанию

Цитата:
Сообщение от Тотолотто Посмотреть сообщение
Ну и вот сразу вопрос:

зачем нужен Кластер "Ивентс"? Нельзя массив "Экшенс" поместить сразу в верхний Кластер "Супер Кластер"?
Видимо это имеет какое то значение при использовании Супер Кластера.

тото
Предполагается класть туда все, что относится к Ивентсам (в перспективе большого проекта)
З.Ы. ШуШ типа начал с малого, и хочет плавно развить тему
Ответить с цитированием
  #4  
Старый 18.09.2007, 20:16
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

… продолжение!
В дальнейшем, мы расширим наш СуперКластер. А пока перейдем к следующему пункту непосредственно к реализации state-машины. На рис 2. представлена типичная машина состояний(state-machine). Давайте рассмотрим более подробно, по шагам, ее работу. При запуске vi происходит:
1) инициализация массива “Action” массивом констант состояний, т.е. мы таким образам задаем последовательность действий для нашей машины состояний.
2) Вход в главный цикл – While Loop.
3) ожидание срабатывания таймаута в Events Structure или события.
3.1)Если сработало событие, обрабатываем его и переходи к пункту 5. Иначе продолжаем дальше.
4) Цикл For Loop. С помощью данного цикла мы производим выборку значений из массива, по которым программа входит в то или иное состояние (за это отвечает Case Structure). Количество итераций зависит только от количества элементов массива “Action”. При этом сохраняется последнее состояние “машины” и при следующем входе в цикл For Loop будет исполнено заново.
5) Проверка флага “Exit”
6) Возврат к пункту 3 или выход.
Теперь рассмотрим непосредственно наш пример:
1) массиву “Action” присваиваем значения {“init”, “Wait”}
2) Входим в главный цикл While Loop
3) Ожидаем события в течении ~20 ms
3.1) Если событие произошло (пользователь нажал кнопку “Exit”), присваиваем массиву “Action” значение {“Exit”} и переходим к 6 пункту.
4) Входим в For Loop и производим выборку элемента из массива “Action”.
5) В Case Structure обрабатываем полученное значение:
a. Если “Init”, то сбрасываем флаг “Exit” в “false”
b. Если “Wait”, то ничего не делаем
c. Если “Exit”, то устанавливаем флаг “Exit” в “true”
6) Выходим из главного цикла если установлен флаг “Exit” (не путайте флаг “Exit” с состоянием “Exit”), иначе к пункту 3.
В следующий раз мы рассмотрим как добавить новое состояние в машину состояний и заодно немного поговорим об User Events.
PS: Пример написан на LV8.2. Для тех у кого версия LV пониже прилагаю файл pic.rar со всеми скриншотами.
Изображения
 
Вложения
Тип файла: rar pic.rar (165.2 Кбайт, 907 просмотров)
Тип файла: rar Blank.rar (26.8 Кбайт, 855 просмотров)
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #5  
Старый 24.09.2007, 14:55
Аватар для Fakir
Fakir Fakir вне форума
Мастер
 
Регистрация: 16.06.2006
Сообщения: 241
По умолчанию

А можно мне внести небольшое замечание. При использовании данной Стэйт машины столкнулся со следующей ситуацией у себя в проекте: при нажатии на кнопку коннект, должны происходить последовательно несколько операций(открытие порта, запуск потока чтения из порта, ну и переход в состояние работы), без проблем, с помошью используемой модели это делается легко и непринужденно (см рис 1). Так вот допустим открытие порта не получилось, соответственно нужно отменять запуск потока и переход в режим работы, в данном варианте машины назначенные события уже не изменить, это на мой взляд минус. Я немного переделал, как говорит Шуш, "сердце" стэйт-машины, вот что получилось см. рис. 2.
Шуш что скажешь?
Изображения
  
Ответить с цитированием
  #6  
Старый 24.09.2007, 18:41
Аватар для step
step step вне форума
Certified LabVIEW Associate Developer
 
Регистрация: 19.10.2005
Адрес: Москва
Сообщения: 373
По умолчанию

Цитата:
Сообщение от Fakir Посмотреть сообщение
... в данном варианте машины назначенные события уже не изменить, это на мой взляд минус
Шуш что скажешь?
Согласен с Факиром, цикл for явно ни к чему, лучше так
Ответить с цитированием
  #7  
Старый 25.09.2007, 08:18
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

Цитата:
Сообщение от Fakir Посмотреть сообщение
А можно мне внести небольшое замечание. При использовании данной Стэйт машины столкнулся со следующей ситуацией у себя в проекте: при нажатии на кнопку коннект, должны происходить последовательно несколько операций(открытие порта, запуск потока чтения из порта, ну и переход в состояние работы), без проблем, с помошью используемой модели это делается легко и непринужденно (см рис 1). Так вот допустим открытие порта не получилось, соответственно нужно отменять запуск потока и переход в режим работы, в данном варианте машины назначенные события уже не изменить, это на мой взляд минус. Я немного переделал, как говорит Шуш, "сердце" стэйт-машины, вот что получилось см. рис. 2.
Шуш что скажешь?
Такая версия событийки так же имеет право на жизть. Но ведь тебе никто не мешает задать состояния state-машины до открытия порта. А по результатам открытия решить - продолжить ли работу или выйти из программы.

Цитата:
Сообщение от step Посмотреть сообщение
Согласен с Факиром, цикл for явно ни к чему, лучше так
Т.е. для того чтобы обработать UserEvents тебе необходимо зайти в состояние Wait?
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #8  
Старый 26.09.2007, 19:19
Аватар для step
step step вне форума
Certified LabVIEW Associate Developer
 
Регистрация: 19.10.2005
Адрес: Москва
Сообщения: 373
По умолчанию

Цитата:
Сообщение от iei Посмотреть сообщение
Т.е. для того чтобы обработать UserEvents тебе необходимо зайти в состояние Wait?
Оно само туда зайдется, когда очередь опустеет. Когда автомат находится не в состоянии wait, события буферизуются, и всё равно будут обработаны по приходу в состояние wait.

Цитата:
Сообщение от ipc
самое ее главное преимущество именно в том что можно задать серию последовательных событий и не надо парится с очередями
Структура данных "очередь" куда более свойственна для управления состояниями, чем структура данных "массив". Потому что "добавить элемент (много элементов) в начало", "взять элемент (много элементов) с конца" это операции характерные для очереди, ну никак не для массива.
Ответить с цитированием
  #9  
Старый 26.09.2007, 21:10
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

Цитата:
Сообщение от step Посмотреть сообщение
Оно само туда зайдется, когда очередь опустеет. Когда автомат находится не в состоянии wait, события буферизуются, и всё равно будут обработаны по приходу в состояние wait.
У ipc принцип другой - "магазин" состояний никогда не может быть пустым. В нем всегда есть хотя бы одно состояние.
Цитата:
Сообщение от step Посмотреть сообщение
Структура данных "очередь" куда более свойственна для управления состояниями, чем структура данных "массив". Потому что "добавить элемент (много элементов) в начало", "взять элемент (много элементов) с конца" это операции характерные для очереди, ну никак не для массива.
Очереди строятся, как правило, при помощи массивов и связанных списков! Если точнее, представляются в виде линейного списка. Что есть ни что иное как массив связных списков. Так что теоретически - это так, а вот практически... меня всегда интересовал вопрос, как устроена очередь в Labview.
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #10  
Старый 27.09.2007, 00:39
Аватар для step
step step вне форума
Certified LabVIEW Associate Developer
 
Регистрация: 19.10.2005
Адрес: Москва
Сообщения: 373
По умолчанию

Цитата:
Сообщение от iei Посмотреть сообщение
Очереди строятся, как правило, при помощи массивов и связанных списков! Если точнее, представляются в виде линейного списка. Что есть ни что иное как массив связных списков. Так что теоретически - это так, а вот практически... меня всегда интересовал вопрос, как устроена очередь в Labview.
Линейный список не есть "массив связанных списков", думаю Вы что-то другое хотели сказать. Линейный список есть частный случай связанного списка. Вы наверное хотели сказать, что очереди строятся при помощи массивов или связанных списков.

Как бы там ни было, понятно одно: операции добавления в начало и взятие с конца оптимальнее реализованы для лабвьюшных очередей, а не для для лабвьюшных массивов.
Понятно, что вопрос о скорости не стоит -- массивы здесь маленькие. Просто использовать очередь... как бы идеологически правильнее.

Решил побольше вникнуть в автомат ipc.. Меня глючит или действительно нельзя добавлять состояния в магазин из самих состояний (например из Init)? Изменения же затрутся в очередной итерации цикла for.
Ответить с цитированием
  #11  
Старый 27.09.2007, 19:02
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

Цитата:
Сообщение от step Посмотреть сообщение
Линейный список не есть "массив связанных списков", думаю Вы что-то другое хотели сказать. Линейный список есть частный случай связанного списка. Вы наверное хотели сказать, что очереди строятся при помощи массивов или связанных списков.
Спасибо за ликбез, но о том как в природе разводят очереди я имею представление. Меня же интересует как это делает Labview!
Цитата:
Сообщение от step Посмотреть сообщение
Как бы там ни было, понятно одно: операции добавления в начало и взятие с конца оптимальнее реализованы для лабвьюшных очередей, а не для для лабвьюшных массивов.
Понятно, что вопрос о скорости не стоит -- массивы здесь маленькие. Просто использовать очередь... как бы идеологически правильнее.
Иногда надо поступаться идеологией. Я к тому, что если ты владеешь большей информацией о представлении лабвьюшных очередй, просьба поделиться своими знаниями!
Цитата:
Сообщение от step Посмотреть сообщение
Решил побольше вникнуть в автомат ipc.. Меня глючит или действительно нельзя добавлять состояния в магазин из самих состояний (например из Init)? Изменения же затрутся в очередной итерации цикла for.
Если только Init будет последним состоянием в "магазине" состояний. Т.е. "на ходу" поменять последовательность выполнения - нельзя (разве что в версии 8.5 с ее breakами)
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #12  
Старый 27.09.2007, 19:41
Аватар для step
step step вне форума
Certified LabVIEW Associate Developer
 
Регистрация: 19.10.2005
Адрес: Москва
Сообщения: 373
По умолчанию

Цитата:
Сообщение от iei Посмотреть сообщение
Я к тому, что если ты владеешь большей информацией о представлении лабвьюшных очередй, просьба поделиться своими знаниями!
Не, такими знаниями я не владею . Вы чтоли не согласны что
Цитата:
операции добавления в начало и взятие с конца оптимальнее реализованы для лабвьюшных очередей, а не для для лабвьюшных массивов
? Так это можно легко проверить на тестовых примерах.

Цитата:
Т.е. "на ходу" поменять последовательность выполнения - нельзя (разве что в версии 8.5 с ее breakами)
Это грустно, очень большой минус.
Ответить с цитированием
  #13  
Старый 27.09.2007, 22:06
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

Цитата:
Сообщение от step Посмотреть сообщение
Не, такими знаниями я не владею . Вы чтоли не согласны что
? Так это можно легко проверить на тестовых примерах.
При работе с простыми типами - превзойдет, я даже в этом не сомневаюсь!
Цитата:
Сообщение от step Посмотреть сообщение
Это грустно, очень большой минус.
В данной модели это значит только одно – не продуман граф переходов.
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #14  
Старый 27.09.2007, 22:49
Аватар для psi
psi psi вне форума
Профи
 
Регистрация: 29.10.2006
Адрес: Украина, Сумы
Сообщения: 156
По умолчанию

Цитата:
Сообщение от iei Посмотреть сообщение
При работе с простыми типами - превзойдет, я даже в этом не сомневаюсь!

В данной модели это значит только одно – не продуман граф переходов.
Вообще стейт машина от IPC довольно прикольная... И проблем с добавлением в начало, обнуление и т.д... можно избежать если все продумать... Что тоже имеет свой плюс, больше дисциплинирует, чем в случае с очередями...

Все же ждем продолжение про суперкластер...
Ответить с цитированием
  #15  
Старый 28.09.2007, 00:49
Аватар для step
step step вне форума
Certified LabVIEW Associate Developer
 
Регистрация: 19.10.2005
Адрес: Москва
Сообщения: 373
По умолчанию

Цитата:
Сообщение от iei Посмотреть сообщение
В данной модели это значит только одно – не продуман граф переходов.
Увы, получается что в автомате ipc речь о графах даже не идет. Есть просто последовательность состояний.
Ответить с цитированием
  #16  
Старый 11.11.2007, 13:35
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

Продолжим…
И так что мы тут сделали:
1)Спрятали наш суперкластер под иконкой (рис.3.)
2)Изменили список состояний:
- init: инициализация и настройка программы;
- start: в этой секции происходит запуск потока _thread.vi;
- work: здесь производим операции над строкой (ничего более умного не придумал);
- stop: остановка потока _thread.vi;
- wait: ничего не делаем, ждем события;
- search: поиск интерфейсов (в примере это com-порты)
- refresh: обновление таблицы с перечнем найденных интерфейсов
- exit: выход из программы;
- error: обработка возникших ошибок;
3) добавили пользовательское событие – “Event”: Через него мы осуществляем связь с нашим потоком _thread.
4) Разбили программу на два уровня: верхний уровень и нижний. Верхний уровень отвечает за программу целиком, он абстрагирован от железа. Нижний уровень работает только с железом (поиск устройств, прием и передача данных). Таким образом в данный пример легко добавить работу с новым интерфейсом. И в случае возникновения ошибки в потоке, по идее, она недолжна сказаться на общее состояние программы целиком.
5) Использовали тип данных Variant, а так же его атрибуты, для обмена данными между потоками (см. MAIN_CheckEvent.vi).
6) используем while loop в качестве хранилища данных о запущенных потоках(см. MAIN_Storage.vi рис.9.)
Изображения
 
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #17  
Старый 11.11.2007, 13:37
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

Структура каталогов программы (для удобства я разбил на две библиотеки, рис.4.):
Main.lvlib (верхний уровень)
- Event: регистрация, генерация, проверка событий;
- Ctl: здесь собраны Control’ы по верхнему уровню;
- Service: сервисные функции (открытие/закрытие интерфейса, выпаривание данных – в общем все то что недолжно мозолить глаза);
Main.vi – само приложение.
Interface.vilib (нижний уровень):
- Ctl: здесь собраны Control’ы по нижнему уровню;
- Vendors: каталог разбита на подкаталоги по названию интерфейсов (в примере только один каталог - Serial), в этих каталогах собраны vi непосредственно работающие с железом.
- Interface_search.vi: поиск интерфейсов.
Изображения
 
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #18  
Старый 11.11.2007, 13:40
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

Запуск программы:
1.При старте мы регистрируем пользовательское событие, это необходимо для того чтобы “приучить” событийку к нашему событию и инициализируем «магазин состояний» (рис.5.).
2. Ожидаем события.
3. Переходим в состояние init где происходит инициализация флагов, индикаторов и контролов.
4. В состояние Search производим поиск интерфейсов (Рис.6.).
5. В Refresh выводим на экран список интерфейсов.
6. В состоянии wait ничего не делаем.
Изображения
  
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #19  
Старый 11.11.2007, 13:51
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

Если нажата кнопка “Старт/Стоп”:
1.Проверяем флаг “Start”, если он имеет значение “True”, то переходим в состояние Stop и затем в Wait. Иначе переходим в состояние “Start” (Рис.7.).
2. В состояние “Start” мы закрываем старый референс на наше событие, и “открываем” интерфейс (см. MAIN_StartStop.vi, кейс Start рис.8. и рис.8.1.).
Изображения
   
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
  #20  
Старый 11.11.2007, 14:04
Аватар для iei
iei iei вне форума
Хранитель знаний
 
Регистрация: 15.06.2006
Адрес: Мурманская обл.
Сообщения: 695
Отправить сообщение для  iei с помощью ICQ
По умолчанию

При этом запускаем поток SERIAL_Thread.vi (рис.10.) передаем ему необходимые параметры и регистрируем новое пользовательское событие (см. MAIN_Storage.vi, кейс OpenInterface рис.9.). Если вовремя запуска потока не возникло ошибок то переходим в состояние “work” иначе идем в состояние “error” и “wait”
Изображения
  
__________________
Beer - Girls - Rock'N'Roll
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Серия заметок от ипц (в редакции шуша) iei Программирование в LabVIEW 47 14.06.2008 10:34
серия вопросов от новичка Злобин Программирование в LabVIEW 15 10.09.2007 09:51

RSS


Часовой пояс GMT +3, время: 16:02.


vBulletin v3.6.1, Copyright ©2000-2019, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co