集成外部应用程序代码和代码生成的PID控制器
这个例子展示了如何生成C代码从一个控制算法与现有模型和集成代码,外部应用程序代码。完整的应用程序,包括三个模块、算法模块必须通过全局变量与其他模块交换数据。在这个示例中,您可以配置生成的代码与现有的外部变量,类似于外部代码在外观和组织,并符合特定的编码需求。
检查外部代码
运行脚本prepare_ext_code
。脚本的副本外部代码文件分成几个文件夹。
exampleFolder = pwd;运行(“prepare_ext_code.m”);
开放ext_code_main.c
。这个应用程序代码代表与琐碎的调度算法(嵌入式系统而
循环)和三个模块,包括算法运行在每个执行周期:ex_ext_inputs_proc
,ex_ext_ctrl_alg
,ex_ext_outputs_proc
。
类型(“ext_code_main.c”)
在共享
文件夹,检查ex_ext_projTypes.h
。该文件定义了两个自定义数据类型(类型定义
模块中的数据使用的)。
类型(fullfile (“共享”,“ex_ext_projTypes.h”))
在io_drivers
文件夹,检查ex_sensor_accessors.c
。这个文件定义函数get_fromSensor_flow
和get_fromSensor_temp
,返回原始数据记录由流量传感器和温度传感器。在这个例子中,函数返回简单正弦刺激控制算法。
类型(fullfile (“io_drivers”,“ex_sensor_accessors.c”))
在ex_ext_inputs_proc
文件夹,检查ex_ext_inputs_proc.c
。的ex_ext_inputs_proc
模块读取传感器数据(通过调用读写函数),过滤数据,并将其存储在两个全局变量,PROC_INPUT_FLOW
和PROC_INPUT_TEMP
。这些文件中定义的全局变量ex_ext_proc_inputs.c
并宣布在ex_ext_proc_inputs.h
。
类型(fullfile (“ex_ext_inputs_proc”,“ex_ext_inputs_proc.c”))
这个模块和算法的滤波算法在其他两个模块需要状态数据,必须坚持执行周期之间的应用程序。每个模块存储国家有关数据作为全局变量。例如,在ex_ext_inputs_proc
模块,ex_ext_inputs_proc.c
定义了这些变量:
flowFilterIn_state_data
tempFilterIn_state_data
flowFilterIn_tmp_data
tempFilterIn_tmp_data
空ex_ext_ctrl_alg
文件夹是一个占位符,用于生成的代码。的ex_ext_ctrl_alg
模块必须对过滤流执行PID控制和温度测量。后,你检查这段代码的要求,是基于其他模块中的代码。
在ex_ext_outputs_proc
文件夹,检查ex_ext_outputs_proc.c
。这个模块读取PID输出信号从全局变量命名CONTR_SIG_FLOW
和CONTR_SIG_TEMP
。的ex_ext_ctrl_alg
模块(生成的代码)必须定义这些变量。的ex_ext_outputs_proc
模块过滤这些信号并将过滤后的值传递到函数代表致动器设备驱动程序(例如,一个阀和一个加热丝)。
类型(fullfile (“ex_ext_outputs_proc”,“ex_ext_outputs_proc.c”))
致动器中定义的函数io_drivers
文件夹的文件ex_actuator_accessors.c
。
图中显示的目的通过系统的数据流。图中还显示了定义和声明的代码文件的数据(全局变量)跨模块边界的。
检查仿真软件模型万博1manbetx和确定要求生成的代码
打开示例模型ex_ext_ctrl_alg
。
打开(“ex_ext_ctrl_alg”)
的块模型实现所需的PID控制器算法。的模型使用默认代码生成设置ERT-based系统目标文件(ert.tlc
)。
完成应用程序,您必须生成代码执行的功能ex_ext_ctrl_alg
模块。从模型中生成的代码必须:
使用自定义数据类型
dataPath_flow_T
和dataPath_temp_T
外部文件中声明ex_ext_projTypes.h
。从全局变量读取传感器数据过滤
PROC_INPUT_FLOW
和PROC_INPUT_TEMP
。生成的代码不能定义这些变量,因为模块ex_ext_inputs_proc
定义,声明它们ex_ext_proc_inputs.h
。写全局变量命名PID控制信号
CONTR_SIG_FLOW
和CONTR_SIG_TEMP
。生成的代码必须在文件定义这些变量和声明它们ex_ext_ctrl_sigs.h
。然后,ex_ext_outputs_proc
模块可以阅读原始的控制信号。符合变量控制外部应用程序的命名标准。例如,生成的代码必须状态数据存储在全局变量名称,在结束
_data
。此外,对于本例,本地函数变量的名字必须结束_local
。符合标准管理的组织每一个外部文件中的代码。例如,每个文件包含部分,使用评论,总等类似的代码结构类型定义,变量声明和函数定义。
这样你和其他人可以与控制算法在执行期间,您配置生成的代码定义和声明常量
全局变量命名PARAM_setpoint_flow
和PARAM_setpoint_temp
,它代表了PID控制器定位点。必须在一个文件中定义命名ex_ext_ctrl_params.c
和声明必须在文件命名ex_ext_ctrl_params.h
。
配置模型,使用自定义数据类型
设置你的当前文件夹共享
文件夹中。
使用的函数万博1manbetxSimulink.importExternalCTypes
生成万博1manbetxSimulink.AliasType
对象代表了自定义数据类型dataPath_flow_T
和dataPath_temp_T
。
cd (“共享”);万博1manbetxSimulink.importExternalCTypes (“ex_ext_projTypes.h”);
工作区对象出现在基地。
1。打开模型ex_ext_ctrl_alg
模型。
2。开放的嵌入式编码应用程序。
3所示。打开模型数据编辑器通过使用应用程序窗口底部附近的选项卡。
4所示。在模型数据编辑器,尺寸块表示PROC_INPUT_FLOW
,设置数据类型来dataPath_flow_T
。添加自定义数据类型数据类型列表中,点击刷新数据类型
。
5。代表的轮廓尺寸的块PROC_INPUT_TEMP
,设置数据类型来dataPath_temp_T
。
6。选择信号选项卡。
7所示。配置的数据类型为常数。对于每一个固定块,在模型中,选择块的输出信号。然后,在模型数据编辑器,集数据类型来通过反向传播继承:继承
。这个设置,固定块继承的输出数据类型块立即下游。在这种情况下,下游块和块。
另外,配置数据类型以编程方式或在命令提示符处,使用这些命令。
set_param (“ex_ext_ctrl_alg /三机一体”,“OutDataTypeStr”,“dataPath_flow_T”)set_param (“ex_ext_ctrl_alg / In2”,“OutDataTypeStr”,“dataPath_temp_T”)set_param (“ex_ext_ctrl_alg /流Setpt”,“OutDataTypeStr”,…通过反向传播继承:继承的)set_param (“ex_ext_ctrl_alg /临时Setpt”,“OutDataTypeStr”,…通过反向传播继承:继承的)
更新框图。图表显示,由于数据类型继承和传播,信号模型中使用自定义数据类型。
为港口和外港配置代码接口
配置模型生成代码访问,为港口和外港模型定义了全局变量。
1。在嵌入式编码应用,C代码选项卡上,选择代码接口>单个元素的代码映射。
2。在代码映射编辑器中,单击数据默认值选项卡。
3所示。扩大港口和外港。
4所示。为港口,设置存储类来ImportFromFile
。点击铅笔图标,设置HeaderFile财产ex_ext_proc_inputs.h
。的存储类ImportFromFile
,每个尺寸出现在生成的代码作为一个全局变量。定义变量,而不是生成的代码包括(# include
变量声明的头文件ex_ext_proc_inputs.h
。
6。为外港,设置存储类来ExportToFile
。点击铅笔图标,设置HeaderFile财产ex_ext_ctrl_sigs.h
和DefinitionFile财产ex_ext_ctrl_sigs.c
。的存储类ExportToFile
,生成的代码定义了全局变量。
7所示。在港口选项卡中,对于每一个尺寸,集存储类来模型默认值:ImportFromfile
。
8。在外港选项卡中,对于每个外港,集存储类来模型默认值:ExportToFile
。
9。保存模型。另外,港口和外港配置接口的编程方式或在命令提示符处,使用这些命令。
厘米= coder.mapping.api.get (“ex_ext_ctrl_alg”);setDataDefault(厘米,“港口”,“StorageClass”,“ImportFromFile”,“HeaderFile”,…“ex_ext_proc_inputs.h”);setInport(厘米,“三机”,“StorageClass”,“模型默认”);setInport(厘米,“In2”,“StorageClass”,“模型默认”);setDataDefault(厘米,“输出港”,“StorageClass”,“ExportToFile”,“HeaderFile”,…“ex_ext_ctrl_sigs.h”,“DefinitionFile”,“ex_ext_ctrl_sigs.c”);setOutport(厘米,着干活的,“StorageClass”,“模型默认”);setOutport(厘米,“Out2”,“StorageClass”,“模型默认”);
为常数参数配置代码接口
应用存储类为代表的参数不变流Setpt
和临时Setpt
,使用Model Explorer创建万博1manbetxSimulink.Parameter
对象来表示数据。创建两个工作空间模型参数。
1。模型浏览器打开。
2。在模型层次结构窗格中,选择模型的工作空间。
3所示。创建两个参数数据对象。选择添加>万博1manbetx模型参数。名称的参数对象PARAM_setpoint_flow
和PARAM_setpoint_temp
。设定的值PARAM_setpoint_flow
来3
。设定的值PARAM_setpoint_temp
来2
。
4所示。配置存储类模型参数,点击配置。
5。嵌入式编码的应用,在代码映射编辑器中,单击数据默认值选项卡。
6。扩大参数。
7所示。为模型参数,设置存储类来常量
。点击铅笔图标,设置HeaderFile财产ex_ext_ctrl_params.h
和DefinitionFile财产ex_ext_ctrl_params.c
。
8。在参数选项卡,为每个参数,设置存储类来模型默认值:常量
。
9。在模型中,对持续块流Setpt
组块参数恒定值来PARAM_setpoint_flow
。对固定块临时Setpt
,设置恒定值来PARAM_setpoint_temp
。
10。参数的可调,集模型配置参数默认参数的行为来可调
。
11。保存模型。
另外,配置参数接口编程方式或在命令提示符处,使用这些命令。
setDataDefault(厘米,“ModelParameters”,“StorageClass”,“常量”,“HeaderFile”,…“ex_ext_ctrl_params.h”,“DefinitionFile”,“ex_ext_ctrl_params.c”);setModelParameter(厘米,“PARAM_setpoint_flow”,“StorageClass”,“模型默认”);setModelParameter(厘米,“PARAM_setpoint_temp”,“StorageClass”,“模型默认”);set_param (“ex_ext_ctrl_alg”,“DefaultParameterBehavior”,可调的);
配置代码状态
在外部代码,内部数据不参与模块接口,如状态数据和局部变量在函数,符合命名方案。在模型中,配置内部数据出现在生成的代码结合外部代码命名方案。
1。在模型中配置参数对话框,打开代码生成>标识符窗格。
2。集全局变量命名规则R N_data美元美元
。这个设置控制全局变量的名称,比如那些代表状态数据。的命名规则R N_data_美元美元
最密切接近计划的状态变量的外部代码使用。的命名规则:
$ R
代表模型的名称,ex_ext_ctrl_alg
。$ N
代表模型元素的名称的命名规则适用,如一个信号、屏蔽状态,或标准的数据结构。M美元
代表名称改编文本插入代码生成器,以避免名称冲突。对于大多数的命名规则,这个令牌是必需的。
3所示。集当地的临时变量和本地块输出变量来N_local M美元
。
另外,以编程方式设置配置参数或在命令提示符处,使用这些命令。
set_param (“ex_ext_ctrl_alg”,“CustomSymbolStrGlobalVar”,' R N_data美元美元)set_param (“ex_ext_ctrl_alg”,“CustomSymbolStrTmpVar”,“N_local M美元”)set_param (“ex_ext_ctrl_alg”,“CustomSymbolStrBlkIO”,“N_local M美元”)
配置状态数据在模型中出现在生成的代码作为单独的全局变量而不是标准DWork结构的字段。
1。在代码映射编辑器中,单击数据默认值选项卡。
2。扩大信号并选择信号、状态和内部数据
行。
3所示。设置存储类ExportedGlobal
。
4所示。在信号/州选项卡,为每个状态,设置存储类模型默认值:出口全球
。
5。保存模型。
另外,配置状态数据代码生成以编程方式或在命令提示符处,使用这些命令:
setDataDefault(厘米,“InternalData”,“StorageClass”,“ExportedGlobal”);blockHandles =找到(厘米,“州”);设置状态(cm、blockHandles“StorageClass”,“模型默认”);
配置的组织代码生成的文件
默认情况下,当你与系统目标文件生成代码ert.tlc
,代码生成器使用内置的代码生成模板(CGT)文件ert_code_template.cgt
。模板管理的组织和外观代码在每个生成的文件。
对于这个示例,使用模板文件的示例ex_my_code_template.cgt
代替。示例模板文件符合更紧密地为这个示例文件的组织。例如,模板组织类似的代码构造为命名部分(由注释分隔开的),顶部的模板,指定最小每个生成的文件的信息。
cd (exampleFolder)类型(“ex_my_code_template.cgt”)
1。复制ex_my_code_template.cgt
到ex_ext_ctrl_alg
文件夹中。
拷贝文件(“ex_my_code_template.cgt”,“ex_ext_ctrl_alg”);
2。在模型中配置参数对话框,打开代码生成>模板窗格。
3所示。下代码模板和数据模板,设置参数源头文件模板和头文件模板到| ex_my_code_template.cgt |。
另外,以编程方式设置参数或在命令提示符处,使用这些命令。
set_param (“ex_ext_ctrl_alg”,“ERTSrcFileBannerTemplate”,“ex_my_code_template.cgt”)set_param (“ex_ext_ctrl_alg”,“ERTHdrFileBannerTemplate”,“ex_my_code_template.cgt”)set_param (“ex_ext_ctrl_alg”,“ERTDataSrcFileTemplate”,“ex_my_code_template.cgt”)set_param (“ex_ext_ctrl_alg”,“ERTDataHdrFileTemplate”,“ex_my_code_template.cgt”)
生成和检查代码
因为外部代码定义了一个主要
函数,选择模型配置参数只生成代码和明确的参数主程序生成一个例子。
set_param (“ex_ext_ctrl_alg”,“GenCodeOnly”,“上”)set_param (“ex_ext_ctrl_alg”,“GenerateSampleERTMain”,“关闭”)
从模型中生成代码。
slbuild (“ex_ext_ctrl_alg”)
在代码视图或代码生成报告,检查代码生成的文件确认满足要求。
该文件ex_ext_ctrl_sigs.c
定义了控制输出信号CONTR_SIG_FLOW
和CONTR_SIG_TEMP
。
dataPath_flow_T CONTR_SIG_FLOW;dataPath_temp_T CONTR_SIG_TEMP;
选点参数出现在ex_ext_ctrl_params.c
。
const dataPath_flow_T PARAM_setpoint_flow = 3.0;const dataPath_temp_T PARAM_setpoint_temp = 2.0;
该文件ex_ext_ctrl_alg.c
定义全局变量来存储状态数据。按照指定的变量命名规则。
dataPath_temp_T ex_ext__Integrator_DSTATE_datag;dataPath_flow_T ex_ext_c_Integrator_DSTATE_data;dataPath_temp_T ex_ext_ctrl_Filter_DSTATE_datad;dataPath_flow_T ex_ext_ctrl__Filter_DSTATE_data;
在同一个文件中,模型的执行功能,ex_ext_ctrl_alg_step
,创建本地函数变量来存储临时计算。按照指定的变量命名方案。
dataPath_flow_T FilterCoefficient_local;dataPath_flow_T IntegralGain_local;dataPath_temp_T Diff1_local;dataPath_temp_T FilterCoefficient_locali;
一些全球和本地变量名称包含额外的矫直字符,防止名称冲突。额外的字符对应M美元
令牌在指定的命名规则。
生成的代码文件在生成的文件夹ex_ext_ctrl_alg_ert_rtw
和slprj
。您必须配置文件管理系统和构建工具来使用这些文件夹和文件。