从MatlabSimulink生成易读可重用代码.docx

上传人:b****7 文档编号:10676348 上传时间:2023-02-22 格式:DOCX 页数:14 大小:481.65KB
下载 相关 举报
从MatlabSimulink生成易读可重用代码.docx_第1页
第1页 / 共14页
从MatlabSimulink生成易读可重用代码.docx_第2页
第2页 / 共14页
从MatlabSimulink生成易读可重用代码.docx_第3页
第3页 / 共14页
从MatlabSimulink生成易读可重用代码.docx_第4页
第4页 / 共14页
从MatlabSimulink生成易读可重用代码.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

从MatlabSimulink生成易读可重用代码.docx

《从MatlabSimulink生成易读可重用代码.docx》由会员分享,可在线阅读,更多相关《从MatlabSimulink生成易读可重用代码.docx(14页珍藏版)》请在冰豆网上搜索。

从MatlabSimulink生成易读可重用代码.docx

从MatlabSimulink生成易读可重用代码

从Matlab-Simulink生成易读可重用代码

1)

2)

3)长,离散,可调参数,ERT目标,C语言,设置基本固定,未设置的地方保持默认。

→solveroptions:

type--Fixedstep.solver--Discrete.

→optimization->signalsandparameters:

●Defaultparameterbehavior--tunable.

●Passreusablesubsystemoutputsas--输出较多选用structurereference.

→hardwareimplementation:

按实际设hardwareboard,device,devicedetails.

→codegeneration:

●Systemtargetfile--ert.tlc,Language--C,generatecodeonly.codegenerationobjectives.

Øcomments:

includecomments,默认全选,可按需要选择。

Øsymbols:

命名规则设置,按各自代码规范设置。

Øinterface:

设置整个模型生成代码的接口。

✧codeinterfacepackage,可选择可重用,PassrootlevelI/Oas,模型输入输出参数一般较多,一般选择结构体,structurereference,模型数据、输入、输出通过各自独立结构体传入参数;partofmodeldatastructure,一个结构体传入参数。

也可选择不可重用。

✧configuremodelfunctions,点击进入,设置模型具体的C原型。

getdefaultconfiguration,可修改模型默认initialize/step函数名,及参数,各输入输出单独作为函数参数,这与结构体传参是矛盾的,不能同时设置。

Øcodestyle:

设置代码风格。

✧Parentheses括号,--Nominal(readability),按可读性优化。

✧Castingmode强制转换方式,Nominal.

✧Codeindentation代码缩进,size--4.

ØCodeplacement:

代码放置,可设置变量定义或声明在单独文件还是和源代码放一起,头文件包含是还是"head.h"。

ØDatatypereplacement:

数据类型替换。

4)设置模型中每一个基本模块的属性。

包括名称、值、数据类型、采样时间等。

子模块或者引用模型等这类自定义模块,除了内部基本模块的属性外,还要设置各自的模块属性。

模块中参数等值,必须按照设计配置;如果想使用可调参数,则将参数设置为变量,再设置变量值。

生成代码模型中的模块名设置,最好遵循目标语言的命名规则,因为生成代码中的一些名称可以从模块名继承。

嵌入式应用大多无浮点单元,定点数据的设置在模块属性的代码生成栏。

将图1中各模块可按如下方式设置:

●inport,点击模块下方名称,设置模块名,将其设置为In;双击模块进入模块属性设置,main栏设置编号,编号会体现在子系统或引用模型上;signalattributes设置数据类型为定点数,16b字长10b小数部分fixdt(1,16,10)。

其它模块设置方法类似。

●view->modeldata,弹出modeldata窗口。

simulink提供的modeldata窗口,用于显示当前层级下的所有输入输出、信号、状态、参数,并将对应属性罗列成表格,而且表格可编辑部分属性。

●Kp增益模块,双击模块,输出数据类型设置为同输入,参数数据类型设置为从Gain继承,Gain设置为Kp。

●在modeldata窗口,参数栏,Kp模块,值变为Kp,其后出现create...链接字样。

点击弹出createnewdata窗口,值选择Simulink.Parameter,位置选择BaseWorkspace,创建,弹出Simulink.Parameter:

Kp属性窗口,设置值为10,数据类型为定点数fixdt(1,16,10),存储类型选择ExportedGlobal,确定。

●Ki增益模块,使用设置Kp的方法将simulink参数属性值设为1。

●File->Modelproperties,弹出模型属性窗口,选择数据栏,将数据定义到数据字典,选择或新建一个数据字典文件,应用。

建立在基本工作区的数据迁移到数据字典保存。

后面该模型新建参数等数据,基本工作区的位置将被数据字典代替。

保存在基本工作区的数据,关闭MATLAB不会自动保存,因此一些模型也采用脚本配置。

位置也可选择模型工作区,但保存到模型工作区的参数,有效的存储类型会受到限制。

●unitdelay单位延时,初始条件设为0,状态名称按实际意义设置。

●Outport,数据类型可选自动。

信号名称,可到modeldata窗口统一设置,该窗口中选中信号,模型区会用颜色标记对应标记。

没有设置名称的信号,按照内部规则生成代码。

模型相关设置,simulink还提供modelexplorer图形界面统一管理。

点击图标

可打开。

5)设置完成后,启用Advisor检查模型设置。

选择检查项目,运行检查,修改不符合的项目。

analysis->modeladvisor,针对模型,可选项目包括MISRA、ISO26262等。

选中bytask,右侧点击runselectedchecks。

analysis->datatypedesign->fixedpointtool,进入设置后,左侧选择项目,右侧运行检查。

code->C/C++code->codegenerationadvisor,针对生成代码,可选项目有空间效率、执行效率、可追踪性、安全预警、MISRAC:

2012guidelines等。

检查项目可能会弹出一些警告,是之前手动设置的,这时选择忽略。

比如内联参数有效率,但想要用可调参数,就只能忽略检查时的警告。

6)点击图标

,编译模型生成代码。

完成后可查看报告。

 

算法代码如下:

数据定义如下:

1.Simulink生成代码相关工具

在“1简单示例”一节,介绍了代码生成的详细过程。

其中一些常用的工具及菜单,现罗列于表1中。

表1.常用工具及菜单

图标

名称

最方便的位置

功能

LibraryBrowser

工具栏图标

基本模块库,搭建模型的基本元素所在库。

ModelConfigurationParameters

工具栏图标

模型配置参数,模型仿真、生成代码所依赖的全局规则。

ModeData

菜单View-----ModeData

列表显示当前层级模型的信号、参数、状态等,可以在此处集中编辑。

ModelExplorer

工具栏图标

树状结构的模型管理器,包括数据、配置、子模块等。

从树状结构可以看出,每一个模型都单独包含数据数据、配置等元素。

ModelAdvisor

工具栏图标

根据选定项,针对模型设计,进行检查,提供建议。

用户根据建议修改自己的模型。

CodeGenerationAdvisor

ModelAdvisor----图标下拉

根据选定项,针对代码生成设置,进行检查,提供建议。

用户根据建议修改自己的模型。

Fixed-PointTool

菜单Analysis-----dataTypeDesign-Fixed-PointTool

针对定点数设计,进行检验,提供建议。

用户可以根据建议修改自己的模型。

BuildModel

工具栏图标

根据配置,编译模型生成代码。

图标下拉栏还有:

编译备选子系统,嵌入式代码快速向导。

快速向导按步骤生成新配置,并依次生成代码。

Run

工具栏图标

模型仿真运行。

一般首先会用仿真验证模型。

 

2.Coder保留的默认名称

在“1简单示例”一节,生成的代码中出现了一些固定的名称,这些是代码生成器保留的默认名称,用户不能改变。

为方便理解生成的代码,将这些默认名称及含义列于表1中。

表2.生成代码中的默认名称

默认名称

含义

默认名称

含义

U

整个模型的输入模块

local

局部变量加的前缀

Y

整个模型的输出模块

rt

全局变量的前缀,可设置

B

模块输出信号

rtb

局部模块输出的前缀,可设置

P

模块参数

_T

默认类型后缀,可替换

DW

离散模块状态

step

模型入口,可设置

DefaultP

默认参数

initialize

模型初始化,可设置

Ext

全局类型加的前缀

3.代码重用

该部分将搭建一个稍微复杂模型,封装参数,生成可重用代码。

7)建立如图2模型。

图2.PID模型

8)选中上面模型,右键,createsubsystemfromselection.进入子系统,按上面介绍的方法编辑各基本模块。

为信号和状态起名,设置输入数据类型,输出数据类型和输入保持一致。

参数设置为结构体,比如KpGain的值设置为pid.Kp,数据类型继承。

9)返回模型上一级,修改子系统名称为Dpid,选中子系统右键->mask->editmask,在parameter选项卡,编辑参数,将名称设为pid。

10)右键->subsystemparameters,勾选treatasatomicunit,functionpacking设为reusable,函数名设为UnSatIntPid。

11)打开modelexplorer,在数据字典中添加simulinkbus类,选中该类,右下角launchbuseditor进入编辑,设置类名称为PidParaStrc,将参数按名称依次添加到类,并设置基本数据类型。

12)在数据字典中添加simulinkparameter对象,将对象数据名称设为DpidPar,类型设为PidParaStrc,值设为struct,存储类型设为ExportedGlobal。

在DpidPar值属性列,编辑与PidParaStrc类成员对应的参数名称,并赋值。

将simulink参数DpidPar复制一份,编辑其参数值。

13)将子系统Dpid复制一份,名称改为Qpid,设置mask参数为QpidPar,连上输入输出,最终模型如图所示。

图3.代码重用演示模型

14)设置好模型配置参数,编译生成代码,查看生成的报告。

 

整个模型的代码如下,调用两次UnSatIntPid函数,分别传入不同的参数。

生成可重用的算法如下所示,函数名为设置的UnSatIntPid,函数参数有四个,依次是给定,反馈,子系统状态,PidParaStrc参数。

4.数据重用

嵌入式应用多用查表的方式实现较复杂的数学函数,比如三角函数。

而且为了保证精度,表格的数据一般较多。

通常,如正弦函数,会充分利用周期性对称性,查找(0,pi/2)的sin表格。

本部分将演示,将(0,pi/2)的sin表格定义为全局const变量,单独放在一个文件,实现sin/cos函数。

15)建立如图4模型实现sin查表。

图4.sin查表模型

模型输入为无符号短整型,执行环境下输入角度信号,ufix(16,15)类型,1代表360度。

输出为sfix(16,15),为sin查表值。

模型使用同一个[0,pi/2)的sin表,表长256,表数据类型同输出。

16)设置查表模块名称为SinTab90d,右击设置属性,表格数据设置为SinTab90d,数据类型继承。

对SinTab90d建立Simulink.Patameter对象,保存到数据字典。

参数值设置为sin([0:

pi/2/255:

pi/2]),数据类型设置为fixdt(1,16,15),存储类型设置为ConstVariable(Custom),定义文件、头文件设置为LkupTab。

然后复制出其余四个查表模块。

17)将模型封装为可重用子模块。

18)按同样的方法,可利用[0,pi/2)的sin表格实现cos查表。

19)最后建立如图5模型,对算法进行仿真,验证算法输出是否没有错误。

图5.正弦查表算法仿真验证

仿真结果如图6,从图中可看出,一个周期内计算结果均正确,算法得以验证。

图6.正弦查表模型仿真波形

20)剔除仿真用的信号发生和示波器,接输入输出端口,设置,然后生成代码。

整个模型的入口函数为:

按配置,模型为表格生成单独的文件:

 

生成可重用的LkupSin函数如下,函数第一个参数为输入,第二个参数为输出。

 

更多使用方法,请参见MATLAB软件help。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1