Страница 1 из 6

Re: Actor Framework

Добавлено: 12 дек 2015, 19:20
Borjomy_1
Скорее всего первая причина. Во первых действительно больших проектов не так много. Во-вторых для разработчика приложений объекты вообще излишество... они востребованы больше при системном программировании.

Re: Actor Framework

Добавлено: 13 дек 2015, 15:08
Kosist
Честно говоря, хотел бы начать им пользоваться, но все руки не доходят... Хочется еще и HAL "поковырять", и испробывать на "боевом" проекте, но на все нужно время, и когда дело доходит до проекта - то приходится все делать галопом, и "традиционными" методами, привычными шаблонами...

Re: Actor Framework

Добавлено: 13 дек 2015, 17:45
taras_33
В принципе, в качестве урока можно опубликовать небольшой проектик использующий AF, с картинками и пошаговыми инструциями. Вот только инструктор и писатель из меня никакой, да и времени это отнимет достаточно, возникает вопрос: A это кому нибудь нужно?

Re: Actor Framework

Добавлено: 13 дек 2015, 18:00
dadreamer
taras_33 писал(а):A это кому нибудь нужно?
Конечно, я бы сам не прочь взглянуть на пример. Тем более что на портале подобных уроков нет.

Re: Actor Framework

Добавлено: 20 дек 2015, 06:37
taras_33
Поскольку я в первую очередь электронщик а уж потом програмист, вспомил как в детстве мигал светодиодом PIC контроллером и несказанно радовался. Чтобы не отступать от традиций решил помигать и сейчас. Только это будет не древний PIC и даже не любимый и везде используемый мною сейчас ARM, это будет LabVIEW и Actor Framework.
Сразу скажу что пример писал в LV2013, поэтому у кого LV2014 увидят вот такой крест.
LV2014.PNG
LV2014.PNG (696 байт) 17804 просмотра
Работать будет, но могут быть глюки. Это из за того что в LV 2014 другая версия AF. Там еще проще работать с AF. Но лично мне больше по душе 2013 (контроля над проектом чуть побольше). О LV2015 ничего не скажу не пробовал и никогда не работал.
Что такое Actor? по сути дела это обычный Produser-Consumer, который по усмотрению пользователя может быть с UI и ивент структурой или без нее, без UI а заодно и без "верхнего while loop"
Сам проект разбит на программные модули. Кликаем VIEW -> LabVIEW Class Hierarchy.
Class Hierarchy.jpg
Class Hierarchy.jpg (17.98 КБ) 17804 просмотра
Разархивируем проект и запускаем "Launcher" Launcher запускает UI (Main Panel) и Controller, который в свою очередь запускает два модуля LED1 и LED2. Оба модуля override update метод от модуля таймер. В этом вся прелесть OOP один раз написав код, можно его использовать как есть, наследуя от родителя, или изменять(override). Конечно в этом микроскопическом проекте это трудно оценить, да я и не ставил такую цель. В данном случае модуль таймера создает копию (clone) для каждого LED со своим временем (poll rate). Когда изменяюм частоту мигания (Time delay) мы посылаем сообщение в controller, который останавливает модуль LED записывает новый pool rate и снова запускает. Понимаю что сделано через задницу, но я повторюсь хотел показать возможности AF. Конечно можно подумать "чтобы помигать двумя светодиодами достаточно одного while loop и пары функций задержки времени" Согласен, только вот если проект разрастается, добавляются все новые и новые возможности, начинаешь понимать всю мощь и удобство AF
В реальных проектах используются Handle error, где очень удобно сделать Error logger или Last ACK, когда перед выходом из модуля необходимо произвести определнные действия, закрыть порты, выключить реле и т.д. и многие другие фишки AF. Здесь этого ничего нет, пытался сделать как можно проще.
P.S. извиняюсь за сумбур. Я предупреждал ранее, что писатель из меня плохой, я больше на обыкновенного буржуйского инженера смахиваю :)

Re: Actor Framework

Добавлено: 27 дек 2015, 02:46
taras_33
Судя по "многочисленным коментариям" в этой теме, решил я сделать еще одну попытку донести до народа, что такое Actor Framework. Идея такая: создание простейшего проекта с одной кнопкой и одним индикатором, используя pattern называемый producer-consumer, затем шаг за шагом повторить тоже самое, только используя AF. Что ж приступим.

Часть первая: Template
Думаю что каждый знаком с pattern producer – consumer, блок диаграмма которого представлена ниже
Template
Template
В приложении подопытный проект, над которым мы будем проводить эксперименты.

Re: Actor Framework

Добавлено: 27 дек 2015, 02:59
taras_33
Часть вторая: Добавление AF библиотеки к проекту
Надеюсь Вы скачали template из предыдущего поста и даже его где то сохранили :) Находим это место на диске и внутри папки “AF for Dummies” создадим папку “AF”, внутри которой добавим еще одну папку, обозвав ее “Main Class”.
В окне проекта клацаем правой кнопкой мыши (далее ПКМ) по My Computer и в выпадающем меню выбираем New -> Virtual Folder, назовем ее “AF”.
Virtual Folder.jpg
ПКМ по AF далее New -> VI. Сразу сохраним его Ctrl+S в созданную нами папку AF обозвав “Launcher.vi” Откроем блок диаграмму этого vi и перетащим на нее несколько функций из палитры Data Communication -> Actor Framework
LV 2013 AF Functions.jpg
LabVIEW 2013 нам нужны: Launch Actor, Obtain Message Queue, Read Enqueuer, Release Message Queue. Последние три можно найти Data Communication -> Actor Framework -> Message Queue

LabVIEW 2014 достаточно одной функции Launch Root Actor. Закройте Launcher.vi, сохранив его, провода соединим позже.
Как только мы добавили функции из палитры Actor Framework, LabVIEW автоматически добавит к проекту библиотеку Actor Framework.lvlib (можно посмотреть в окне проекта Dependencies -> vi.lib)

Re: Actor Framework

Добавлено: 27 дек 2015, 03:07
taras_33
Часть третья: Создание класса

Теперь создадим Main Class. ПКМ по виртуальной папке AF -> New -> Class
Create Main Class.jpg
Назовем его Main FP и сохраним в папке Main Class. У меня проект лежит на рабочем столе, поэтому структура папок выглядит так.
Structure.jpg
У Вас должно быть что то похожее. Нет, ну конечно можно все свалить в кучу, в одну единственную папку, это как кому нравиться… Но я настоятельно рекомендую все раскладывать по полочкам, вернее папочкам, поскольку в будущем при Override родительских методов детьми, файлы будут иметь одинаковые имена, а windows, как известно не позволяет иметь два файла с одинаковыми именами в одном месте.

Re: Actor Framework

Добавлено: 27 дек 2015, 03:15
taras_33
Часть четвертая: Негоже быть беспризорным или удочерение класса (а может усыновление?)

Вернемся к нашим баранам, вернее проекту. Сделаем Main FP.lvclass “ребенком” от класса Actor, тем самым унаследовав его свойства и методы. В окне проекта ПКМ по Main FP.lvclass -> Property. Откроется окно свойств класса, где нам нужно изменить Inheritance, щелкнув по соответствующей кнопке
Change Inheritance.jpg
Откроется окошко в котом нужно выделить строчку Actor.lvclass и щелкнуть по кнопке Inherit From Selected, окошко закроется.
Change Inheritance 2.jpg
Закроем окно свойств кликнув Ок. (Можно перед закрытием на вкладке General Setting отредактировать иконку, щелкнув по кнопке Edit Icon, как это сделал я, написав “MAIN”)
Edit Icon.jpg

Re: Actor Framework

Добавлено: 27 дек 2015, 03:24
taras_33
Часть пятая: Actor Core или окно User Interface
В окне проекта ПКМ по Main FP.lvclass -> New -> VI for override
Override.jpg
В открывшимся окошке выделяем Actor Core и щелкаем Ок
Actor Core.jpg
Actor Core.jpg (57.42 КБ) 17700 просмотров
Не отходя от кассы, сохраняем его в папку Main Class (имя Actor Core не меняем). Вот этот VI и будет нашей главной Front Panel, из чего следует, что здесь нам нужно построить UI (юзер интерфейс) В нашем случае это кнопка и индикатор. Для начала Hide (спрячем) с FP мешающие нам controls и indicators. На блок диаграмме ПКМ по каждому из них и выбираем из выпадающего меню Hide. Заодно в этом же меню можно убрать птичку View As Icon (если это не сделано в настройках LabVIEW по умолчанию), так они места меньше занимают на блок диаграмме.
Hide controls.jpg
Hide controls.jpg (34.8 КБ) 17700 просмотров

Re: Actor Framework

Добавлено: 27 дек 2015, 03:36
taras_33
Часть шестая: Строим UI

Открываем Actor Core. Добавте на FP одну кнопку и один Boolean индикатор, обозвав его LED. Прошлый раз я обновлял индикаторы (мигал светодиодами) используя user event-ы, давайте для разнообразия менять состояние идикатора будем используя его reference, поэтому ПКМ по индикатору LED -> Create -> Reference
LED reference.jpg
Итак Reference мы создали, теперь нужно поместить этот тип данных в Main FP кластер. Для этого двойным щелчком открывает Main FP.ctl, берем с блок диаграммы только что созданный reference (ссылку) и не отпуская кнопку мыши тащим его на FP ctl
Reference to claster.jpg
Переименуем Bool Refnum в LED Ref и переместим внутрь кластера
Into Cluster.jpg
Into Cluster.jpg (46.83 КБ) 17699 просмотров
Закрываем нажав на крестик Main FP.ctl соглашаемся сохранить изменения.

Re: Actor Framework

Добавлено: 27 дек 2015, 03:46
taras_33
Часть седьмая: Метод класса и Message Maker

Создаем метод класса, который будет менять состояние индикатора. ПКМ по Main FP.lvclass -> New -> VI from Static Dispatch Template. Откроется новый VI, сохраним его в папку Main Class под именем Update LED.vi и модифицируем блок диаграмму.
update method.jpg
Закрываем, сохранив изменения. Теперь самое интересное. Идем в Tools –> Actor Framework Message Maker
Message Maker.jpg
Откроется окошко, вверху выбираем наш проект с одним единственным методом Update LED, выделяем его и кликаем Build Selected. Ждем пока LabVIEW сгенерирует три Vis. Закрываем Message Maker и три сгенерированных Vis, они пока нам не нужны.
Build Selected.jpg
У нас в проекте появится Update LED Msg.lvclass , на диске рядом с папкой Main Class будет создана еще одна папка с названием Main FP Messages, внутри которой будет еще одна папка с названием нашего метода, внутри которой буду помещены сгенерированные три Vis. Давайте и мы в проекте создадим виртуальную папку, обзовём ее Messages for Main class и поместим (перетащим мышкой) туда Update LED Msg.lvclass ПКМ на AF -> New -> Virtual Folder
Move to VF.jpg
Move to VF.jpg (46 КБ) 17699 просмотров

Re: Actor Framework

Добавлено: 27 дек 2015, 03:53
taras_33
Часть восьмая: Блок диаграмма Main FP

Строим блок диаграмму Main FP.
Открываем Actor Core.vi, помещаем на блок диаграмму Read Self Enqueuer.vi, который можно найти в палитре Actor Framework, создаем в Event структуре событие Value Change кнопки и перетаскиваем из окна проекта в это событие сгенерированный на предыдущем шаге Send Update LED.vi, остальное соединяем в соответствии с рисунком.
Send update.jpg
Создаем еще одно событие Panel Close? и помещаем из палитры Actor Framework Send Normal Stop.vi
Panel Close.jpg
Panel Close.jpg (24.26 КБ) 17699 просмотров

Re: Actor Framework

Добавлено: 27 дек 2015, 04:15
taras_33
Часть девятая: Start или Launcher

Осталось закончить Launcher.vi , созданный в самом начале. Открываем его блок диаграмму и захватив мышкой в окне проекта Main FP.lvclass перетаскиваем его на блок диаграмму.
LabVIEW 2013 блок диаграмма Launcher.vi выглядит так:
Launcher LV2013.jpg
В LabVIEW 2014 , жизнь упростили, но лишили … впрочем это уже другая история…
Launcher LV2014.jpg
Launcher LV2014.jpg (9.37 КБ) 17700 просмотров
Вот собственно и все, сохраняем, запускаем Launcher.vi
В приложении проект, над которым мы измывались. Еще посоветую не останавливать запущеный VI этой кнопкой
Stop.jpg
Stop.jpg (2.72 КБ) 17700 просмотров
Если будете работать с AF, поймете почему. Поскольку данный проект содержит один единственный Actor, то эта проблема здесь не проявится. И все же лучше выключать компьютер через shutdown, а не выдергиванием шнура из розетки

Всех с наступающим Новым Годом, надеюсь что время потратил не зря, писав эту эпопею...

Re: Actor Framework

Добавлено: 27 дек 2015, 14:57
dadreamer
taras_33, спасибо за развёрнутую инструкцию для чайников! :D Я с этим ни разу не работал, потому наверное тоже отношусь к ним. )

Ради интереса попробовал сделать всё вышеописанное в :labview: 2015. Подошла инструкция для :labview: 2014. Однако хотелось бы уточнить кое какие моменты:
1. При изменении наследственности Main FP.lvclass (Часть четвертая: Негоже быть беспризорным или удочерение класса (а может усыновление?)) в окне Change Inheritance изначально почему-то не было Actor.lvclass и вообще всего, что с ним связано. Был только Main FP.lvclass. Я сохранил весь проект, закрыл :labview: и открыл по-новой. Тогда Actor.lvclass появился.
2. В меню Tools не было пункта Actor Framework Message Maker (Часть седьмая: Метод класса и Message Maker). В таком случае его нужно ставить через VIPM: набрать в строке поиска "Actor" и появится пакет MGI Actor Framework Message Maker (v1.0.0.17 в моём случае).
3. При компиляции в экзешник не работает. Компилирую Launcher.vi. При запуске экзешника появляется этот самый лаунчер, но на этом всё. Связано это со входом Open Actor Core front panel? у Actor:Launch Root Actor VI:
LabVIEW Help писал(а):The TRUE setting causes this VI to return an error in the run-time engine.
Советуют использовать метод Front Panel:Open. Поэтому я поместил в Actor Core.vi вот это:
2015-12-27_17-19-34.jpg
2015-12-27_17-19-34.jpg (19.88 КБ) 12915 просмотров
Всё заработало. При желании можно и сам Launcher скрыть, вызвав FP.State = Hidden до запуска Root Actor'а.

Далее вопрос общего плана. Как понять, что уместнее использовать AF, а не стандартные шаблоны типа параллельных циклов? Субъективно кажется, что стандартный шаблон проще и быстрее создать, чем возиться с классами. Есть ли критерий, по которому можно понять, что лучше повозиться в начале, а потом "курить бамбук", чем наборот? :)