В этом примере показано, как создать пользовательскую функцию отображения для инструмента Root Inport Mapper. Инструмент Root Inport Mapper связывает данные MAT-файлов с определенным входным портом на основе одного из этих критериев.
Port Order - Отображает в том же порядке, в котором он появляется в файле, на соответствующий номер порта.
Имя блока - Сопоставляет по наименованию переменной с соответствующим корневым входным портом с соответствующим именем блока.
Имя сигнала - Сопоставляет по наименованию переменной с соответствующим корневым входным портом с соответствующим именем сигнала.
Путь блока - Сопоставляет параметром BlockPath с соответствующим корневым входным портом с соответствующим пути блока.
Custom - Карты с использованием функции MATLAB.
Используйте пользовательские критерии отображения, если данные, которые вы пытаетесь сопоставить, не соответствуют ни одному из других критериев отображения.
Если комбинация входных данных и входных портов модели не соответствует критериям отображения Порядок, Block Name, Signal Name или Block Path, можно сделать одно из следующих:
Переименуйте входные данные в MAT-файл
Переименуйте входные порты в модели
Используйте пользовательский режим отображения
В этом примере показано, как написать пользовательскую функцию отображения.
Рабочий процесс, описанный ниже, включает
Создайте файл 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);
Чтобы проверить пользовательскую функцию отображения в командной строке:
Откройте модель, против которой вы хотите протестировать свою функцию.
Создайте некоторые входные сигналы для поддержки модели.
Вызовите пользовательскую функцию отображения с правильными входными параметрами.
Проверьте ожидаемую входную строку для отправки в 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);