一、代码生成后,查看生成报告。
如下图所示:
代码文件简介:
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目录中。
7、OtherFiles
该文件夹中是在配置中的source files,如图所示。需要添加至工程中进行编译。
8、模型中使用C CALLER或者S-Function模块
模型中使用C CALLER或者S-Function模块调用C文件中的函数时,需要将对应的文件添加至simulation target中。
9、模型中调用其他模型文件
这种情况生成的代码报告在下图所示中。
生成的代码在./slprj/ert目录下,对应的模型名称的文件夹中,生成代码后要在编译环境如KEIL中添加对应的搜索路径。
)
二、模型制作中的数据结构
1、声明使用全局变量
采用数据字典定义我们的数据结构便于管理,如要想使用全局变量,存储类型要选“importedExtern”,生成的代码会在.h文件中进行声明。
如果是定义全局变量,要选择“exportedGlobal”。
调用如下图所示
2、定义全局信号对象
如下图所示,如果是数组,在dimensions中可以输入[1 8]。
调用如下图所示:
这里选中信号名称和模型信号对象绑定,生成的代码输出也将使用对应的信号对象名称。如果是全局变量可以方便在其他地方调用。
三、模型制作中的一些其他操作
1、任务调度
实际使用过程中,通常会对不同的模块按不同的间隔执行,也就是任务调度,比如taskA需要10ms间隔执行,taskB需要100ms时间间隔执行,所以这里我们利用“Function-Call Generator”模块配合状态机实现任务调度。分别实现10ms、100ms、200ms的任务调度。
Function-Call Generator”模块中的采样时间设为1,不使用小数,提高计算精度,实际调用的时候1ms执行一次本模块。
状态机的模型如下:
设置对应的输入输出事件,如下图。
实际测试结果无误。
2、初始化变量
在模型设计过程中,可能会出现这样的需求,比如ECU上电后,从EEPROM读出上次断电前保存的数据,而且只赋值一次,后续使用新计算的值。
如下图所示,上电后从EEPROM读取的值是SOC_From_EE,然后需要进行第一次累加,不然第一次的值是0,又要从0开始累加,并不是上次断电后的值。
这里首先想到的是使用IC模块赋值,如下图所示。
但是IC模块的参数不能是变量,所以放弃了这种操作,使用状态机来进行。
状态机如下图所示:使用一个IF-ELSE模块,上电init_i=0,初始化一次,然后init_i置1,不再执行SOC_From_EE赋值。
下图为状态机的数据和事件。
生成的代码如下:
3、Data Store Memory
使用data store memory进行局部变量的存储。
然后使用data store write将变量存储,data store read读出变量。
生成的代码如下: