【笔记】matlab建模生成代码注意事项

一、代码生成后,查看生成报告。

如下图所示:

model_gen_1.png

代码文件简介:

1、ert_main.c

该文件中会调用 “模型名称_step();”函数,用于单步执行,可以根据实际情况放在定时器中断或者任务调度里面执行该函数。
除此之外,该文件中的main函数会初始化模型,调用“模型名称_initialize();”函数。该函数实际使用时也必须在模型执行前初始化。
在实际使用时该文件不必添加进工程。

2、模型名称_Y100.c

该文件是根据模型生成的代码,包含“模型名称_step();”函数,“模型名称_initialize();”函数,“模型名称_terminate(void);”函数。

3、模型名称_Y100.h

该文件包含模型中的模块数据结构定义。

4、模型名称_Y100_private.h

该文件包含模型中的私有变量,主要是声明的全局变量。

5、模型名称_Y100_types.h

该文件包含模型中的结构体定义。

6、shared_files

该文件夹中的文件是一些乘除法的函数方法,需要添加至工程中。文件在./slprj/ert/_sharedutils目录中。
model_gen_2.png

7、OtherFiles

该文件夹中是在配置中的source files,如图所示。需要添加至工程中进行编译。
model_gen_3.png

model_gen_4.png

8、模型中使用C CALLER或者S-Function模块

模型中使用C CALLER或者S-Function模块调用C文件中的函数时,需要将对应的文件添加至simulation target中。
model_gen_5.png

9、模型中调用其他模型文件

这种情况生成的代码报告在下图所示中。
model_gen_6.png

生成的代码在./slprj/ert目录下,对应的模型名称的文件夹中,生成代码后要在编译环境如KEIL中添加对应的搜索路径。
model_gen_7.png)model_gen_8.png

二、模型制作中的数据结构

1、声明使用全局变量

采用数据字典定义我们的数据结构便于管理,如要想使用全局变量,存储类型要选“importedExtern”,生成的代码会在.h文件中进行声明。
model_gen_9.png
如果是定义全局变量,要选择“exportedGlobal”。
model_gen_10.png
调用如下图所示
model_gen_11.png

2、定义全局信号对象

如下图所示,如果是数组,在dimensions中可以输入[1 8]。
model_gen_12.png
调用如下图所示:
model_gen_13.png
这里选中信号名称和模型信号对象绑定,生成的代码输出也将使用对应的信号对象名称。如果是全局变量可以方便在其他地方调用。
model_gen_14.png

三、模型制作中的一些其他操作

1、任务调度

实际使用过程中,通常会对不同的模块按不同的间隔执行,也就是任务调度,比如taskA需要10ms间隔执行,taskB需要100ms时间间隔执行,所以这里我们利用“Function-Call Generator”模块配合状态机实现任务调度。分别实现10ms、100ms、200ms的任务调度。
model_gen_15.png
Function-Call Generator”模块中的采样时间设为1,不使用小数,提高计算精度,实际调用的时候1ms执行一次本模块。
状态机的模型如下:
model_gen_16.png
设置对应的输入输出事件,如下图。
model_gen_17.png
model_gen_18.png
实际测试结果无误。

model_gen_19.png

2、初始化变量

在模型设计过程中,可能会出现这样的需求,比如ECU上电后,从EEPROM读出上次断电前保存的数据,而且只赋值一次,后续使用新计算的值。
如下图所示,上电后从EEPROM读取的值是SOC_From_EE,然后需要进行第一次累加,不然第一次的值是0,又要从0开始累加,并不是上次断电后的值。
model_gen_20.png
这里首先想到的是使用IC模块赋值,如下图所示。
model_gen_21.png
但是IC模块的参数不能是变量,所以放弃了这种操作,使用状态机来进行。
model_gen_22.png
状态机如下图所示:使用一个IF-ELSE模块,上电init_i=0,初始化一次,然后init_i置1,不再执行SOC_From_EE赋值。
model_gen_23.png
下图为状态机的数据和事件。
model_gen_24.png
生成的代码如下:
model_gen_25.png

3、Data Store Memory

使用data store memory进行局部变量的存储。
model_gen_26.png
然后使用data store write将变量存储,data store read读出变量。
model_gen_27.png
model_gen_28.png
生成的代码如下:
model_gen_29.png


文章作者: Rayu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rayu !
 上一篇
Matlab生成stm32代码 Matlab生成stm32代码
一、整体思路利用Matlab的simulink搭建模型生成C代码,通过stm32cubemx生成工程,最后在KEIL或者IAR等工具里面编译生成代码下载至MCU中执行。本文以流水灯建立模型和简单使用定时器为例进行演示。 二、开发环境1、安装
2019-12-18
下一篇 
基于ESP8266的微信门铃 基于ESP8266的微信门铃
基于ESP8266的微信门铃前言最近在学习ESP8266,所以想用他来做个小玩意儿。 于是就有了这篇文章,其实最终实现的效果很简单。 就是当门铃按键按下,微信会收到消息提醒。 当然这只是初期,拓展的话可以进一步设计一套协议,添加更多设备
2017-11-13 Rayu
  目录