我是靠谱客的博主 跳跃帽子,最近开发中收集的这篇文章主要介绍matlab编译模型初始化,matlab建模生成代码注意事项,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

如下图所示:

198e0d0adce38d5c41d350772196323a.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目录中。

adc92d3df51e2171d267a41a3fb2e3df.png

7、OtherFiles

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

96ce0e64d0781892e3d4b5fd28621338.png

3d3d33f6fec5ad965aa9bf77fe9a5462.png

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

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

f55b4797acf06bf6624516f0841f1608.png

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

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

c7ddc5775e50703fe2fce32f6e6d4ad6.png

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

28e486b08a82dc8dde81fca5ac8c4e72.png

690b47cece52785e238cafdc9bd2984c.png

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

1、声明使用全局变量

采用数据字典定义我们的数据结构便于管理,如要想使用全局变量,存储类型要选“importedExtern”,生成的代码会在.h文件中进行声明。

62a4f740ab9354c6280addbb12867753.png

如果是定义全局变量,要选择“exportedGlobal”。

ad3ac0e588164e4dd51b05130fc9eeea.png

调用如下图所示

78888a1d4ae9737e4b55d7e9a47de6d2.png

2、定义全局信号对象

如下图所示,如果是数组,在dimensions中可以输入[1 8]。

b875a39b91ac4cc2155009eb8bcf46c0.png

调用如下图所示:

e7c7d5904811188549e0b9e47d5e1f98.png

这里选中信号名称和模型信号对象绑定,生成的代码输出也将使用对应的信号对象名称。如果是全局变量可以方便在其他地方调用。

dd8cba8b777063b178a8c598ad4dadfd.png

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

1、任务调度

实际使用过程中,通常会对不同的模块按不同的间隔执行,也就是任务调度,比如taskA需要10ms间隔执行,taskB需要100ms时间间隔执行,所以这里我们利用“Function-Call Generator”模块配合状态机实现任务调度。分别实现10ms、100ms、200ms的任务调度。

4295315bff457161733c92879171fd96.png

Function-Call Generator”模块中的采样时间设为1,不使用小数,提高计算精度,实际调用的时候1ms执行一次本模块。

状态机的模型如下:

339e6499a07acc47a6e8713028e6f540.png

设置对应的输入输出事件,如下图。

d1ef93c1391a4c68355d9acd71305f05.png

185e7b3dbcee5b0ccc3223849886e6c2.png

实际测试结果无误。

345b78fccad3f813003fbf7d3ac1a15b.png

2、初始化变量

在模型设计过程中,可能会出现这样的需求,比如ECU上电后,从EEPROM读出上次断电前保存的数据,而且只赋值一次,后续使用新计算的值。

如下图所示,上电后从EEPROM读取的值是SOC_From_EE,然后需要进行第一次累加,不然第一次的值是0,又要从0开始累加,并不是上次断电后的值。

0c6671450a403f41e78d7f688986d98d.png

这里首先想到的是使用IC模块赋值,如下图所示。

44edc02ce51043b0f12b51e9d109b39c.png

但是IC模块的参数不能是变量,所以放弃了这种操作,使用状态机来进行。

7045e51b81e59ff7cdd4de4040ed387c.png

状态机如下图所示:使用一个IF-ELSE模块,上电init_i=0,初始化一次,然后init_i置1,不再执行SOC_From_EE赋值。

0e86b7e598c3a9fd749ccdfb58d0ffdf.png

下图为状态机的数据和事件。

1bd9dc046c83834b6b77352f4790de67.png

生成的代码如下:

f870f14e4a379cb681b8a1a2c2bc91e6.png

3、Data Store Memory

使用data store memory进行局部变量的存储。

03c9291d36b82d92e1b757ce6e86b6ba.png

然后使用data store write将变量存储,data store read读出变量。

2468195c42ec5e73df8a39cd4ee7fc30.png

992bd75bbb798660248d055dba48f3f8.png

生成的代码如下:

db6b99f501f77ae4096111c447a72b5a.png

最后

以上就是跳跃帽子为你收集整理的matlab编译模型初始化,matlab建模生成代码注意事项的全部内容,希望文章能够帮你解决matlab编译模型初始化,matlab建模生成代码注意事项所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部