Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

转换表

在编辑现有的库模块时,如果有模型在使用该模块的旧版本,您需要确保所做的更改不会对模型造成破坏。库模块中的此类编辑包括更改库路径、更改库模块名称或者添加、删除或重命名参数。

转换表可以帮助您维护库模块的兼容性,确保模型能够继续正常工作。您可以使用转换表在新旧库模块之间创建映射,而不会损失任何数据或功能。在转换表中指定新旧库模块之间的映射后,指向旧的库模块的链接会在加载模型时自动更新。例如,如果您重命名或移动了库中的一个模块,您可以使用转换表更新与这个旧的库模块链接的模型。转换表在以下情况下执行:

  • 当模型关闭并重新打开时。

  • 当执行 add_blockreplace_block 命令时。

创建转换表

注意

如果模型中的链接已断开或被禁用,则不能使用转换表更新该模型。

  1. 打开一个锁定的库。

  2. 在 Library 窗口中,在 Library 选项卡上,点击 Locked Library。现在库已解锁,可以进行编辑。

  3. Modeling 选项卡上,点击 Library PropertiesLibrary Properties 对话框随即打开。

  4. 点击 Forwarding Table 选项卡。

  5. 点击 (Add New Entry) 按钮。转换表中将添加一个新行。

  6. Old Block PathNew Block Path 列中指定值。要获取模块的路径,请在模型中选择模块,然后点击

  7. Version 列中,您可以选择为库模块指定版本号。

    如果旧模块名称与新模块名称相同,转换表将自动填充版本号。库版本 (LibraryVersion) 的初始值从创建库链接时库的模型版本 (ModelVersion) 派生而来。对库模块的任何后续更新都会更新库版本,使其与库的模型版本匹配。

    注意

    • 版本号必须为数值。

    • 当新旧模块路径相同时,版本号的格式必须为 <major_version>.<minor_version>。例如,重命名库模块时。

    • 版本号中包含的圆点不能超过一个。例如,版本号 1.3 可接受,但版本号 1.3.1 不可接受。

    • 当您使用转换表将库模块从一个库移到另一个库时,版本号的格式并不重要。

  8. Transformation Function 列中,您可以指定一个 MATLAB® 文件,用于更正新旧链接之间不匹配的参数数据。通过为新的库模块转换旧的链接参数数据,您可以加载旧的链接并保留参数数据。有关详细信息,请参阅 变换函数

    如果未指定任何变换函数,当您保存库时,Transformation Function 列将显示 No Transformation

  9. 要应用更改并关闭对话框,请点击 OK。将在 Forwarding Table 中创建旧路径到新路径的映射。当您打开包含库链接的模型时,将会自动更新旧的库模块的链接。

一旦填充了转换表,您可以使用表上方的搜索栏来筛选其内容。当转换表有太多条目时,此筛选器特别有用。您可以按升序或降序对表中的列进行排序。您还可以按值对每列进行分组。

用户定义的转换表示例如下所示:

如果为新旧模块指定相同的库模块名称和路径,Forwarding Table 将会自动填充版本号。对于具有相同名称和路径的第一个条目,旧模块的版本号以 0 开头,模块的新版本设置为库的模型版本。您可以在 Forwarding Table 的 History 选项卡下查看库的模型版本。

如果新旧库版本中实例特定的参数 (InstanceData) 发生更改,则必须指定变换函数。

在此示例中:

  • Block A 的模块路径从 LibA 更改为 LibB

  • Block X 的模块名称更改为 Block Y,而库路径保持不变。

  • Block M 的模块名称更改为 Block N。指定了一个变换函数,负责处理实例特定的更改。

  • 更改了 Block L 的模块版本和实例特定的参数。

以编程方式创建转换表

在命令行中,您可以创建一个简单的转换表,指定模块在库中的旧位置以及移动到该库或另一个库中的新位置。通过将库的 ForwardingTable 参数设置为由二元素元胞数组构成的元胞数组(一个元胞数组指定已发生移动的模块的旧路径,另一个指定新路径),可以为库关联一个转换表。例如,创建转换表并将其指定给名为 Lib1 的库的语法如下:

set_param('Lib1', 'ForwardingTable', {{'Lib1/A', 'Lib2/A'} 
{'Lib1/B', 'Lib1/C'}});

其中:

  • Lib1 是与转换表关联的库。

  • 模块 ALib1 转移到 Lib2

  • 模块 B 在同一个库中被重命名为 C

变换函数

链接模块实例与称为 InstanceData 的实例特定的参数相关联。当您为一个库模块创建不同的版本时,可以在 InstanceData 中添加或删除参数集。

变换函数可以更正新旧库链接的 InstanceData 中不匹配的参数,从而确保库链接仍然有效。

您可以使用 MATLAB 文件在该路径中定义一个变换函数,然后在 Forwarding TableTransformation Function 列中指定该函数。

转换表中定义的新模块路径将覆盖变换函数中定义的值。如果新模块路径是基于一定条件而改变的动态值,则必须且只能使用变换函数来定义新模块路径。

变换函数的语法必须为:

function outData = TransformationFcn(inData)

其中:

  • inData 是一个结构体,包含字段 ForwardingTableEntryInstanceDataForwardingTableEntry 也是一个结构体。

  • outData 是包含 NewInstanceDataNewBlockPath 字段的结构体:

一个常规变换函数中可以定义多个局部函数。此函数基于旧模块的名称和版本来调用相应的局部函数。您可以利用这一点将多个局部函数合并为一个变换函数,以免 MATLAB 路径中存在太多变换函数。

以 Simulink® 库中的 Compare to Constant 模块为例。您必须创建此模块的若干版本,无需更改名称和模块路径,但需要将参数添加到较新的库模块。

下表显示了 Compare to Constant 模块的两个版本之间存在的参数差异。

旧版本新版本
Block {
BlockType		      Reference
Name		      "Compare\nTo Constant"
Ports		        [1, 1]
Position		     [210, 60, 250, 100]
SourceBlock	  "fixpt_lib_4/Logic & Comparison/Compare\nTo Constant"
SourceType	    "Fixed-Point Compare To Constant"
relop	           "=="
const	           "3.0"
    }
Block {
BlockType		      Reference
Name		      "Compare\nTo Constant"
SID		                      "15"
Ports		                     [1, 1]
Position		      [125, 50, 155, 80]
ZOrder		      -5
LibraryVersion	      "1.271"
SourceBlock	       "simulink/Logic and Bit\nOperations/Compare\nTo Constant"
SourceType	        "Compare To Constant"
relop		          "<="
const		             "3.0"
OutDataTypeStr	      "boolean"
ZeroCross		      on
    }
  

Compare to Constant 模块的新版本关联了附加参数(OutDataTypeStrZeroCross)。对于这种情况,变换函数必须确保 InstanceData 中的这些附加参数进行了设置,以使旧的库链接保持有效。

此示例说明 Compare to Constant 模块的变换函数会添加值 uint8OutDataTypestr 参数。

function [outData] = TransformationCompConstBlk(inData)
outData.NewBlockPath = ''; % No change in the library block path
outData.NewInstanceData = [];
instanceData = inData.InstanceData;
% Get the field type 'Name' from instanceData
[ParameterNames{1:length(instanceData)}] = instanceData.Name;

if (~ismember('OutDataTypeStr',ParameterNames))
    % OutDataTypeStr parameter is not present in old link. Add it and set value uint8
    instanceData(end+1).Name = 'OutDataTypeStr';
    instanceData(end).Value = 'uint8';
end

outData.NewInstanceData = instanceData;

创建封装参数别名

如果重命名封装参数,则必须确保使用旧参数名称的现有 MATLAB 脚本能够继续工作。为了确保兼容性,您可以为封装参数名称创建别名(替代名称)。别名允许您在库模块中更改封装参数的名称,而无需在现有模型中重新创建模块链接。

假设有一个包含 Edit 参数的封装模块。此 Edit 参数的封装参数名称为 p1

MaskObj = Simulink.Mask.get(gcb)); 
hEdit = MaskObj.getParameter('p1');

hEdit= 
% MaskParameter with properties:

           Type: 'edit'
    TypeOptions: {0×1 cell}
           Name: 'p1'
         Prompt: 'p1'
          Value: '0'
       Evaluate: 'on'
        Tunable: 'on'
      NeverSave: 'off'
         Hidden: 'off'
        Enabled: 'on'
        Visible: 'on'
        ToolTip: 'on'
       Callback: ''
          Alias: ''

请注意,Edit 封装参数没有任何别名。要为封装参数添加别名,您可以为 Alias 封装参数属性设置一个值。

MaskObj.Alias = 'pa'

您可以使用封装参数名称或别名对封装参数执行函数调用。例如,在本例中,您可以使用 set_param(gcb, 'p1, '10)(封装参数名称)或 set_param(gcb, 'pa, '10)(封装参数别名)为 Edit 封装参数设置值。

相关主题