exponenta event banner

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

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

  • Port Order (Порядок портов) - сопоставляет в порядке, указанном в файле, соответствующий номер порта.

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

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

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

  • Пользовательский (Custom) - отображение с помощью функции MATLAB.

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

Сценарий пользовательского сопоставления

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

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

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

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

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

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

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

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

  • Инициализация выходных данных для присвоения возвращаемого значения

  • Определение и внедрение алгоритма сопоставления

  • Проверка алгоритма сопоставления

Создание нового файла функции 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);

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

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

  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.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);