Simulink代码生成: Initialize Function子系统及其代码

本文研究 Initialize Function子系统、建模方法及其生成的代码。

1 问题引入

博主在以前的博客中经常研究step函数中的内容,因为step函数中的代码和Simulink模型中的算法密切相关。对于初始化函数,博主研究的比较少,但也十分重要。在控制器上电的时候,由操作系统调用一次初始化函数。

通过配置Simulink.Signal对象,可以将输入输出的初始化函数生成在initialize中,具体方法可以参考《Simulink代码生成: 信号线、参数配置》
在这里插入图片描述
除了这种方式,也可以在Initialize Function子系统中搭建初始化函数的模型。相比于上一种方式,Initialize Function子系统生成的初始化函数可以更加灵活,而不仅限于赋值一个常数。

2 Initialize Function子系统

新建一个Initialize Function子系统,如下图。
在这里插入图片描述
子系统中央用initialize标识出它是一个Initialize Function子系统,可以和其他子系统区分开来。

双击进入子系统,可以看到顶部有一个Event Listener模块。该模块可以配置成Initialize、Terminate和Reset三种形式,对应了三种子系统。
在这里插入图片描述
下面默认的输入很输出分别是常数模块和State Writer模块,后面建模演示的过程中不用这两种模块。
在这里插入图片描述

3 建模示例与代码生成

本章节假设输出信号初始化为一个外部的全局变量经过简单的放大运算,来演示博主平时使用Initialize Function子系统建模和生成代码的方法。

3.1 模型搭建

1)在Matlab命令行输入以下命令。

>> a1 = Simulink.Signal;

然后会在工作区新建一个名为a1的Signal对象。
在这里插入图片描述
2)双击工作区的a1对象,将Data type,Dimensions,Dimensions mode,Complexity,Storage Class属性改为下图所示。
在这里插入图片描述
注意,这里Storage Class属性为ImportedExtern,表示这是一个外部的全局变量。后续建模会将a1这个全局变量在初始化函数中赋值给输出信号。

3)进入Initialize Function子系统中,建立一个Data Store Read模块,一个Gain模块和outport模块。Data Store Read模块读出的名字是上一步建立的a1。
在这里插入图片描述
这么做的含义是,想要在生成的初始化函数中,将外部的全局变量a1乘以2,然后赋值给Output变量。

4)退出到Initialize Function子系统外的顶层模型,建立一个Function-Call子系统。
在这里插入图片描述
这个Function-Call子系统就会生成一个对应的step函数。

双击进入Function-Call子系统,配置一个简单的输入输出和Gain模块。那么step函数中应该是将输入变量乘以2再赋值给输出变量。
在这里插入图片描述
5)退出到顶层模型,用merge模块把Initialize Function子系统和Function-Call子系统的输出信号合并到一起。这个用法的原因是,这两个输出信号本质上是一个变量,只是出现在了不同函数中。在《Simulink代码生成: If-Action子系统及其代码》一文中也曾经有过这种用法。
在这里插入图片描述
这样的话,这个简单的demo模型就建立好了。

3.2 代码生成

配置好Embedded Coder,然后Ctrl + B生成代码如下。
在这里插入图片描述
主要观察以下demo.c中的step函数和initialize函数。在step函数中,每个步长将In1乘以2赋值给Out1;在initialize函数中,将a1乘以2赋值给Out1,作为Out1的初始值。

说明通过Initialize Function子系统,就可以通过建模的方法,在初始化函数中赋初始值。相比与在数据字典中填写初始值,这种方法会更加灵活,一更多的可操作空间。

4 生成Terminate或Reset函数

通过配置Initialize Function子系统中的Event Listener模块,就可以将该模块变成Terminate或Reset子系统。子系统上会有不同的图标和文字,如下图。
在这里插入图片描述
在这里插入图片描述
生成代码的时候也会生成对应函数的代码。
在这里插入图片描述
在这里插入图片描述

5 总结

Initialize Function子系统可以很灵活地控制生成初始化函数的代码,因此对初始化函数有一定需求的时候可以考虑这种建模方式。

>>返回个人博客总目录

Simulink中的子系统可以通过设置生成代码选项来生成相应的代码。在Simulink中创建子系统时,可以将其设置为原子子系统,并在代码生成选项中将其设置为可重用函数。生成的代码将包括一个原子子系统的输出和更新函数,以及一个模型步骤函数,用于调用和处理子系统的输出。生成的代码示例如下: ```c /* Output and update for atomic system: '<Root>/Subsystem' */ static real_T userAdd(real_T rtu_para1, real_T rtu_para2) { /* Sum: '<S1>/Add' */ return rtu_para1 + rtu_para2; } /* Model step function */ void test01_step(void) { /* Outputs for Atomic SubSystem: '<Root>/Subsystem' */ /* Outport: '<Root>/Output' incorporates: * Inport: '<Root>/para1' * Inport: '<Root>/para2' */ test01_Y.Output = userAdd(test01_U.para1, test01_U.para2); /* End of Outputs for SubSystem: '<Root>/Subsystem' */ } ``` 通过设置Simulink中的Solver和CodeGeneration选项页,可以进一步配置代码生成过程的细节。例如,设置Solver选项页可以用于设置模型的求解器配置,设置CodeGeneration选项页可以用于设置生成的代码的格式和选项。可以通过按下Ctrl + B快捷键来生成代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Simulink代码生成: 可变子系统及其代码](https://blog.csdn.net/u013288925/article/details/125707786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Simulink生成代码——子系统生成函数](https://blog.csdn.net/aoyousihaiqiuqihuang/article/details/120713945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Simulink自动生成代码的常见优化方法](https://download.csdn.net/download/weixin_38614112/14941618)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值