simulink代码生成主动生成子函数

背景

使用代码生成时,生成为一整块代码,考虑到减小栈空间消耗,
思考的两种方法
1、希望使用子函数的形式。
2、存在临时变量拷贝的,均改写成结构体/数组的指针

1 针对matlab function 代码生成,使用子函数的方法:

创建子系统时,设置为原子子系统,否则只是将系统进行简单的组合(group),在创建原子子系统之后,对代码生成项进行设置:
在这里插入图片描述

在这里插入图片描述

2 针对block 的代码生成,使用子函数的方法:

1、从Simulink Library中拖拽出一个Simulink Function子系统到空白模型中。
在这里插入图片描述

2、从外面可以观察到,Simulink Function子系统上方有一个引子,和一个函数表达式。左右两侧没有和子系统外界交互的端口,这一点和其他子系统不一样。

双击进入子系统,可以看到顶部的一个Trigger模块,以及输入输出端口。

在这里插入图片描述这里的输入输出端口和Inport/Outport模块是不一样的,因为这是专门用于Simulink Function子系统中的Argument Inport模块和Argument Outport模块。

3、双击Trigger模块,将函数名修改成function1,同时把Trigger模块的名称也改成function1。

在这里插入图片描述

这样的话,外面的子系统的函数原型也就变成了 y = function1(u)。
在这里插入图片描述

可选:Function visibility配置
生成的函数名中带有模型名的前缀。如果将Simulink Function做一个Global配置,生成的名称就不一样,配置过程如下。
1)双击Simulink Function的Trigger模块,将Function visibility配置成global,并确认。
2)然后在子系统的正中间就会出现一个global的标志,代表它是全局的。

建立好Simulink Function子系统后,就可以用Function Caller模块在模型的其他地方调用这个子系统的功能。

1)新建一个Function Caller模块,将其中的Function Prototype改成上文的函数原型 : y = function1(u)。

在这里插入图片描述

2)为Function Caller模块添加一个常数输入和一个disp输出并仿真,测试一下调用的效果。
在这里插入图片描述

由图中可见,Function Caller模块调用了function1的gain功能。

输入参数为结构体

对于参数为结构体的情况,需要在Argument Inport或者Argument Outport中将类型配置为bus。后面演示输入端口配置成bus的情况。

1)在Matlab工作空间新建一个bus1,并配置2个element成员
在这里插入图片描述
2) 将Argument Inport的类型配置为bus1。

在这里插入图片描述
3)用Bus Selector模块,把element1挑选出来输出给后面的算法模块。

在这里插入图片描述
4)重新Ctrl + B生成代码如下。
在这里插入图片描述

这里生成的函数的参数是一个结构体指针。结构体的定义在另一个文件中。

在这里插入图片描述

参考

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

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值