В этом примере показано, как создать пользовательскую функцию сопоставления для инструмента сопоставления корневого ввода. Средство сопоставления корневых входов связывает данные MAT-файла с определенным портом ввода на основе одного из этих критериев.
Port Order (Порядок портов) - сопоставляет в порядке, указанном в файле, соответствующий номер порта.
Имя блока - сопоставляет имя переменной соответствующему корневому входу с соответствующим именем блока.
Signal Name (Имя сигнала) - сопоставляет имя переменной соответствующему корневому входу с соответствующим именем сигнала.
Путь блока - сопоставляется параметром BlockPath с соответствующим корневым входом с соответствующим путем блока.
Пользовательский (Custom) - отображение с помощью функции MATLAB.
Используйте пользовательские критерии сопоставления, если данные, которые вы пытаетесь сопоставить, не соответствуют ни одному из других критериев сопоставления.
Если комбинация входных данных и входных портов модели не соответствует критериям сопоставления «Порядок портов», «Имя блока», «Имя сигнала» или «Путь блока», можно выполнить одно из следующих действий.
Переименование входных данных в MAT-файле
Переименование входных портов модели
Использовать пользовательский режим сопоставления
В этом примере показано, как записать пользовательскую функцию сопоставления.
Поток операций, описанный ниже, включает
Создание файла MATLAB, содержащего пользовательскую функцию сопоставления
Объявление имени пользовательской функции сопоставления, входов и выходов
Инициализация выходных данных для присвоения возвращаемого значения
Определение и внедрение алгоритма сопоставления
Проверка алгоритма сопоставления
Создайте файл функции MATLAB. Этот файл будет содержать пользовательскую функцию сопоставления.
Объявите имя пользовательской функции сопоставления и укажите входы и выходы. slexCustomMappingMyCustomMap является пользовательской функцией сопоставления в этом примере. Он объявляет входы и выходы функции, как определено ниже.
Исходные данные
modelName - строка, содержащая имя модели.
signalNames - массив ячеек строк, содержащих переменные имена отображаемых сигналов.
signalNames - массив ячеек сигнальных данных, выровненных с signalNames, так что signalNames {1} - это имя переменной сигнала, хранящегося в сигналах {1}.
Продукция
inputMap - массив или скаляр объектов, являющихся результатом функции getRootInportMap.
Инициализируйте значение выходной переменной inputMap. Для этого используйте getRootInportMap с пустым свойством, как показано в примере функции slexCustomMappingMyCustomMap или в приведенном ниже фрагменте кода. При этом выходная переменная инициализируется как пустая, так что выходному значению может быть присвоено значение.
inputMap = getRootInportMap('empty');Вещи, о которых нужно думать при определении пользовательского алгоритма сопоставления.
Каковы критерии сопоставления сигналов с входным портом корневого уровня, например, сопоставление BlockName соответствует имени входного сигнала и имени входного блока корневого уровня.
Какая информация необходима для создания сопоставления.
Что произойдет, если критерии сопоставления определят, что нет совпадения между входным сигналом и корневым уровнем.
В примере рассматриваются эти элементы по
Использование номера порта корневого уровня и имени сигнала для критериев сопоставления.
Использование функции утилиты slexCustomMappingGetPortNames для получения имен блоков ввода на корневом уровне для ввода вместе с переменной 'signalName | в getRootInportMap которая создает сопоставление.
Включает логическое условие для обработки случая, когда нет совпадения между номером порта и именем сигнала.
Затем выполните алгоритм сопоставления.
В реализации slexCustomMappingMyCustomMap критерием сопоставления является номер порта ввода корневого уровня. Алгоритм получает этот номер порта из блока ввода корневого уровня. Затем он получает числовые значения, добавляемые к именам сигналов, которые передаются в функцию, и сравнивает номер порта с числовыми значениями.
ПРИМЕЧАНИЕ: В дополнение к реализации алгоритма отображения необходимо также включить логический оператор для обработки ситуаций, когда отображение невозможно. Функция примера выполняет это с помощью if оператор с isempty для определения возможности выполнения сопоставления.
Последним шагом является использование getRootInportMap для создания пользовательской карты. getRootInportMap для создания пользовательской карты функция использует пары Свойство-Значение. Свойства:
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.CharingData.Dataset, можно выполнить строки кода в следующем примере. В этом коде используется пользовательская функция сопоставления, представленная в этом примере. При успешном выполнении пользовательской функции сопоставления отображается список имен переменных, разделенных запятыми, в порядке номеров портов, которым они назначены ('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);