使用映射模式与Custom-Mapped外部输入
这个例子展示了如何实现一个自定义映射算法类似于模型映射模式。万博1manbetx它使用getSlRootInportMap
和getRootInportMap
函数来实现自定义映射。
这个示例假设您熟悉getRootInportMap
命令和根尺寸Mapper工具自定义映射功能。如果您不熟悉这些概念,阅读文档和审查有关的例子getRootInportMap
和自定义映射。
工作流
这个例子展示了如何使用一个内置的模型映射模式执行尽可能多的映射。万博1manbetx然后旗帜的根港口无法分配一个信号。使用自定义映射算法然后覆盖标记映射地图剩余的信号。实现这样一个解决方案,使用getSlRootInportMap创建一个自定义的映射函数。
这个示例使用的列表输入两种信号:
信号,使用仿真软件可以映射块名称映射模式。万博1manbetx
信号,使用仿真软件不能映射块名称映射模式。万博1manbetx你必须映射这些信号与一个自定义的映射模式。
假设下面的场景:
您想要使用一组信号作为输入到仿真软件模型。万博1manbetx
信号命名的变量名称匹配的块名称根级尺寸。
每个信号,使用此命名约定是在公差内。
每个信号的' x '字符以外的附加到它的名字被认为是宽容。
这个例子使用一个映射模式类似于模型块名称映射方法。万博1manbetx
root尺寸块名称是:
节气门
刹车
信号变量名称是:
Throttlex
刹车
输入映射到根级尺寸块在这个场景中,您需要一个自定义映射函数根尺寸映射器工具。下面的例子使用了AlmostBlockName自定义映射函数。
对于这个示例,您将使用slexAutotransRootInportsExample
模型来验证您的自定义映射函数。
声明自定义映射函数
声明函数名、输入和输出。要做到这一点,下面的代码片段复制并粘贴到AlmostBlockName.m MATLAB文件并保存文件。
函数inputMap = AlmostBlockName (modelName signalNames,信号)
得到仿真软件Bl万博1manbetxockName映射
接下来,地图的所有信号。要做到这一点,首先使用仿真软件的公差内的信号映射块名称映射模式,然后地图信号以外的宽容。万博1manbetx
公差内的信号映射到一个模型使用一个模型的映射模式,使用函数万博1manbetxgetSlRootInportMap
。这个函数返回inputMap
和一个向量的逻辑值。每个逻辑值表示成功或不成功的映射inputMap
一个信号。映射块名称,后插入以下代码行数的函数声明。
inputMap = getRootInportMap(“空”);如果~ bdIsLoaded modelName load_system (modelName);结束
[inputMap, hasASignal] = getSlRootInportMap(“模型”,modelName,…“MappingMode”、“BlockName’,……signalNames‘signalName’,‘signalValue’,信号);
找到失踪的输入信号
在前面的步骤中,您创建了一个映射使用一块名称映射模式。你现在必须占空inputMap
和inputMap (s)
没有关联到一个信号在公差内。这个函数getSlRootInportMap
标记这些信号与输出变量hasASignal
。要做到这一点:
检查
inputMap
变量。如果
inputMap
变量并不是空的,确定哪些元素inputMap
向量没有分配一个信号。要做到这一点,使用逻辑~hasASignal
向量如下所示。的emptyIndex
矢量现在包含一个逻辑真的意味着的地方inputMap
没有一个信号映射到它。复制并粘贴以下代码片段在调用
getSlRootInportMap
如果和结束前bdIsLoaded (modelName)
。
如果~ isempty (inputMap) emptyIndex = ~ hasASignal;结束
执行步骤1和2的代码片段。
完成映射
在前面的步骤中,您创建了一个逻辑向量emptyIndex
是否任何inputMap对象不相关的一个信号。如果emptyIndex向量的所有元素都是假的,你有一个完整的映射和在这一节中添加的代码不会被执行。
如果emptyIndex
向量包含至少一个值是正确的,你有inputMap
对象不相关联的一个信号。手动分配变量信号inputMap (s)。然后,重写inputMap
预期信号信号名称相匹配的名称:
在emptyIndex向量,发现所有的东西都是真的。这些条目指向
inputMap (s)
仍然需要被关联到一个信号。为每一个
inputMap
,使用“BlockName”属性的名称,尺寸的块inputMap
是分配给。添加一个“x”块名称的信号分配到的名称
inputMap
。比较结果signalNames变量单元阵列中的每一项。
如果找到匹配项,覆盖
inputMap
预期信号信号名称相匹配的名称。覆盖的inputMap
对象,使用getRootInportMap函数“InputMap”和“SignalName”属性。
{1}如果isa(信号,Simulink.万博1manbetxSimulationData.Dataset) signalNames ={1}信号.getElementNames ';结束
idxEmpty =找到(emptyIndex = = true);kEmpty = 1:长度(idxEmpty) idxOfEmpty = idxEmpty (kEmpty);destBlockName =得到(inputMap (idxOfEmpty),“BlockName”);outSideToleranceSig = [destBlockName ' x '];isAMatch = strcmp (signalNames outSideToleranceSig);如果任何(isAMatch) inputMap (idxOfEmpty) = getRootInportMap (“inputMap”,…inputMap (idxOfEmpty) SignalName, outSideToleranceSig);结束结束
验证自定义映射
验证您的自定义映射:
保存AlmostBlockName函数在MATLAB文件路径。
看到你的映射函数的结果,复制并粘贴以下代码片段MATLAB命令窗口。
modelName =“slexAutotransRootInportsExample”;Throttlex = timeseries (0 (10, 1));制动= timeseries ((10, 1));signalNames = {‘Throttlex’,‘刹车’};信号= {Throttlex、刹车};open_system (modelName);inputMap = AlmostBlockName (modelName signalNames,信号);inputStr = getInputString (inputMap '基地');close_system (modelName);
运行的代码片段后,变量inputStr
包含字符串“Throttlex、刹车”。
如果你在Simulink.SimulationDa万博1manbetxta信号。数据集,看到的结果映射函数,使用以下代码片段在MATLAB命令窗口。
modelName =“slexAutotransRootInportsExample”;Throttlex = timeseries (0 (10, 1));制动= timeseries ((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(“制动”)。