Запаковать Actor

Общие принципы, проектирование, модуляризация, темплейты и шаблоны
Ответить
Artem.spb

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

Запаковать Actor

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

Задача: сделать максимально модульную программу, чтобы новые запчасти добавлять через пакеты, не перекомпилируя весь exe. Более того (наглость какая), распараллелить разработку.
идея: "скомпилировать" AF, каждому разработчику дать пакет для наследования и от него уже плясать.

Дальше хуже, я сделал базовый UI класс, в котором основные/общие функции уже реализованы.
Т.е. такая иерархия: AF -> UIbase -> module1..2...3...

Сначала запаковал UIbasе, но он отказывается работать с AF в исходниках.
Нашёл эту статью и запаковал до кучи сам AF
https://knowledge.ni.com/KnowledgeArtic ... 0015A6NSAU
Так что теперь это должно выглядеть так
AF.PPL -> UIbase.PPL -> module1.PPL

Но тут началась полная ерунда.
UIbase весь поломан. Ок, возможно, я там ещё смогу починить, он мог что-то старое подтянуть.
Но и module не хочет толком работать пока.
И ещё одна странность этого подхода: каждый раз, когда я делаю create actor message система спрашивает у меня 3-4 AF - файла, т.е. скрипт, который строит сообщения всё ещё пытается найти оригинальный AF (я его пока удалил из program files, чтобы хвосты все убрать). Это мягко говоря не удобно, вместо того, чтобы выбрать 5 vi и сделать махом для всех сообщения, я сижу и 5*4 раз тыкаю нужную функцию из ppl.

Собственно вопрос: как это всё по-человечески сделать?
Думаю в том числе про интерфейсы, из тоже буду собирать в PPL, но мне нужны реализации некоторых функций, а не только шаблоны.
Этот проект в LabVIEW 25 делаю.
Исходники не жалко, могу скинуть, там пока ничего секретного нет.
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 398
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 15 раз
Контактная информация:

Re: Запаковать Actor

Сообщение taras_33 »

Я в некоторых проектах использую нечто похожее. Преследовал идею изменения внешнего вида и алгоритма работы отдельного модуля, без компиляции всего проекта — получилось.
Структура следующая, см скриншот — это проект отдельного модуля.
Default.PNG
Все скомпилировано в *.lvlip , включая сам Actor Framework. Модуль представляет собой UI с кнопками, графиками и прочей лабудой, причем у каждого модуля свои кнопки и графики. Создаешь новый UI, компилируешь и удаленно copy/paste в папку Plagins на таргет машине. Основная программа при запуске из этой папки создает список в Combobox. Юзер щелкнув в этом списке на строчку, останавливает старый (если он там был) и запускает новый модуль, который вставляется в SubPanel. См скриншот
Load UI.PNG
Для каждой PPL свой проект, хотя видел как нормальные люди работают в одном проекте со всем хозяйтсвом — очень удобно при отладке. Но переделывать не буду, поскольку уже все отлажено и работает.

Это проект основной программы на стадии отладки, в котором подгружены скомпилированные модули… break point хрен поставишь :)
Main.PNG
Что не нравится: Запускаешь программу, выбираешь нужный модуль, работаешь с ним, выбираешь другой модуль, предыдущий удаляется из SubPanel и загружается новый. НО! Удаленный модуль из SubPanel остается в памяти. В моем случае не критично, размер модуля небольшой, основной код сосредоточен в Root и Main. Но факт остается фактом. Вот собственно как то так..
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Artem.spb

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

Re: Запаковать Actor

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

Так много вопросов, так мало ответов :)
Это именно то, что мне надо и то, как я пытаюсь это сделать.

1) куда вы запрятали casting*.vim файл? У меня дочерние авторы требуют его, но запаковать в библиотеку его тоже невозможно, поэтому я копирую его рядом с библиотекой.
2) оригинальный актор на месте остался? не мешает при работе, система не подтягивает его вместо библиотеки по ошибке?
3) как обстоят дела с построением сообщений?
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 398
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 15 раз
Контактная информация:

Re: Запаковать Actor

Сообщение taras_33 »

Отлучился по бизнес делам. Нарисуюсь в пятницу. Если сильно не напрягут, то попробую набросать пример в LV2025
1 Никакого файла *.vim Аctor-ы у меня не требуют.
2 Скомпилированный AF у меня находится рядом с оригинальной AF библиотекой. Имена одинаковые, но расширения то разные.
3 Сообщения строятся без задавания лишних вопросов и выскакивания окон.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Artem.spb

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

Re: Запаковать Actor

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

Спасибо за ответы, работа сдвинулась со стопора.
taras_33 писал(а): 15 май 2025, 04:54 2 Скомпилированный AF у меня находится рядом с оригинальной AF библиотекой. Имена одинаковые, но расширения то разные.
Видимо, этот шаг сильно упрощает дальнейшие действия. Всё то, что у меня система требовала теперь находится без проблем.
Artem.spb

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

Re: Запаковать Actor

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

Что-то у меня сломалось.
1) есть несколько base и интерфейсов. Каждый отдельно запакован в библиотеку. Все, кроме AF лежат в /proj/data/
l1.png
l1.png (5.16 КБ) 2235 просмотров
2) делаю модуль для дебага, он наследует интерфейс и base. Этот модуль тоже собираю в .lvlibp
l2.png
l2.png (4.85 КБ) 2235 просмотров
Естесвенно при сборке все зависимости копируются в /build/ каталог.

3) переношу .lvlibp в /proj/modules/ но без зависимостей, потому что они и так в проекте.
И ещё, в конечной сборке планирую все зависимости хранить в /data/, а модули в /modules/

4) теперь пытаюсь запустить это из файла (файлов)
l3.png
Но программа ругается, что для этого придётся загрузить в память конфликтующие библиотеки, те самые базовые, но из других папок (где их на самом деле нет)
Ну и до кучи все эти собранные библиотеки ищут сборку AF в той же папке, а не в program files
l4.png
собственно вопрос, как исправить все эти зависимости, чтобы всё грузилось, откуда должно грузиться?
Artem.spb

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

Re: Запаковать Actor

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

В процессе трабл-шутинга нашёл эту статью
https://forums.ni.com/t5/Actor-Framewor ... -p/3776945
если кому-то понадобится, там
This is not a step-by-step tutorial but rather a bunch of examples on different Actor Framework concepts
однако,
I have created several Actor Framework examples that I want to share with you. They go from a basic example to an example with packed project library plugins.
даёт хорошее представление, как это надо делать (с поправкой на реальные интерфейсы, которые добавили позже, чем появился этот пример)

В моём случае ключевой галкой оказалась эта
l5.png
После этого предыдущие (родители) пакеты остались на месте и программа перестала грузить их откуда попало.
Artem.spb

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

Re: Запаковать Actor

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

Продолжаю эксперименты.
До этапа сборки exe всё выглядело прилично, но после сборки программа требует указать, где лежат библиотеки, которые лежат в data

Сделал простой пример, к сожалению LabVIEW25

001_typedef - проект для создания lvlibp с typdef
002_base_actor - актер, который использует typdef из 001
003_interface1- интерфейс, который также использует typdef из 001
004_app - финальное приложение, которое использует всё предыдущее: typdef и наследование от 002 + 003

Для повторения шагом надо AF библиотеку положить в папку NI, и дальше последовательно 1-2-3-4 собрать библиотеки в проектах.

Что делать? :banghead:
Вложения
Actor Framework.zip
(304.83 КБ) 33 скачивания
dependencies_example.zip
(211.34 КБ) 30 скачиваний
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 398
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 15 раз
Контактная информация:

Re: Запаковать Actor

Сообщение taras_33 »

Вообщем сильно не разбирался. Вот скриншоты главных акторов, Вашей и моей. У меня все lvlip находятся в Dependencies, Ваши вместе с главной. Может что с наследованием не так. Посмотрите мое первое сообщение (правда открыт проект плагина, поэтому main в иерархии нет). От Actor framework наследуется Root от него наследуются main и базовый (родитель для всех плагинов) У вас насколько я понял немного не так.
Screenshot 2025-07-02 154502.png
Screenshot 2025-07-02 154502.png (19.73 КБ) 1316 просмотров
Main_App.png
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 398
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 15 раз
Контактная информация:

Re: Запаковать Actor

Сообщение taras_33 »

В общем набросал ранее обещанный пример как в своих проектах я использую модульную архитектуру.
Артем с интерфейсами не работал, поэтому извиняйте...
Это только идея, поскольку все представлено ну уж в очень упрощенном виде... и так. Разархивуруйте и можно сразу запустить Test_PLL.exe чтобы увидеть результат.
Все сделано в LabVIEW 2025
Hierarchy.png
Hierarchy.png (10.63 КБ) 1242 просмотра
Папка 01_Root содержит корневой проект от скомпилированной ppl которого наследуются все остальные.
Папка 02_Base это родитель для всех плагинов
Две папки 03_Plugin - собственно сами плагины.
Папка Main - главная программа.
В папку Plugins нужно копировать скомпилированные библиотеки плагинов. Главная программа считывает содержимое
этой папки и формирует список из доступных модулей - плагинов, должна лежать рядом с *.exe Повторюсь вся идея в том, что не трогая главную программу *.exe, а где то в сторонке скомпилировать
только плагин (*.lvlibp) с необходимым UI и алгоритмом работы и затем поместить его в эту папку (чаще всего удаленно), где его подхватит
программа при последующем запуске и вставит в свою субпанель.

Каждая компиляция дублирует все библиотеки от которой наследуется, их можно автоматически удалять Post-Build Action, как это сделано в проектах с плагинами.
При открытии проектов выскакивают предупреждения... Ignore / Cancel. При первом запуске Main и выборе плагина выскочит окошко с
предложением добавить - нажмите Add плагин добавится в проект. В исполняемом файле никаких предупреждений не будет.
В общем вместо тысячи слов лучше один раз увидеть....
Вложения
Test_lvlibp.zip
(2.04 МБ) 25 скачиваний
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Artem.spb

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

Re: Запаковать Actor

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

И вот на самом интересном месте :crazy:
af_libp.jpg
При открытии вашего проекта mian выскакивает запрос, где брать base. После этого проект открывается и даже работает, но билд не открыть.

Интерфейсы не критичны, это всего лишь ещё один уровень наследования. Можно сказать, в вашем случае это Base.

Мне до сих пор не понят но, как разруливать конфликты.
1 = AF.lvlib, он лежит в папке NI
2 = root - наследует AF, после сборки AF.lvlib копируется туда же, где root.lvlib - тут у нас уже два клона AF
3..Base.. после сборки AF.lvlib + root.lvlib + base.lvlib лежат в одной папке - теперь AF три раза существует.
4 = plugin наследует Base и после сборки весь комплект в одном месте.

но в main 1..3 живут в одной папке, а плагины в другой. Как сделать так чтобы они не подрались?

Завтра попробую на свежую голову ещё раз собрать.
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 398
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 15 раз
Контактная информация:

Re: Запаковать Actor

Сообщение taras_33 »

Удалите plugin_1.lvlibp из проекта, сохраните и закройте проект. Откройте снова - желтые треугольники из зависимостей должны пропасть как и запрос где брать base. Хотя по-честному странно у меня компилится даже с этими треугольниками …. Эти конфликты возникают только при отладке main. Я с ними долго боролся потом плюнул - финальном продукте то все работает.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Artem.spb

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

Re: Запаковать Actor

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

Кажется, получилось.
Спасибо за советы и пример.
В проекте работает, exe библиотеку пока не хочет признавать.

Кстати, если кому-то интересно/актуально. AF вывели в разряд open source и теперь он на github живёт и обновляется через VIPM ( :labview: 20 и выше).
В частности, там структуру немного изменили, поэтому сборка lvlibp проходит теперь проще.
Artem.spb

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

Re: Запаковать Actor

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

И всё таки она не вертится.
В проекте разарботало, но в exe модули ломанные, буду сейчас крутить структура каталогов, чтобы починить.

Поэтомы пара вопросов.
pll.png
1 у вас разные модули из разных каталогов, как они не дерутся? Например, root два раза, и base должен был бу брать свой root из своего же каталога. Но это ладно.

2. При сборке плагинов у вас всё в один каталог складывается (ожидаемо), но в exe плагины лежат в plugin, а все зависимости в data. Как плагины их находят? У меня при загрузке плагино вони ломанные получаются, подозреваю именно из-за изменения путей.
Artem.spb

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

Re: Запаковать Actor

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

Починил, принудительно задав структуру в билде.
Вопрос, как у вас работает без этого остаётся открытым :)
folders.png
Ответить

Вернуться в «Модели программирования»