首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-22 01:02
  • 3061
  • 8253
blog.csdn.net

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

文章目录

  • 1 问题引入
  • 2 Initialize Function子系统
  • 3 建模示例与代码生成
    • 3.1 模型搭建
    • 3.2 代码生成
  • 4 生成Terminate或Reset函数
  • 5 总结

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;
  • 1

然后会在工作区新建一个名为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子系统可以很灵活地控制生成初始化函数的代码,因此对初始化函数有一定需求的时候可以考虑这种建模方式。

>>返回个人博客总目录

注:本文转载自blog.csdn.net的chhttty的文章"https://blog.csdn.net/u013288925/article/details/113445139"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top