向结构参数的迁移
本示例展示了如何将由非结构化工作空间变量参数化的Simulink®模型转万博1manbetx换为由MATLAB®结构参数化的模型。该示例使用了许多Simulink实用程序,将来自基本工作区万博1manbetx的模型变量组织到一个层次结构中,然后将该结构应用到模型中。
模型描述
此模型使用来自基本工作区的许多数值参数。
例子要求
此示例更改了原始模型,并在当前工作目录中创建了文件。如果您计划保存示例模型,请在当前目录中保存一个副本。
典型的工作流
按照以下步骤迁移模型以使用结构参数:
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}}