文档

向结构参数的迁移

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

模型描述

打开模型sldemo_applyVarStruct

此模型使用来自基本工作区的许多数值参数。

例子要求

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

典型的工作流

按照以下步骤迁移模型以使用结构参数:

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

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

3.将MATLAB结构应用到模型中。

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

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

你可以用万博1manbetxSimulink.findVars找出Simulink模型使用了哪些变量。万博1manbetx

model = 'sldemo_applyVarStruct';varList = 万博1manbetxSimulink。find dvars (model, 'WorkspaceType', 'base')
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'}

你可以用万博1manbetxSimulink.BlockDiagram.createVarStruct生成包含模型使用的基本工作空间或数据字典中的所有数值变量的MATLAB结构。

万博1manbetxSimulink.BlockDiagram.createVarStruct(model, 'ModelParam')
在基本工作区中创建变量'ModelParam'。

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

注意:

  • 在调用之前,必须加载模型和模型使用的所有数据万博1manbetxSimulink.BlockDiagram.createVarStruct

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

修改MATLAB结构

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

注意:

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

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

1.一种方法是使用万博1manbetxSimulink.saveVars将结构写入MATLAB脚本并在文件中进行更改。

万博1manbetxSimulink.saveVars(' sldemo_applyvarstruct_data.m. ','ModelParam')编辑sldemo_applyvarstruct_data.m.

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

  • “ControlParam”包含控制器子系统的所有参数。

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

ControlParam = struct;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 = struct;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结构应用于模型

你可以用万博1manbetxSimulink.BlockDiagram.applyVarStruct将框图中的变量引用自动替换为等效结构引用。

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

[应用,待摊的]= Simulink.B万博1manbetxlockDiagram.applyVarStruct(模型、“ControlParam”)
[应用,待摊的]= Simulink.B万博1manbetxlockDiagram.applyVarStruct(模型、“ModelParam”)

注意:

  • 你可以用“预览”在不实际改变模型的情况下,ApplyMode获取将要改变的信息:

万博1manbetxSimulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'ApplyMode', 'preview')
  • 如果模型已编译,则可以使用“缓存”避免模型重新编译的搜索方法:

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

2.在修改后的模型中测试MATLAB结构。

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

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

  • 检查仿真结果。

配置结构参数以显示在生成的代码中

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

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

p 万博1manbetx= Simulink.Parameter;p.Value = ControlParam;p.CoderInfo.StorageClass =“ExportedGlobal”;ControlParam = p;明确p;
rtwbuild(“sldemo_applyVarStruct”);

中可调结构的结构类型定义model_types.h头文件。默认情况下,Simuli万博1manbetxnk Coder为参数结构的类型自动生成一个名称。这个名字很独特,但不容易识别。

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

2.可以使用来控制此类型名称万博1manbetx仿真软件。公共汽车来指定Simulink的数据类型。万博1manbetx参数对象。

你可以用万博1manbetxSimulink.Bus.createObject创建与MATLAB结构具有相同形状的总线对象。

busInfo 万博1manbetx= Simulink.Bus.createObject (ControlParam.Value)

将总线对象名称分配给Simulink。万博1manbetx参数DataType属性。

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

注意:只有万博1manbetx仿真软件。参数可以接受总线对象名称作为数据类型。对于MATLAB结构,Simulink Cod万博1manbetxer为类型自动生成一个名称。

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

万博1manbetxSimulink.saveVars(“sldemo_applyVarStruct_data。”、“附加”)

4.为修改后的模型重新生成代码(需要Simulink Coder)。万博1manbetx

rtwbuild(模型);

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

typepedef 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}}
这个话题有帮助吗?