Присоединение входных данных к внешним входам через пользовательские входные отображения

В этом примере показано, как создать пользовательскую функцию отображения для инструмента Root Inport Mapper. Инструмент Root Inport Mapper связывает данные MAT-файлов с определенным входным портом на основе одного из этих критериев.

  • Port Order - Отображает в том же порядке, в котором он появляется в файле, на соответствующий номер порта.

  • Имя блока - Сопоставляет по наименованию переменной с соответствующим корневым входным портом с соответствующим именем блока.

  • Имя сигнала - Сопоставляет по наименованию переменной с соответствующим корневым входным портом с соответствующим именем сигнала.

  • Путь блока - Сопоставляет параметром BlockPath с соответствующим корневым входным портом с соответствующим пути блока.

  • Custom - Карты с использованием функции MATLAB.

Используйте пользовательские критерии отображения, если данные, которые вы пытаетесь сопоставить, не соответствуют ни одному из других критериев отображения.

Пользовательский сценарий отображения

Если комбинация входных данных и входных портов модели не соответствует критериям отображения Порядок, Block Name, Signal Name или Block Path, можно сделать одно из следующих:

  • Переименуйте входные данные в MAT-файл

  • Переименуйте входные порты в модели

  • Используйте пользовательский режим отображения

В этом примере показано, как написать пользовательскую функцию отображения.

Рабочий процесс, описанный ниже, включает

  • Создайте файл MATLAB, содержащий пользовательскую функцию отображения

  • Объявите имя пользовательской функции отображения, входы и выходы

  • Инициализируйте выход для присвоения возврата значения

  • Определите и реализуйте свой алгоритм отображения

  • Проверьте свой алгоритм отображения

Создайте новый файл функции MATLAB

Создайте файл функции MATLAB. Этот файл будет содержать вашу пользовательскую функцию отображения.

Объявление пользовательской функции отображения

Объявите пользовательское отображение имени функции и укажите входы и выходы. slexCustomMappingMyCustomMap является пользовательской функцией отображения в этом примере. Он объявляет входные параметры функции и выходы как определено ниже.

Исходные данные

  • modelName - Строка, содержащая имя модели.

  • signalNames - массив ячеек из строк, которые содержат имена переменных сигналов на карту

  • сигналы - массив ячеек данных сигналов, выровненных по signalNames таким образом, что signalNames {1} является именем переменной сигнала, сохраненного в сигналах {1}.

Выходы

  • inputMap - массив или скаляр объектов, которые являются результатом функции getRootInportMap.

Инициализация выхода

Инициализируйте значение переменного выхода inputMap. Для этого используйте getRootInportMap команда с пустым свойством, как показано на функции , взятой в качестве примера, slexCustomMappingMyCustomMap или в фрагменте кода ниже. Это инициализирует выходную переменную в пустую, так что значение может быть назначено выходу.

inputMap = getRootInportMap('empty');

Определите свой пользовательский алгоритм отображения

Вещи, о которых нужно подумать при определении пользовательского алгоритма отображения.

  • Каковы критерии для отображения сигналов с входным портом корневого уровня, например, соответствие BlockName совпадает с именем входного сигнала на имя входного блока корневого уровня.

  • Какие сведения необходимы для создания отображения.

  • Что происходит, если критерий отображения определяет, что нет соответствия между сигналом и входным портом корневого уровня.

Пример обращается к этим элементам по

  • Использование номера порта корневого уровня и имени сигнала для критериев отображения.

  • Использование служебной функции slexCustomMappingGetPortNames для получения имен входных блоков корневого уровня для предоставления в качестве входных данных вместе с variable'signalName| к getRootInportMap функция, которая создает отображение.

  • Включая логическое условие для обработки случая, когда нет соответствия между номером порта и именем сигнала.

Реализуйте свой алгоритм отображения

Далее реализуйте алгоритм отображения.

В реализации slexCustomMappingMyCustomMap номер входного порта корневого уровня является критерием отображения. Алгоритм получает этот номер порта из блока входного порта корневого уровня. Затем он получает числовые значения, добавленные к именам сигналов, которые передаются в функцию, и сравнивает номер порта с числовыми значениями.

ПРИМЕЧАНИЕ. В дополнение к реализации алгоритма отображения, вы также должны включать логический оператор для обработки ситуаций, когда сопоставление невозможно. Это делается функция , взятая в качестве примера, при помощи if оператор со isempty функция для определения возможности отображения.

Создайте отображение

Конечным шагом является использование getRootInportMap функция для создания пользовательской карты. The getRootInportMap функция использует пары Property-Value, чтобы создать пользовательскую карту. Свойствами являются:

  • model - Строка, которая представляет имя модели.

  • signalName - Строка или камера строк, которая содержит значение имени переменной сигнала на карту.

  • blockName - Строка или камера строк, содержащая значение имени блока порта, который будет сопоставлен.

Следующий код является примером этой функции. Этот же код появляется в функция , взятая в качестве примера, slexCustomMappingMyCustomMap.

inputMap = getRootInportMap(...
                        'model',modelName,...
                        'signalName',signalNames,...
                        'blockName',portNames);

Проверьте пользовательскую функцию отображения

Чтобы проверить пользовательскую функцию отображения в командной строке:

  1. Откройте модель, против которой вы хотите протестировать свою функцию.

  2. Создайте некоторые входные сигналы для поддержки модели.

  3. Вызовите пользовательскую функцию отображения с правильными входными параметрами.

  4. Проверьте ожидаемую входную строку для отправки в sim команда или для размещения в окне редактирования параметров конфигурации модели External Input String.

Выполните строки кода в следующем примере. Этот код использует пользовательскую функцию отображения, предоставленную в этом примере. Если функция пользовательской карты преуспеет, вы увидите разделенный запятыми список имен переменных, отображаемых в порядке номера порта, которому они назначены ('port1,port2').

load_system('slexAutotransRootInportsExample'); port1               =
timeseries(ones(10,1)*10); port2               =
timeseries(zeros(10,1)); inputMap            =
slexCustomMappingMyCustomMap('slexAutotransRootInportsExample',{'port1'
, 'port2'},{port1 , port2}); externalInputString =
getInputString(inputMap,'base');
close_system('slexAutotransRootInportsExample',0);

Если ваши сигналы находятся в Simulink .SimulationData. Набор данных, можно выполнить строки кода в следующем примере. Этот код использует пользовательскую функцию отображения, предоставленную в этом примере. Если функция пользовательского отображения завершается успешно, вы увидите разделенный списками , разделенными запятыми имен переменных, отображаемых в порядке номера порта, которому они назначены ('ds.getElement(1),port1,ds.getElement(2)').

load_system('slexAutotransRootInportsExample');
ds = Simulink.SimulationData.Dataset;
ds = ds.addElement( timeseries(ones(10,1)*10),'port1');
ds = ds.addElement( timeseries(zeros(10,1)),'port1');
inputMap            = slexCustomMappingMyCustomMap('slexAutotransRootInportsExample',{'ds'},{ ds });
externalInputString = getInputString(inputMap,'base');
close_system('slexAutotransRootInportsExample',0);