Создание собственных переменных в run-time

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума
joonio
interested
interested
Сообщения: 8
Зарегистрирован: 09 апр 2014, 12:25
Версия LabVIEW: 13.1
Откуда: Екатеринбург
Контактная информация:

Создание собственных переменных в run-time

Сообщение joonio »

Добрый день!

Требуется дать возможность пользователю создавать свои переменные во время выполнения. Причем теоритически данные могут быть как простых типов (int, string и т.п) так и сложных(cluster, vaweform).

Была идея реализовать внутреннюю структуру с помощью массива с типом variant, но возникает вопрос как сохранить совместимость с уже существующими функциями, например если в варианте лежит кластер с нумериками то теоритически его можно сложить с кластером такого же типа, но функция сложения не работает с типом данных вариант?
Можно ли сделать так, чтобы забота о типе лежала на labview, а не перебирать все типы вручную и выполнять действие если тип подходит? Также хотелось бы вызывать функции из библиотек и подставлять туда значения из этого массива.

Есть у кого-нибудь идеи как реализовать такое?
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5467
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 88 раз

Re: Создание собственных переменных в run-time

Сообщение IvanLis »

Автоматом наверное не получится.

Можно написать полиморфные функции, которые в зависимости от типа входных данных будут работать по разному, если делать проще, то Case. Но этот тип в любом случае необходимо предварительно определить.

Как правило при передаче разнородных данных, делают это в кластере, т.е.:
1 параметр определяет тип данных и что с ним делать
2 параметр Variant в который и пихают данные

При необходимости можно сделать массив кластеров.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Создание собственных переменных в run-time

Сообщение Borjomy_1 »

То, что вы хотите, относится уже к функциям компилятора. Т.е вам самому придется разбирать переменные и определять алгоритмы обработки. Это в общем случае (что может запретить пользователю в таком случае попытаться waveform сложить со строкой?). Если вы определите границы возможностей, тогда уже можно говорить о практической реализации. В принципе, Variant можно разобрать на составные, если его покопаться в его структуре, которую можно выдрать с помощью Variant To Flattened String, однако тут могут возникнуть сложности, ибо открытой информации нет. Более надежно описывать структуру Variant через аттрибуты. Ну тогда уже вам определять список поддерживаемых типов, уровень вложенности и прочее.
joonio
interested
interested
Сообщения: 8
Зарегистрирован: 09 апр 2014, 12:25
Версия LabVIEW: 13.1
Откуда: Екатеринбург
Контактная информация:

Re: Создание собственных переменных в run-time

Сообщение joonio »

IvanLis, А если есть необходимость со временем расширять набор типов, то и все функции придется дописывать и компилировать поновой?
Последний раз редактировалось joonio 11 июл 2014, 09:04, всего редактировалось 1 раз.
joonio
interested
interested
Сообщения: 8
Зарегистрирован: 09 апр 2014, 12:25
Версия LabVIEW: 13.1
Откуда: Екатеринбург
Контактная информация:

Re: Создание собственных переменных в run-time

Сообщение joonio »

Borjomy_1, Так вот с уровнями вложенности и проблема... У меня еще получается представить тип кластер как дерево... но как потом передать это дерево в функцию dll как структуру я не представляю
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1338
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 44 раза
Контактная информация:

Re: Создание собственных переменных в run-time

Сообщение AndreyDmitriev »

joonio писал(а):Borjomy_1, Так вот с уровнями вложенности и проблема... У меня еще получается представить тип кластер как дерево... но как потом передать это дерево в функцию dll как структуру я не представляю
У вас какая-то мегасложная архитектура. Как бы то ни было, можно сделать Flatten to XML, передать строку в DLL, ну и парсить её там - это уже дело техники. Обратно отдавать результат тоже XML строкой ну и преводить обратно в структуры LabVIEW через Unflatten. Можно и Flatten to String использовать, но тут разбор такой строки будет чуть сложнее.
joonio
interested
interested
Сообщения: 8
Зарегистрирован: 09 апр 2014, 12:25
Версия LabVIEW: 13.1
Откуда: Екатеринбург
Контактная информация:

Re: Создание собственных переменных в run-time

Сообщение joonio »

AndreyDmitriev, Проблема в том, что зачастую библиотеки сторонние и входные параметры функций уже описаны заранее. Если бы библиотеки писал я другое дело.

Необходим аналог того, что происходит при добавлении на блок диаграмму объекта "call library function node" только в runtime. Т.е пользователь создает переменную, с которой он может производить конкретные манипуляции: сложение, вычитание, деление и т. п. для чисел, конкатенацию, извлечение подстроки для строк, операции булевой алгебры для типа boolean, также можно складывать массивы и кластеры чисел и т.д . А потом с этими переменными в качестве параметров вызывать функции из уже готовых DLL динамически.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Создание собственных переменных в run-time

Сообщение Borjomy_1 »

Хотелось-бы знать, как вы собираетесь проверять допустимость параметров при вызове dll. Как вы собираетесь разруливать ситуацию, когда пользователь создает кластер с разнотипными данными, а dll, например, в качестве параметра требует только число?
joonio
interested
interested
Сообщения: 8
Зарегистрирован: 09 апр 2014, 12:25
Версия LabVIEW: 13.1
Откуда: Екатеринбург
Контактная информация:

Re: Создание собственных переменных в run-time

Сообщение joonio »

Borjomy_1, Соответствие типов при вызове сторонних библиотек остается на пользователе
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Создание собственных переменных в run-time

Сообщение Borjomy_1 »

Каким образом вам доступна информация о типах параметров, при вызове, сторонних библиотек?
joonio
interested
interested
Сообщения: 8
Зарегистрирован: 09 апр 2014, 12:25
Версия LabVIEW: 13.1
Откуда: Екатеринбург
Контактная информация:

Re: Создание собственных переменных в run-time

Сообщение joonio »

Ну как минимум описание библиотеки должно быть иначе просто напросто какой смысл её использовать
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Создание собственных переменных в run-time

Сообщение Borjomy_1 »

Передать кластер в структуру dll возможно только разбирая переменную, созданную пользователем, вручную и формируя байтовый массив. А вот что делать с ним дальше?...
joonio
interested
interested
Сообщения: 8
Зарегистрирован: 09 апр 2014, 12:25
Версия LabVIEW: 13.1
Откуда: Екатеринбург
Контактная информация:

Re: Создание собственных переменных в run-time

Сообщение joonio »

Borjomy_1, Массив обрабатывается некой библиотечной функцией и она возвращает какое либо значение, которое необходимо парсить в тип данных Labview...Как сформировать байтовый массив понятно, а вот как подставить в качестве параметра не очень... Т.к. стандартных средств для передачи параметров динамически не предусмотрено... Есть лишь возможность задать их статически на этапе разработки....
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Создание собственных переменных в run-time

Сообщение dadreamer »

joonio, напишите свою библиотеку-враппер, передавайте в неё созданные пользователем параметры (например, байтовые массивы), порядок их следования, выбранную функцию, соглашение о вызове, а затем во враппере пробуете вызвать эту функцию с параметрами. Но если пользователь ошибётся хотя бы в соглашении о вызове, то вся ваша программа упадёт. :rtfm:
joonio
interested
interested
Сообщения: 8
Зарегистрирован: 09 апр 2014, 12:25
Версия LabVIEW: 13.1
Откуда: Екатеринбург
Контактная информация:

Re: Создание собственных переменных в run-time

Сообщение joonio »

Всем спасибо за идеи! Буду писать wrapper!
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Общие»