主要内容

使用转发表维护库块的兼容性

转发表允许您检查对库中块的更改是否会破坏模型,如果您已经保存了使用旧版本的库块的模型。转发表可以帮助用户在修改库块的路径、名称、添加、删除、重命名参数时,保持库块的兼容性。欲了解更多信息,创建自定义库

创建一个转发表条目,用于将旧的库块映射到新的库块。当您打开模型时,到旧库块的链接将自动更新,而不会丢失数据或功能。转发表在打开模型、关闭模型或执行add_blockreplace_block命令。

创建转发表条目时:

  • 重命名一个块。

  • 将一个块从一个库移动到另一个库。

  • 从块中添加或删除参数。

  • 拆分块的功能。

重命名块的转发表表项

考虑一个例子,其中块名在库中testlib被重命名为魔法石,第1章ss2

  1. 打开上锁的图书馆Lib1

  2. 在“库”窗口中的图书馆选项卡上,单击锁库.库现在已解锁,可以进行编辑。

  3. 建模选项卡上,单击图书馆的性质.的图书馆的性质对话框。

  4. 单击转发表选项卡。

  5. 单击添加新条目。转发表中新增一行。

  6. 中指定旧块的名称旧块路径中对应的新块路径新建块路径.如果您不知道路径,请选择模型中的块,然后单击得到gcb按钮。块的路径会自动填充到相应的列中。

在转发表中创建旧路径到新路径的映射。现在,打开一个包含到库的链接的模型。到模型中旧库块的链接将自动更新。可以使用表上方的搜索栏筛选表内容。您可以按升序或降序对列进行排序。还可以根据列的值对列进行分组。

为库块分配版本号

版本列时,可以为库块指定版本号。

如果旧块名和新块名相同,转发表自动填充版本号。库版本的初始值LibraryVersion是由ModelVersion属性在创建库链接时的。对库块的任何后续更新都将更新库版本以匹配库的模型版本。

版本号:

  • 必须为数值。

  • 必须是格式的吗< major_version >< minor_version >当新旧块路径相同时。

  • 不能有多个点符号。例如,版本号1.3是可以接受的。版本号1.3.1是不可接受的。

  • 当使用转发表将一个库块从一个库移动到另一个库时,格式并不重要。

从一个库移动块到另一个库

考虑一个例子,其中块魔法石,第1章testlib1testlib2”。本例中的转发表条目如下所示:

将块从一个库移动到另一个库

从块中添加或删除参数

考虑一个例子,其中获得参数的魔法石,第1章在图书馆testlib和其他两个参数初始条件而且延迟的长度都加进去了。

添加或删除参数

为了处理这个变化,我们使用转换函数。转换函数纠正了新旧库链接之间参数的不匹配,从而确保库链接继续工作。定义转换函数可以使用.m的函数文件,然后调用转换函数的列转发表

链接块包含以名称-值参数形式的块参数实例,以实例化块。此实例数据传递给转换函数为InstanceData连同转发表入口。此数据存储为结构体字段。

创建库块的版本时,参数将从InstanceData.在本例中,InstanceData在拆卸获得参数,加上初始条件和延迟长度后,看起来像这样

之前:

“RTWMemSecFuncInitTerm”“从模型继承”“RTWMemSecFuncExecute”“从模型继承”“RTWMemSecDataConstants”“从模型继承”“RTWMemSecDataInternal”“从模型继承”“RTWMemSecDataParameters”“从模型继承”“ContentPreviewEnabled”“上”“获得”' 0 '

后:

“RTWMemSecFuncInitTerm”“从模型继承”“RTWMemSecFuncExecute”“从模型继承”“RTWMemSecDataConstants”“从模型继承”“RTWMemSecDataInternal”“从模型继承”“RTWMemSecDataParameters”“从模型继承”“ContentPreviewEnabled”“上”“DelayLength”' 1 '“InitialCondition”' 0 '

这就是变换函数的语法。

函数outData = TransformationFcn(inData)

在这个函数语法中:

  • inData结构是否包含字段ForwardingTableEntry而且InstanceDataForwardingTableEntry也是一种结构。

    • ForwardingTableEntry包含块的旧名称、新名称、旧路径和新路径。类的成员,请参考该代码访问ForwardingTableEntry

  • outData结构是否包含字段NewInstanceData而且NewBlockPath

从块中添加或删除参数:

  1. 获取实例数据和转发表表项。

  2. 提取名称-值对和块名称的列表。

  3. 获取旧的和新的块名称。

  4. 检查新旧块名称是否相同。如果是,则提取该块的版本。

  5. 检查旧版本是否为1.1,新版本是否为1.2。然后,删除获得参数并添加参数延迟的长度而且初始条件

请注意

对于一个库或块,只能有一个转换函数。但是,您可以有多个函数。

要添加或删除参数,请使用此转换函数。

函数[outData] = txFcnTestlib(inData) outData.使用实例NewBlockPath =;outData。NewInstanceData = [];获取其中的链接块实例数据和转发表项函数被调用instanceData = inData.InstanceData;forwardingTableEntry = inData.ForwardingTableEntry;获取名称值对和块名称列表[ParamNames{1:length(instanceData)}] = instanceData. name;获取新旧块路径或简单名称oldName = forwardingTableEntry。(“__slOldName__”);newName = forwardingTableEntry。(“__slNewName__”);%如果块名称相同,并且它的子系统块在库中如果比较字符串(oldName新名称)从转发表中获取新旧块版本oldVer = forwardingTableEntry。(“__slOldVersion__”);newVer = forwardingTableEntry。(“__slNewVersion__”);不同版本的转发表项可以有单独的%条目。这里,对于转发表中的单个条目,即。% 1.2->1.3或1.3->2.0,我们有单独的转换做一个% TX Fcn用于一个库或块。如果比较字符串(oldName“testlib(魔法石,第1章”%转发相同的块名ss1如果oldVer = =“1.1”&& newVer ==“1.2”移除增益参数如果(ismember (“获得”, ParamNames))(i = 1:length(instanceData))如果(比较字符串(instanceData(我)。的名字,“获得”) == true) instanceData(i) = [];打破结束结束结束添加延迟长度参数如果(ismember (“DelayLength”, ParamNames))(i = 1:length(instanceData))如果(比较字符串(instanceData(我)。的名字,“价值”) == true) instanceData(i)。值=“5”打破结束结束其他的instanceData(+ 1)结束。Name =“DelayLength”;instanceData(结束)。值=' 1 '结束添加初始条件参数如果(ismember (“InitialCondition”, ParamNames))(i = 1:length(instanceData))如果(比较字符串(instanceData(我)。的名字,“InitialCondition”) == true) instanceData(i)。值=' 0 '打破结束结束其他的instanceData(+ 1)结束。Name =“InitialCondition”;instanceData(结束)。值=' 0 '结束elseif(oldVer = =“1.2”&& newVer ==“1.3”做1.2到1.3版本的特定更改elseif(oldVer = =“1.3”&& newVer ==“2.0”做1.3到2.0版本的特定更改其他的%做不适用于任何版本的默认更改%要求结束elseif比较字符串(oldName“ss2 testlib /”版本升级后的块ss2转发结束elseif比较字符串(oldName“testlib / oldblk”) && strcmp(newName,“testlib2 / newblk”%块移动到新库或只是块在相同的重命名% library,这里没有选中版本。做变换是%要求,即是块已修改,而重命名或移动%到新库。elseif比较字符串(oldName“testlib / blkX”) && isempty(newName)我们将区块分成2个不同的区块。因此,保持fwd表中% newName为空。使用其中一个块参数%实例数据(所有块参数的名称-值对)决定如何分配以及分配什么。获取我们感兴趣的参数的索引,即参数Xi = find(contains({实例数据。名称},“X”),真正的);%根据它的值,进行块分割开关(instanceData(我)value)情况下“op1”新名称=“newlibX / blkX”删除现有参数或添加新参数或修改现有参数%参数等等。情况下“《凤凰社》第2章”新名称=“newlibY / blkX”否则newName = oldName;结束结束返回新的实例数据和新的块路径outData。NewInstanceData = instanceData;outData。NewBlockPath = newName;结束

分割块功能

拆分块的功能包括添加、删除或修改块的现有参数,并将其添加到新的块中。拆分一个块的功能:

  1. 离开新名称参数是空的。

  2. 获取参数的索引和值。

  3. 根据块的值拆分块。

  4. 返回NewBlockPath随着更新InstanceData如果需要。

创建掩码参数别名

如果重命名掩码参数,则必须确保现有的MATLAB®使用旧参数名的脚本将继续工作。为了检查兼容性,可以为掩码参数名称创建别名。别名允许您更改库块中掩码参数的名称,而不必在现有模型中重新创建到该块的链接。

对象的掩码块编辑参数。此参数的掩码参数名编辑参数是p1

MaskObj = 金宝appSimulink.Mask.get(gcb));hEdit = MaskObj.getParameter(“p1”);hEdit =%带有属性的MaskParameter:类型:“编辑”TypeOptions: {0×1 cell}“p1”提示:“p1”值:' 0 '评估:“上”可调:“上”NeverSave:“关闭”隐藏:“关闭”启用:“上”可见:“上”提示:“上”回调函数:别名:

注意编辑掩码参数没有别名。要为掩码参数添加别名,请为别名掩码参数属性。

MaskObj。别名=“爸爸”

您可以使用掩码参数名称或别名对掩码参数进行函数调用。例如,你可以使用Set_param (gcb, 'p1, '10)(掩码参数名)或Set_param (gcb, 'pa, '10)(掩码参数别名)来设置编辑面具参数。

相关的话题