生成代码中的控制信号和状态初始化
要使用自定义值初始化信号和离散状态以用于模拟和代码生成,可以使用信号对象和块参数。数据初始化可以提高应用程序的可靠性,是安全关键应用程序的要求。为仿真和代码生成初始化信号可以加快基于模型的设计阶段之间的转换。
有关为模型中的信号和离散状态指定初始值的基本信息,请参见初始化信号和离散状态.
生成代码中的信号和状态初始化
代码生成的初始化行为与模型模拟的初始化行为相同,但有以下例外:
在生成代码时,初始化语句被放入模型
.c
或模型
. cpp
在模型的初始化代码中。
例如,考虑模型rtwdemo_sigobj_iv
.
如果在基本工作空间中创建和初始化信号对象,代码生成器会在文件中放置信号的初始化代码rtwdemo_sigobj_iv.c
下rtwdemo_sigobj_iv_initialize
函数,如下所示。
/*模型初始化函数*/ void rtwdemo_sigobj_iv_initialize(void){…/*输出全局信号*/ S3 = -3.0;S2 = -2.0;……/*输出全局状态*/ X1 = 0.0;X2 = 0.0;/*外部输入*/ S1 = -4.5;……
下面的代码显示了启用的子系统的Unit Delay块状态的初始化代码X1
和输出信号S2
.
void MdlStart(void){…/*初始化条件为单位延迟:'/单位延迟' */ X1 = aa1;/* Start for enable system: ' /Enabled Subsystem (state X1 inside)' */ /* virtual outports code */ /* (virtual) Outport Block: ' /Out1' */ S2 = aa2;}
对于已启用的子系统,初始值也用作重置值如果子系统的Outport块参数禁用时输出设置为重置
.下面的代码来自rtwdemo_sigobj_iv.c
的赋值语句S3
因为它出现在模型输出函数中rtwdemo_sigobj_iv_output
.
/*模型输出函数*/静态void rtwdemo_sigobj_iv_output(void){…/* Disable for enable system: '/Enabled Subsystem (state X1 inside)' */ /* (Virtual) Outport Block: ' /Out1' */ S2 = aa2;
生成可调初始条件
您可以通过在生成的代码中创建可调的全局变量来表示信号和状态的初始条件。这些变量允许您使用存储在内存中的初始条件重新启动应用程序。
如果你设置配置参数>优化配置>参数默认行为来可调
时,初始条件表现为全局参数结构的可调字段。
你是否设置默认参数行为来可调
或内联
时,可以使用可调参数指定InitialValue
属性的信号对象初始条件块参数。有关可调参数的基本信息,请参见在生成的代码中创建可调校准参数.
这个例子展示了如何使用可调参数来指定信号和状态的初始条件。
探索范例模型
打开示例模型rtwdemo_sigobj_iv
并配置它以显示生成的块的名称。信号S2
使用一个金宝app仿真软件。信号
基本工作区中的对象。
双击金宝app仿真软件。信号
对象S2
查看其属性。的初始值属性设置为aa2
.对象使用该变量aa2
为信号指定一个初始条件S2
.的存储类属性设置为ExportedGlobal
.使用金宝app仿真软件。信号
对象初始化信号时,信号对象必须使用其他存储类汽车
或者,如果“代码映射编辑器”中的相应数据类别使用的存储类设置不是默认的
,模型的默认
.
在优化窗格中,在“配置参数”对话框中,单击配置.的变量aa2
是使用存储类的可调参数吗ExportedGlobal
.
在模型中,打开Enabled子系统。在“输出端口”块对话框中,参数禁用时输出设置为重置
.当子系统被禁用时,输出信号S2
重置为初始值aa2
.
打开单位延迟块对话框。在状态属性选项卡,国家的名字框设置为X1
.
打开“启用”块对话框。的参数启用时的状态设置为重置
.当子系统从禁用状态转换到启用状态时,它将重置内部块状态,例如X1
的初始值。
在基本工作区中,双击金宝app仿真软件。信号
对象X1
查看其属性。的初始值属性设置为aa1
.
双击金宝app仿真软件。参数
对象aa1
查看其属性。的存储类属性设置为ExportedGlobal
.可以使用可调参数为块状态生成可调初始条件,例如aa1
和金宝app仿真软件。信号
对象,例如X1
.
生成和检查代码
使用示例模型生成代码。
###开始构建过程:rtwdemo_sigobj_iv成功完成构建过程:rtwdemo_sigobj_iv构建摘要顶级模型目标构建:模型动作重建原因================================================================================================== rtwdemo_sigobj_iv生成和编译的代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 12.671s
在代码生成报告中,查看该文件rtwdemo_sigobj_iv.c
.代码使用全局变量表示块状态X1
还有信号S2
.
/*输出块状态*/ real_T X1;/* '/单位延时' */ /*输出块信号*/ real_T S1;/* ' /In1' */ real_T S3;/* '<根>/信号转换' */ real_T S2;/* ' /单位时延' */
代码使用全局变量表示可调参数aa1
.
/*导出块参数*/ real_T aa1 = -2.5;/*变量:aa1
模型初始化函数使用可调参数aa1
初始化状态X1
.该函数还使用可调参数aa2
初始化信号S2
.
/* SystemInitialize for Enabled SubSystem: '/Enabled SubSystem (state X1 inside)' */ /* UnitDelay: ' /Unit Delay' */ X1 = aa1;/* SystemInitialize for UnitDelay: ' /Unit Delay'合并:* Outport: ' /Out1' */ S2 = 0.0;
在模型步骤函数中,当已启用的子系统从禁用状态转换到启用状态时,单元延迟块状态X1
重置为初始值。
if (rtb_PulseGenerator > 0) {if (! rtwdemo_sigobj_iv_dww . enabledsubsystemstatex1inside_m) {/* UnitDelay初始化条件:'/Unit Delay' */ X1 = aa1;rtwdemo_sigobj_iv_DW。EnabledSubsystemstateX1inside_M = true;} /* UnitDelay: ' /Unit Delay' */ S2 = X1;/*更新单元延迟:' /单位延迟'合并:*导入:'<根>/In1' */ X1 = S1;} else {if (rtwdemo_sigobj_iv_dww . enabledsubsystemstatex1inside_m){/*禁用UnitDelay: ' /Unit Delay'合并:* Outport: ' /Out1' */ S2 = 0.0;rtwdemo_sigobj_iv_DW。EnabledSubsystemstateX1inside_M = false;}} /* End of Outputs for SubSystem: ' /Enabled SubSystem (state X1 inside)' */ /* DataStoreWrite: ' /Data StoreWrite ' */ X2 = S2;/* DataStoreRead: '<根>/数据存储读取' */ S3 = X2; } /* Model initialize function */ void rtwdemo_sigobj_iv_initialize(void) { /* Registration code */ /* initialize error status */ rtmSetErrorStatus(rtwdemo_sigobj_iv_M, (NULL)); /* block I/O */ /* exported global signals */ S3 = -3.0; /* states (dwork) */ (void) memset((void *)&rtwdemo_sigobj_iv_DW, 0, sizeof(DW_rtwdemo_sigobj_iv_T)); /* exported global states */ X1 = 0.0; X2 = 0.0; /* external inputs */ S1 = -4.5; /* Start for DiscretePulseGenerator: ' /Pulse Generator' */ rtwdemo_sigobj_iv_DW.clockTickCounter = -2; /* Start for DataStoreMemory: ' /Data Store Memory' */ X2 = -3.5; /* SystemInitialize for Enabled SubSystem: ' /Enabled Subsystem (state X1 inside)' */ /* InitializeConditions for UnitDelay: ' /Unit Delay' */ X1 = aa1; /* SystemInitialize for UnitDelay: ' /Unit Delay' incorporates: * Outport: ' /Out1' */ S2 = 0.0; /* End of SystemInitialize for SubSystem: ' /Enabled Subsystem (state X1 inside)' */ } /* Model terminate function */ void rtwdemo_sigobj_iv_terminate(void) { /* (no terminate code required) */ }
如果启用的子系统在代码执行期间被禁用,算法将使用可调初始条件aa2
设置信号的值S2
.
} else {if (rtwdemo_sigobj_iv_dww . enabledsubsystemstatex1inside_m){/*禁用UnitDelay: '/Unit Delay'合并:* Outport: ' /Out1' */ S2 = 0.0;rtwdemo_sigobj_iv_DW。EnabledSubsystemstateX1inside_M = false;}}
生成总线信号的可调初始条件结构
当您使用MATLAB®结构为总线中的信号元素指定初始化值时,您可以在生成的代码中创建可调的全局结构。
如果你设置配置参数>优化配置>参数默认行为来可调
时,初始条件表现为全局参数结构的可调子结构。
你是否设置默认参数行为来可调
或内联
,您可以使用可调参数指定初始条件金宝app仿真软件。参数
对象,其值为结构。如果应用的存储类不是汽车
对于参数对象,该结构在生成的代码中是可调的。
为了通过避免结构和总线信号之间的数据类型不匹配来生成有效的代码,可以使用:
类型化表达式来指定结构字段的值。将每个字段的数据类型与相应信号元素的数据类型匹配。
一个
金宝app仿真软件。公共汽车
对象来控制结构字段和信号元素的数据类型。
有关使用结构初始化总线信号以及决定如何控制字段数据类型的基本信息,请参见指定总线信号的初始条件.
生成可调初始条件结构
此示例演示如何使用可调结构参数初始化虚拟总线信号。
打开示例模型rtwdemo_tunable_init_struct
并配置它以显示生成的块的名称。
在建模选项卡上,单击模型数据编辑器.
在港口/外港选项卡,数据类型列显示模型中的每个import块使用不同的输出数据类型。
打开“总线创建器”块对话框。块输出是一个虚拟总线。
在“配置参数”对话框中,打开优化窗格。配置参数默认参数行为设置为可调
.默认情况下,块参数(包括初始条件)作为全局参数结构的可调字段出现在生成的代码中。
在模型数据编辑器中,检查州选项卡。
对于单位延迟块,设置初始值到一个结构,该结构为三个信号元素中的每一个指定初始条件。要生成高效的代码,请将结构字段的数据类型与相应信号元素的数据类型匹配。例如,set初始值到表达式结构(thermocpl, 15.23,“magFlow”,uint32(79),“posSwitch”,假)
.
set_param (rtwdemo_tunable_init_struct /单元的延迟,“InitialCondition”,…的结构体(“thermocpl”,15.23,“magFlow”,uint32(79),“posSwitch”,假)”)
从示例模型生成代码。
# # #开始构建过程:rtwdemo_tunable_init_struct # # #成功完成构建过程:rtwdemo_tunable_init_struct模型建立目标:总结构建模型重建行动的理由 ============================================================================================================ rtwdemo_tunable_init_struct代码生成和编译代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 32.87s
在代码生成报告中,查看该文件rtwdemo_tunable_init_struct_types.h
.代码定义一个结构类型,其字段使用您在结构体
表达式。
#define DEFINED_TYPEDEF_FOR_struct_mqGi1jsItE0G7cf1bNqMu_ typedef struct {real_T thermocpl;uint32_T magFlow;boolean_T posSwitch;} struct_mqGi1jsItE0G7cf1bNqMu;
查看文件rtwdemo_tunable_init_struct.h
.的结构体
全局参数结构的类型定义包含子结构,UnitDelay_InitialCondition
,表示初始条件单位延迟块参数。
struct P_rtwdemo_tunable_init_struct_T_ {struct_mqGi1jsItE0G7cf1bNqMu UnitDelay_InitialCondition;
查看文件rtwdemo_tunable_init_struct_data.c
.这个源文件为全局参数结构分配内存。的底座UnitDelay_InitialCondition
出现了。
/*块参数(默认存储)*/ P_rtwdemo_tunable_init_struct_T rtwdemo_tunable_init_struct_P ={/*掩码参数:UnitDelay_InitialCondition *引用:* '<根>/单位延迟' * '<根>/单位延迟' * '<根>/单位延迟' */ {15.23,79U, 0},
查看文件rtwdemo_tunable_init_struct.c
.模型初始化函数使用子结构的字段初始化块状态。
/*单元延迟的初始化条件:'<根>/单元延迟' */ rtwdemo_tunable_init_struct_DW。UnitDelay_1_DSTATE = rtwdemo_tunable_init_struct_P.UnitDelay_InitialCondition.thermocpl;/*单元延迟的初始化条件:'<根>/单元延迟' */ rtwdemo_tunable_init_struct_DW。UnitDelay_2_DSTATE = rtwdemo_tunable_init_struct_P.UnitDelay_InitialCondition.magFlow;/*单元延迟的初始化条件:'<根>/单元延迟' */ rtwdemo_tunable_init_struct_DW。UnitDelay_3_DSTATE = rtwdemo_tunable_init_struct_P.UnitDelay_InitialCondition.posSwitch;
使用总线对象指定数据类型
如果您创建了一个总线对象,您可以使用它来指定总线信号的数据类型和可调初始条件结构。在代码生成之前,金宝app仿真软件。参数
对象将结构字段的值强制转换为信号元素的数据类型。有关创建总线对象和在模型中使用它们的基本信息,请参见使用Simulink指定总线属性。金宝app总线对象.
打开示例模型rtwdemo_init_struct_busobj
并配置它以显示生成的块的名称。
在基本工作区中,双击金宝app仿真软件。公共汽车
对象ComponentData
.对象定义了三个信号元素:thermocpl
,magFlow
,posSwitch
.每个元素使用不同的数据类型。
在模型中,打开模型数据编辑器(在建模选项卡上,单击模型数据编辑器)。的港口/外港选项卡显示import块的DataIn
,输出数据类型(数据类型列)设置为总线:ComponentData
.
在命令提示符下,创建结构参数initStruct
.可以使用无类型表达式指定字段值。为了提高可读性,请指定字段posSwitch
布尔值。
struct = struct(…“thermocpl”, 15.23,…“magFlow”, 79,…“posSwitch”,错误的…);
initStruct = 金宝appSimulink.Parameter(initStruct);
在模型数据编辑器中,检查参数选项卡。
在模型中,单击Unit Delay块。模型数据编辑器突出显示与初始条件块参数。
在“模型数据编辑器”中,设置参数值(价值列)initStruct
.
单击显示/刷新其他信息按钮。参数对象,initStruct
,在数据表中显示为一行。
使用数据类型列设置的数据类型initStruct
来总线:ComponentData
.
initStruct。数据类型=“巴士:ComponentData”;
设置改变观点下拉列表代码
.
使用存储类列应用存储类ExportedGlobal
来initStruct
.
initStruct。StorageClass =“ExportedGlobal”;
从示例模型生成代码。
# # #开始构建过程:rtwdemo_init_struct_busobj # # #成功完成构建过程:rtwdemo_init_struct_busobj模型建立目标:总结构建模型重建行动的理由 =========================================================================================================== rtwdemo_init_struct_busobj代码生成和编译代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 14.034s
在代码生成报告中,查看该文件rtwdemo_init_struct_busobj_types.h
.代码创建了一个结构类型ComponentData
其字段使用总线对象中的数据类型。
#define DEFINED_TYPEDEF_FOR_ComponentData_ typedef struct {real_T thermocpl;uint32_T magFlow;boolean_T posSwitch;} ComponentData;
查看文件rtwdemo_init_struct_busobj.c
.代码创建了一个全局变量来表示可调参数对象initStruct
.
/*导出块参数*/ ComponentData initStruct = {15.23, 79U, 0};/*变量:initStruct
模型初始化函数使用结构字段初始化块状态。
/*单元延迟的初始化条件:'<根>/单元延迟' */ rtwdemo_init_struct_busobj_DW。UnitDelay_1_DSTATE = initStruct.thermocpl;/*单元延迟的初始化条件:'<根>/单元延迟' */ rtwdemo_init_struct_busobj_DW。UnitDelay_2_DSTATE = initStruct.magFlow;/*单元延迟的初始化条件:'<根>/单元延迟' */ rtwdemo_init_struct_busobj_DW。UnitDelay_3_DSTATE = initStruct.posSwitch;
若要更改信号元素的数据类型,请在总线对象中指定新类型。模型中的信号元素使用新类型。在模拟和代码生成之前,参数对象initStruct
将相应的结构字段强制转换为新类型。