使用自定义映射外部输入的映射模式
这个例子展示了如何实现一个类似于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);
找到缺失的输入信号
在上一步中,您使用块名映射模式创建了映射。你现在必须解释一个空inputMap
和inputMap (s)
它们与耐受范围内的信号无关。这个函数getSlRootInportMap
是否用输出变量标记了这些信号hasASignal
.这样做:
检查
inputMap
变量。如果
inputMap
变量不为空,确定其中的元素inputMap
矢量没有被分配信号。要做到这一点,请在hasASignal
向量如下所示。的emptyIndex
Vector现在包含一个逻辑向量,其中true表示inputMap
没有信号映射到它。控件的调用下面复制并粘贴以下代码段
getSlRootInportMap
在如果结束之前bdIsLoaded (modelName)
.
if ~isempty(inputMap) emptyIndex = ~ hassignal;结束
代码片段为您执行步骤1和步骤2。
完成映射
在前面的步骤中,您创建了一个逻辑向量emptyIndex
查看是否有任何inputMap对象没有与信号关联。如果emptyIndex向量的所有元素都是假的,那么就有了一个完整的映射,本节中添加的代码将不会被执行。
如果emptyIndex
向量至少包含一个真值,你有inputMap
未与信号关联的对象。手动将变量信号分配给该inputMap。然后,重写inputMap
使用与预期信号名称匹配的信号名称:
在emptyIndex向量中,找到所有为真的项。这些项目指向
inputMap (s)
这仍然需要与一个信号相关联。为每一个
inputMap
,使用'BlockName'属性来获取导入块的名称inputMap
被分配给。在块名称后附加一个'x'以获得要分配给
inputMap
.将结果与signalNames变量单元格数组中的每个项进行比较。
如果找到匹配项,则重写
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);结束结束
结束结束
验证自定义映射
验证您的自定义映射:
将AlmostBlockName函数保存在MATLAB路径下的文件中。
要查看映射函数的结果,请将以下代码片段复制并粘贴到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')'。
另请参阅
getRootInportMap
|getSlRootInportMap