Simulink自动代码生成:原子子系统(Atomic Subsystem)

  在前两节的基础上我们继续来学习代码的优化,没看过我前两篇文章的可以先去看一下,否则可能觉得模型出现的很突兀。这一节我们来学习原子子系统,废话不多说,我们直接开始学习,看完了这一篇你就会明白什么是原子子系统以及原子子系统到底有什么作用。

一. 重复的功能模块

  在现实应用当中我们经常能遇到功能相同的模块,现在假设有三个模块,其功能一模一样。实现的都是:
Y 1 = ( X 1 + X 2 ) ∗ X 3 Y1 = (X1+X2) * X3 Y1=(X1+X2)X3
  所搭建的3个功能相同的模型如下图。
在这里插入图片描述
  在Build(Ctrl+D)没有问题后,我们来生成代码(Ctrl+B),所生成的代码如图所示。可以看到同样的功能代码生成了三次,这看上去好像也没什么,也就占了三行。但在实际编写代码时,实现一个功能的代码可能有成百上千行,此时我们再将代码写三次抑或是更多次,每次变量名还不能一样,这种做法显然是非常愚蠢的。因此通常的做法是将一个功能模块封装成一个函数,需要时我们只需要调用这个函数就可以了,这样可以大大减少代码量以及增加代码的可读性。原子子系统就可以解决以上问题,接下来我们就来揭开它神秘的面纱。
在这里插入图片描述

二. 建立原子子系统

  (1)首先,我们需要建立一个原子子系统,选中第一个功能模块,鼠标右键,选择创建子系统。

在这里插入图片描述
  (2)创建完成后,基于视觉上的享受,我们将子系统模块调整至合适大小,将所有信号线拉直,这看似对功能没有什么影响,但如果模块多了,功能复杂了,这将是非常有意义的一件事,否则别人阅读起来将是非常困难的,甚至自己过一段时间也会感觉很难看懂。实际上如果你去一家大企业工作,他们也是这么要求的,信号线基本不允许交叉,每一个信号线尽量保证是直的,除非确实需要弯。因此,我们要提前养成良好的习惯。回到正题,接下来选中所创建的子系统,鼠标右键,然后选择Block Parameters(Subsystem)创建一个子系统。
在这里插入图片描述
  (3)在弹出的对话框中进行如下设置。Function packaging是必须进行设置的,如果是默认状态,生成的代码将不会改变。Function name可以设置也可以不设置,不设置系统将自动分配一个名字,基本是:模型名_Subsystem。在这里我还是喜欢自己命名,实际编程时函数的名字也不是随意写的,函数名应该能尽量表示该函数所实现的功能。
在这里插入图片描述
在这里插入图片描述
  (4)其它两个模块也按照上述方式进行设置,或将设置好的模块复制两份,完成后如图所示。
在这里插入图片描述

  (5)再次生成代码,可以看到生成了一个名为MySelfFunction函数,所实现的功能正是我们之前提到的:
Y 1 = ( X 1 + X 2 ) ∗ X 3 Y1 = (X1+X2) * X3 Y1=(X1+X2)X3
在这里插入图片描述
  该函数在Calculation.c中被调用了三次,与之前直接写三次 Y1 = (X1+X2) * X3 有所区别,这正是我们想要的。
在这里插入图片描述
  除了以上建立原子子系统的方式,我们也可以在 Simulink Library Browser 中找到相应的模块,拖拽出来进行相应的配置,结果是一样的。
在这里插入图片描述

三. 原子子系统生成单独的文件

  时候我们不仅仅需要将功能封装成函数,甚至还需要将一个功能独立成一个文件,方便其它文件调用。这时我们就需要将函数独立出来,接下来我们就进行相应的配置。
  (1)依然是选中子系统,右键弹出的对话框选择Block Parameters(Subsystem)。对 File name options 及 File name 进行设置,如图所示(命名可以随意,但最好具有实际意义)。
在这里插入图片描述
  (2)再次编译并生成代码,可以看到生成了一个名字为 MySelfFunction.c 的源文件和一个名为 MySelfFunction.h 的头文件,函数名字不变,函数调用也没变。
在这里插入图片描述
在这里插入图片描述

四. 数据类型不同的原子子系统

  接下来我们看一下,若将第一个模块的输入类型改变后将会怎样,选中输入端子,将数据类型改成uint16(也可自己定),同样的方式将X2和X3的数据类型也改为uint16,另外两个子系统模块输入不变。
在这里插入图片描述
  完成以上修改后再次进行编译,可以发现系统报错,原因是不同数据类型的原子子系统使用了相同的函数名。
在这里插入图片描述
  将第一个子模块的函数名变为MySelfFunction1(为了区别于MySelfFunction),这样函数名就不会重复了,再次进行代码生成。
在这里插入图片描述
  可以看到,新生成的 MySelfFunction.c 文件中增加了一个输入类型为uint16,返回类型为uint32的函数MySelfFunction1(),为什么返回类型会变,是为了防止数据溢出。输入类型不同,返回类型不同的两个函数不可能是同一个函数,这也是之前报错的原因。
在这里插入图片描述
  在函数的调用时也可以看到,不同的数据类型调用了不同的函数,这才是符合要求的。
在这里插入图片描述

五. 总结

  以上就是原子子系统的建立方法及用途,在实际的工作中原子子系统将会经常用到,希望以上内容能够对大家有所帮助。接下来的文章中,我们将继续讲解代码的其它优化,欢迎大佬批评指正,同时也欢迎小伙伴们前来交流。

  • 41
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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
发出的红包

打赏作者

谁呀!咋滴了!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值