主要内容

向结构参数的迁移

这个例子展示了如何将一个由非结构化工作空间变量参数化的Simulink®金宝app模型转换为一个由MATLAB®结构参数化的模型。该示例使用了许多Simulink实用程序来将基本工作空间中金宝app的模型变量组织成层次结构,然后将该结构应用到模型中。

模型描述

打开模型sldemo_applyVarStruct

该模型使用了来自基本工作空间的许多数值参数。

例子要求

这个示例更改了原始模型,并在当前工作目录中创建了文件。如果您计划保存示例模型,请在当前目录中保存一个副本。

典型的工作流

迁移模型以使用结构参数遵循以下步骤:

1.将模型使用的所有数值变量收集到一个MATLAB结构中。

2.修改MATLAB结构(如有必要)。

3.模型采用MATLAB结构。

4.在生成的代码中配置参数结构的外观(可选)。

将数值变量收集到MATLAB结构中

您可以使用金宝appSimulink.findVars找出Simulink模型所使用的变量。金宝app

模型=“sldemo_applyVarStruct”;varList =仿金宝app真软件。findVars(模型、“WorkspaceType”、“基地”)
varList = 20x1 VariableUsage数组,属性:Name Source SourceType Users
var = varList (1)
var = VariableUsage with properties: Name: 'Ka' Source: 'base workspace' SourceType: 'base workspace' Users: {'sldemo_applyVarStruct/Controller/Gain3'}

您可以使用金宝appSimulink.BlockDiagram.createVarStruct生成一个MATLAB结构,该结构包含来自基本工作空间或模型使用的数据字典的所有数值变量。

金宝appSimulink.BlockDiagram.createVarStruct(model, 'ModelParam')
在模型可见的全局命名空间中创建了变量ModelParam。

变量ModelParam是一个MATLAB结构,它包含数字变量作为字段(按名称排序)。

注意:

  • 模型和模型使用的所有数据必须在调用之前加载金宝appSimulink.BlockDiagram.createVarStruct

  • 不能给MATLAB结构赋予与现有变量相同的名称。

MATLAB结构的修改

原始结构在一个层次结构级别中包含所有变量。您可以在将结构应用到模型之前更改它。例如,重新排序参数字段、向组模型参数添加额外的级别或添加额外的字段。

注意:

  • 不要更改结构中的叶子字段的名称。

  • 在完成迁移过程之前,不要清除原始变量。

1.一种方法是使用金宝appSimulink.saveVars将结构编写到MATLAB脚本中,并在文件中进行更改。

金宝appSimulink.saveVars(“sldemo_applyVarStruct_data.m”、“ModelParam”)编辑sldemo_applyVarStruct_data.m

2.根据需要编辑MATLAB脚本。例如,将结构拆分为两个结构。

  • “ControlParam”包含Controller子系统的所有参数。

  • “ModelParam”包含所有其他数值参数。

ControlParam =结构;ControlParam。Ka = 0.677;ControlParam。Kf = -1.746;ControlParam。Ki = -3.864;ControlParam。Kq = 0.8156;ControlParam。Tal = [0.3959 1];ControlParam。Ts = [0.1 1];ControlParam。W1 = [1 2.971]; ControlParam.W2 = [1 4.144];
ModelParam =结构;ModelParam。Md = -6.8847;ModelParam。Mq = -0.6571;ModelParam。Mw = -0.00592;ModelParam。Swg = 3;ModelParam。Ta = 0.05;ModelParam。Uo = 689.4; ModelParam.Vto = 690.4; ModelParam.Zd = -63.9979; ModelParam.Zw = -0.6385; ModelParam.a = 2.5348; ModelParam.b = 64.13; ModelParam.g = 32.2;

保存修改后的数据文件。您可以使用它作为预加载函数。

3.运行修改后的MATLAB脚本创建MATLAB结构。

sldemo_applyVarStruct_data;

将MATLAB结构应用于该模型

您可以使用金宝appSimulink.BlockDiagram.applyVarStruct用等效结构引用自动替换框图中的变量引用。

1.模型采用MATLAB结构。模型将会改变。然后可以将其保存到可写目录中。

[应用,待摊的]= Simulink.B金宝applockDiagram.applyVarStruct(模型、“ControlParam”)
[应用,待摊的]= Simulink.B金宝applockDiagram.applyVarStruct(模型、“ModelParam”)

注意:

  • 您可以使用“预览”ApplyMode获取关于在不实际改变模型的情况下将被改变的信息:

金宝appSimulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'ApplyMode', 'preview')
  • 如果模型已经编译,您可以使用“缓存”避免模型重新编译的SearchMethod:

金宝appSimulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'SearchMethod', 'cached')
  • 如果未实施的输出不为空,可以调查使用原因金宝appSimulink.findVars(模型、“WorkspaceType”、“基地”,“名字”,variableName)。可能的原因是:您更改了结构字段名或添加了额外的字段;变量由需要特殊考虑的块使用,例如statflow®图、S-Function或Model块。

2.对修改后的模型进行MATLAB结构测试。

清除不必要的变量并运行模拟来检查结果。

清晰;模型=“sldemo_applyVarStruct”;sldemo_applyVarStruct_data;
sim(“sldemo_applyVarStruct”);
  • 检查任何警告或错误。

  • 查看仿真结果。

配置结构参数以出现在生成的代码中

默认情况下,MATLAB结构不会出现在生成的代码中,因为数值是内联的。代码生成需要Simulink®Coder™。金宝app

1.要使结构变量可调,请创建金宝app仿真软件。参数使用结构值和'ExportedGlobal'存储类。

p 金宝app= Simulink.Parameter;p.Value = ControlParam;p.CoderInfo.StorageClass =“ExportedGlobal”;ControlParam = p;明确p;
rtwbuild(“sldemo_applyVarStruct”);

属性中生成的代码现在包含可调结构的结构类型定义model_types.h头文件。默认情况下,Simuli金宝appnk Coder为参数结构的类型自动生成一个名称。这个名字是唯一的,但不容易识别。

类型定义结构体real_T;real_TKf;real_TKi;real_TKq;real_TTal [2];real_TTs [2];real_TW1 [2];real_TW2 [2];} struct_mn4cJ7zsH8aqc8bBlbIkqC;

2.可以使用金宝app仿真软件。公共汽车以指定Simulink的数据类型。金宝app参数对象。

您可以使用金宝appSimulink.Bus.createObject创建与MATLAB结构相同形状的总线对象。

busInfo 金宝app= Simulink.Bus.createObject (ControlParam.Value)

将总线对象名称分配给Simulink。金宝app参数数据类型属性。

ParamType = eval (busInfo.busName);ControlParam。数据类型=“总线:ParamType”;明确(busInfo.busName);清楚busInfo;

注意:只有金宝app仿真软件。参数可以接受总线对象名称作为数据类型。对于MATLAB结构,Simulink Cod金宝apper自动生成类型的名称。

3.保存数据文件以包含修改后的工作区变量。

金宝appSimulink.saveVars(“sldemo_applyVarStruct_data。”、“附加”)

4.重新生成已修改模型的代码(需要Simulink Coder)。金宝app

rtwbuild(模型);

生成的类型定义现在显示为:

typedef struct {real_T Ka;real_T Kf;real_T Ki;real_T Kq;real_T Tal [2];real_T Ts [2];real_T W1 [2];real_T W2 [2];} ParamType;

参数定义为:

ParamType ControlParam = {0.677, -1.746, -3.864, 0.8156, {0.3959, 1.0}, {0.1, 1.0}, {1.0, 2.971}, {1.0, 4.144}}