主要内容

使用自定义映射外部输入的映射模式

这个例子展示了如何实现一个类似于Simulink映射模式的自定义映射算法。万博1manbetx它使用getSlRootInportMap而且getRootInportMap函数来实现自定义映射。

在运行此示例之前,请确保您熟悉getRootInportMap命令和根导入映射器工具。有关更多信息,请参见映射根输入信号数据

工作流

这个例子展示了如何使用内置的Simulink映射模式来执行尽可能多的映射。万博1manbetx然后标记无法分配信号的根导入。然后,该算法用自定义映射覆盖标记的映射,以映射剩余的信号。要实现这样的解决方案,请使用getSlRootInportMap创建一个自定义映射函数。

这个例子使用了一个包含两种信号的输入列表:

  • 可以使用Simulink块名映射模式映射的信号。万博1manbetx

  • 不能使用Simulink块名映射模式映射的信号。万博1manbetx必须使用自定义映射模式映射这些信号。

假设以下场景:

  • 您希望使用一组信号作为Simulink模型的输入。万博1manbetx

  • 信号的命名使变量名与根级输入的块名匹配。

  • 使用此命名约定的每个信号都在允许范围内。

  • 每个在其名称后附加'x'字符的信号都被认为是超出容差的。

本例使用类似于Simulink块名映射方法的映射模式。万博1manbetx

根级导入块名称为:

  • 节气门

  • 刹车

信号变量名称为:

  • Throttlex

  • 刹车

在这个场景中,要将输入映射到根级导入块,需要为根导入Mapper工具提供一个自定义映射函数。这个例子使用了AlmostBlockName自定义映射函数。

对于本例,您将使用slexAutotransRootInportsExample模型来验证您的自定义映射函数。

声明自定义映射函数

声明函数名、输入和输出。为此,将以下代码片段复制并粘贴到MATLAB文件中,并将该文件保存为AlmostBlockName.m。

函数inputMap = AlmostBlockName(modelName, signalNames, signals)

获取Simuli万博1manbetxnk BlockName映射

接下来,映射所有信号。为此,首先使用Simulink块名映射模式映射公差内的所有信号,然后映射公差外的信号。万博1manbetx

若要使用其中一种Simulink映射模式将公差范围内的信号映射到模型,请使用此函数万博1manbetxgetSlRootInportMap.此函数返回inputMap和一个逻辑值的向量。的成功或不成功映射inputMap对着一个信号。要按块名进行映射,请在函数声明之后插入以下代码行。

inputMap = getRootInportMap('empty');if ~bdIsLoaded(modelName) load_system(modelName);结束
[inputMap, hassignal] = getSlRootInportMap('Model', modelName,…“MappingMode”、“BlockName’,……'signalName',signalNames, 'signalValue', signals);

找到缺失的输入信号

在上一步中,您使用块名映射模式创建了映射。你现在必须解释一个空inputMapinputMap (s)它们与耐受范围内的信号无关。这个函数getSlRootInportMap是否用输出变量标记了这些信号hasASignal.这样做:

  1. 检查inputMap变量。

  2. 如果inputMap变量不为空,确定其中的元素inputMap矢量没有被分配信号。要做到这一点,请在hasASignal向量如下所示。的emptyIndexVector现在包含一个逻辑向量,其中true表示inputMap没有信号映射到它。

  3. 控件的调用下面复制并粘贴以下代码段getSlRootInportMap在如果结束之前bdIsLoaded (modelName)

if ~isempty(inputMap) emptyIndex = ~ hassignal;结束

代码片段为您执行步骤1和步骤2。

完成映射

在前面的步骤中,您创建了一个逻辑向量emptyIndex查看是否有任何inputMap对象没有与信号关联。如果emptyIndex向量的所有元素都是假的,那么就有了一个完整的映射,本节中添加的代码将不会被执行。

如果emptyIndex向量至少包含一个真值,你有inputMap未与信号关联的对象。手动将变量信号分配给该inputMap。然后,重写inputMap使用与预期信号名称匹配的信号名称:

  1. 在emptyIndex向量中,找到所有为真的项。这些项目指向inputMap (s)这仍然需要与一个信号相关联。

  2. 为每一个inputMap,使用'BlockName'属性来获取导入块的名称inputMap被分配给。

  3. 在块名称后附加一个'x'以获得要分配给inputMap

  4. 将结果与signalNames变量单元格数组中的每个项进行比较。

  5. 如果找到匹配项,则重写inputMap使用与预期信号名称匹配的信号名称。要覆盖inputMap对象,使用getRootInportMap函数与'InputMap'和'SignalName'属性。

if isa(信号{1},'Simulin万博1manbetxk.SimulationData.Dataset') signalNames =信号{1}.getElementNames';结束
idxEmpty = find(emptyIndex==true);for kEmpty =1:长度(idxEmpty) idxOfEmpty = idxEmpty(kEmpty);destBlockName = get(inputMap(idxOfEmpty),'BlockName');outSideToleranceSig = [destBlockName 'x'];ismatch = strcmp(signalNames, outsidedetolerancesig);if any(ismatch) inputMap(idxOfEmpty) = getRootInportMap(' inputMap ',…inputMap (idxOfEmpty) SignalName, outSideToleranceSig);结束结束

自定义地图文件

当你完成时,文件AlmostBlockName。M应该类似于以下代码。

函数inputMap = AlmostBlockName(modelName, signalNames, signals) inputMap = getRootInportMap('empty');如果bdIsLoaded (modelName)
[inputMap, hassignal] = getSlRootInportMap('Model', modelName,…“MappingMode”、“BlockName’,……'signalName',signalNames, 'signalValue', signals);
if ~isempty(inputMap) emptyIndex = ~ hassignal;idxEmpty = find(emptyIndex==1);
if isa(信号{1},'Simulin万博1manbetxk.SimulationData.Dataset') signalNames =信号{1}.getElementNames';结束
for kEmpty =1:长度(idxEmpty) idxOfEmpty = idxEmpty(kEmpty);destBlockName = get(inputMap(idxOfEmpty),'BlockName');nonNominalSig = [destBlockName 'x'];ismatch = strcmp(signalNames, nonNominalSig);if any(ismatch) inputMap(idxOfEmpty) = getRootInportMap(' inputMap ',…inputMap (idxOfEmpty) SignalName, nonNominalSig);结束结束
结束结束

验证自定义映射

验证您的自定义映射:

  1. 将AlmostBlockName函数保存在MATLAB路径下的文件中。

  2. 要查看映射函数的结果,请将以下代码片段复制并粘贴到MATLAB命令窗口。

modelName = 'slexAutotransRootInportsExample';Throttlex =时间序列(零(10,1));制动=时间序列(ones(10,1));signalNames= {'Throttlex','Brake'};信号= {Throttlex,制动器};open_system (modelName);inputMap = AlmostBlockName(modelName, signalNames, signals);inputStr = getInputString(inputMap,'base');close_system (modelName);

运行代码段后,变量inputStr包含字符串'Throttlex,制动器'。

如果你的信号在Simulink.Simulatio万博1manbetxnData中。数据集,要查看映射函数的结果,请在MATLAB命令窗口中使用以下代码片段。

modelName = 'slexAutotransRootInportsExample';Throttlex =时间序列(零(10,1));制动=时间序列(ones(10,1));ds = 万博1manbetxSimulink.SimulationData.Dataset;Ds = Ds。addElement(Throttlex, 'Throttlex');Ds = Ds。addElement(刹车,'刹车');signalNames = {ds的};信号= {ds}; open_system(modelName); inputMap = AlmostBlockName(modelName, signalNames, signals); inputStr = getInputString(inputMap,'base'); close_system(modelName);

在Simulink.SimulationData中运行信号的代码片段之后。万博1manbetx数据集,变量inputStr包含字符串'ds.getElement('Throttlex'),ds.getElement('Brake')'。

另请参阅

|

相关的例子

更多关于