Запаковать Actor
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Запаковать Actor
Задача: сделать максимально модульную программу, чтобы новые запчасти добавлять через пакеты, не перекомпилируя весь 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 делаю.
Исходники не жалко, могу скинуть, там пока ничего секретного нет.
идея: "скомпилировать" 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
- professional
- Сообщения: 398
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 15 раз
- Контактная информация:
Re: Запаковать Actor
Я в некоторых проектах использую нечто похожее. Преследовал идею изменения внешнего вида и алгоритма работы отдельного модуля, без компиляции всего проекта — получилось.
Структура следующая, см скриншот — это проект отдельного модуля. Все скомпилировано в *.lvlip , включая сам Actor Framework. Модуль представляет собой UI с кнопками, графиками и прочей лабудой, причем у каждого модуля свои кнопки и графики. Создаешь новый UI, компилируешь и удаленно copy/paste в папку Plagins на таргет машине. Основная программа при запуске из этой папки создает список в Combobox. Юзер щелкнув в этом списке на строчку, останавливает старый (если он там был) и запускает новый модуль, который вставляется в SubPanel. См скриншот Для каждой PPL свой проект, хотя видел как нормальные люди работают в одном проекте со всем хозяйтсвом — очень удобно при отладке. Но переделывать не буду, поскольку уже все отлажено и работает.
Это проект основной программы на стадии отладки, в котором подгружены скомпилированные модули… break point хрен поставишь
Что не нравится: Запускаешь программу, выбираешь нужный модуль, работаешь с ним, выбираешь другой модуль, предыдущий удаляется из SubPanel и загружается новый. НО! Удаленный модуль из SubPanel остается в памяти. В моем случае не критично, размер модуля небольшой, основной код сосредоточен в Root и Main. Но факт остается фактом. Вот собственно как то так..
Структура следующая, см скриншот — это проект отдельного модуля. Все скомпилировано в *.lvlip , включая сам Actor Framework. Модуль представляет собой UI с кнопками, графиками и прочей лабудой, причем у каждого модуля свои кнопки и графики. Создаешь новый UI, компилируешь и удаленно copy/paste в папку Plagins на таргет машине. Основная программа при запуске из этой папки создает список в Combobox. Юзер щелкнув в этом списке на строчку, останавливает старый (если он там был) и запускает новый модуль, который вставляется в SubPanel. См скриншот Для каждой PPL свой проект, хотя видел как нормальные люди работают в одном проекте со всем хозяйтсвом — очень удобно при отладке. Но переделывать не буду, поскольку уже все отлажено и работает.
Это проект основной программы на стадии отладки, в котором подгружены скомпилированные модули… break point хрен поставишь

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!
So far, the Universe is winning!
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Re: Запаковать Actor
Так много вопросов, так мало ответов 
Это именно то, что мне надо и то, как я пытаюсь это сделать.
1) куда вы запрятали casting*.vim файл? У меня дочерние авторы требуют его, но запаковать в библиотеку его тоже невозможно, поэтому я копирую его рядом с библиотекой.
2) оригинальный актор на месте остался? не мешает при работе, система не подтягивает его вместо библиотеки по ошибке?
3) как обстоят дела с построением сообщений?

Это именно то, что мне надо и то, как я пытаюсь это сделать.
1) куда вы запрятали casting*.vim файл? У меня дочерние авторы требуют его, но запаковать в библиотеку его тоже невозможно, поэтому я копирую его рядом с библиотекой.
2) оригинальный актор на месте остался? не мешает при работе, система не подтягивает его вместо библиотеки по ошибке?
3) как обстоят дела с построением сообщений?
-
taras_33
- professional
- Сообщения: 398
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 15 раз
- Контактная информация:
Re: Запаковать Actor
Отлучился по бизнес делам. Нарисуюсь в пятницу. Если сильно не напрягут, то попробую набросать пример в LV2025
1 Никакого файла *.vim Аctor-ы у меня не требуют.
2 Скомпилированный AF у меня находится рядом с оригинальной AF библиотекой. Имена одинаковые, но расширения то разные.
3 Сообщения строятся без задавания лишних вопросов и выскакивания окон.
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!
So far, the Universe is winning!
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Re: Запаковать Actor
Спасибо за ответы, работа сдвинулась со стопора.
Видимо, этот шаг сильно упрощает дальнейшие действия. Всё то, что у меня система требовала теперь находится без проблем.
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Re: Запаковать Actor
Что-то у меня сломалось.
1) есть несколько base и интерфейсов. Каждый отдельно запакован в библиотеку. Все, кроме AF лежат в /proj/data/ 2) делаю модуль для дебага, он наследует интерфейс и base. Этот модуль тоже собираю в .lvlibp Естесвенно при сборке все зависимости копируются в /build/ каталог.
3) переношу .lvlibp в /proj/modules/ но без зависимостей, потому что они и так в проекте.
И ещё, в конечной сборке планирую все зависимости хранить в /data/, а модули в /modules/
4) теперь пытаюсь запустить это из файла (файлов) Но программа ругается, что для этого придётся загрузить в память конфликтующие библиотеки, те самые базовые, но из других папок (где их на самом деле нет)
Ну и до кучи все эти собранные библиотеки ищут сборку AF в той же папке, а не в program files собственно вопрос, как исправить все эти зависимости, чтобы всё грузилось, откуда должно грузиться?
1) есть несколько base и интерфейсов. Каждый отдельно запакован в библиотеку. Все, кроме AF лежат в /proj/data/ 2) делаю модуль для дебага, он наследует интерфейс и base. Этот модуль тоже собираю в .lvlibp Естесвенно при сборке все зависимости копируются в /build/ каталог.
3) переношу .lvlibp в /proj/modules/ но без зависимостей, потому что они и так в проекте.
И ещё, в конечной сборке планирую все зависимости хранить в /data/, а модули в /modules/
4) теперь пытаюсь запустить это из файла (файлов) Но программа ругается, что для этого придётся загрузить в память конфликтующие библиотеки, те самые базовые, но из других папок (где их на самом деле нет)
Ну и до кучи все эти собранные библиотеки ищут сборку AF в той же папке, а не в program files собственно вопрос, как исправить все эти зависимости, чтобы всё грузилось, откуда должно грузиться?
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Re: Запаковать Actor
В процессе трабл-шутинга нашёл эту статью
https://forums.ni.com/t5/Actor-Framewor ... -p/3776945
если кому-то понадобится, там
В моём случае ключевой галкой оказалась эта После этого предыдущие (родители) пакеты остались на месте и программа перестала грузить их откуда попало.
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.
В моём случае ключевой галкой оказалась эта После этого предыдущие (родители) пакеты остались на месте и программа перестала грузить их откуда попало.
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Re: Запаковать Actor
Продолжаю эксперименты.
До этапа сборки 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 собрать библиотеки в проектах.
Что делать?
До этапа сборки 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 собрать библиотеки в проектах.
Что делать?

- Вложения
-
Actor Framework.zip
- (304.83 КБ) 33 скачивания
-
dependencies_example.zip
- (211.34 КБ) 30 скачиваний
-
taras_33
- professional
- Сообщения: 398
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 15 раз
- Контактная информация:
Re: Запаковать Actor
Вообщем сильно не разбирался. Вот скриншоты главных акторов, Вашей и моей. У меня все lvlip находятся в Dependencies, Ваши вместе с главной. Может что с наследованием не так. Посмотрите мое первое сообщение (правда открыт проект плагина, поэтому main в иерархии нет). От Actor framework наследуется 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!
So far, the Universe is winning!
-
taras_33
- professional
- Сообщения: 398
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 15 раз
- Контактная информация:
Re: Запаковать Actor
В общем набросал ранее обещанный пример как в своих проектах я использую модульную архитектуру.
Артем с интерфейсами не работал, поэтому извиняйте...
Это только идея, поскольку все представлено ну уж в очень упрощенном виде... и так. Разархивуруйте и можно сразу запустить Test_PLL.exe чтобы увидеть результат.
Все сделано в LabVIEW 2025 Папка 01_Root содержит корневой проект от скомпилированной ppl которого наследуются все остальные.
Папка 02_Base это родитель для всех плагинов
Две папки 03_Plugin - собственно сами плагины.
Папка Main - главная программа.
В папку Plugins нужно копировать скомпилированные библиотеки плагинов. Главная программа считывает содержимое
этой папки и формирует список из доступных модулей - плагинов, должна лежать рядом с *.exe Повторюсь вся идея в том, что не трогая главную программу *.exe, а где то в сторонке скомпилировать
только плагин (*.lvlibp) с необходимым UI и алгоритмом работы и затем поместить его в эту папку (чаще всего удаленно), где его подхватит
программа при последующем запуске и вставит в свою субпанель.
Каждая компиляция дублирует все библиотеки от которой наследуется, их можно автоматически удалять Post-Build Action, как это сделано в проектах с плагинами.
При открытии проектов выскакивают предупреждения... Ignore / Cancel. При первом запуске Main и выборе плагина выскочит окошко с
предложением добавить - нажмите Add плагин добавится в проект. В исполняемом файле никаких предупреждений не будет.
В общем вместо тысячи слов лучше один раз увидеть....
Артем с интерфейсами не работал, поэтому извиняйте...
Это только идея, поскольку все представлено ну уж в очень упрощенном виде... и так. Разархивуруйте и можно сразу запустить Test_PLL.exe чтобы увидеть результат.
Все сделано в LabVIEW 2025 Папка 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!
So far, the Universe is winning!
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Re: Запаковать Actor
И вот на самом интересном месте
При открытии вашего проекта 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 живут в одной папке, а плагины в другой. Как сделать так чтобы они не подрались?
Завтра попробую на свежую голову ещё раз собрать.

Интерфейсы не критичны, это всего лишь ещё один уровень наследования. Можно сказать, в вашем случае это 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
- professional
- Сообщения: 398
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 15 раз
- Контактная информация:
Re: Запаковать Actor
Удалите 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!
So far, the Universe is winning!
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Re: Запаковать Actor
Кажется, получилось.
Спасибо за советы и пример.
В проекте работает, exe библиотеку пока не хочет признавать.
Кстати, если кому-то интересно/актуально. AF вывели в разряд open source и теперь он на github живёт и обновляется через VIPM (
20 и выше).
В частности, там структуру немного изменили, поэтому сборка lvlibp проходит теперь проще.
Спасибо за советы и пример.
В проекте работает, exe библиотеку пока не хочет признавать.
Кстати, если кому-то интересно/актуально. AF вывели в разряд open source и теперь он на github живёт и обновляется через VIPM (

В частности, там структуру немного изменили, поэтому сборка lvlibp проходит теперь проще.
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Re: Запаковать Actor
И всё таки она не вертится.
В проекте разарботало, но в exe модули ломанные, буду сейчас крутить структура каталогов, чтобы починить.
Поэтомы пара вопросов. 1 у вас разные модули из разных каталогов, как они не дерутся? Например, root два раза, и base должен был бу брать свой root из своего же каталога. Но это ладно.
2. При сборке плагинов у вас всё в один каталог складывается (ожидаемо), но в exe плагины лежат в plugin, а все зависимости в data. Как плагины их находят? У меня при загрузке плагино вони ломанные получаются, подозреваю именно из-за изменения путей.
В проекте разарботало, но в exe модули ломанные, буду сейчас крутить структура каталогов, чтобы починить.
Поэтомы пара вопросов. 1 у вас разные модули из разных каталогов, как они не дерутся? Например, root два раза, и base должен был бу брать свой root из своего же каталога. Но это ладно.
2. При сборке плагинов у вас всё в один каталог складывается (ожидаемо), но в exe плагины лежат в plugin, а все зависимости в data. Как плагины их находят? У меня при загрузке плагино вони ломанные получаются, подозреваю именно из-за изменения путей.
-
- professor
- Сообщения: 3593
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 194 раза
- Контактная информация:
Re: Запаковать Actor
Починил, принудительно задав структуру в билде.
Вопрос, как у вас работает без этого остаётся открытым
Вопрос, как у вас работает без этого остаётся открытым
