Simulink代码生成: 使能子系统及其代码

本文描述使能子系统的建模并研究生成的代码。

1 Simulink中的使能子系统

使能子系统是一种特殊的原子子系统。它的顶部有一个使能输入信号,当该信号为正数的时候,使能子系统被执行。
在这里插入图片描述
打开使能子系统里面,可以看到一个使能模块。
在这里插入图片描述

2 使能子系统建模示例

2.1 基本用法

1.建立如下使能子系统的测试模型,用一个Signal Builder输入子系统的In1和使能模块,并用一个Scope模块来观测输入输出。
在这里插入图片描述
2.子系统里面用一个简单的增益模块。
在这里插入图片描述
3.然后Run一下模型,打开Scope可以看到仿真结果并分析。
在这里插入图片描述
0-2秒的时候,使能信号(图1)为0,所以使能子系统没有被触发,Out1的结果是默认的0;2-4秒的时候,由于触发了使能子系统,所以Out1等于输入值2(图2)乘以增益值2,为4;4-10秒的时候,使能信号即使为0,Out1的值依然保持为4;
那么问题来了,使能信号为0的时候,为什么输出值保持不变呢?这是因为在使能子系统内的Out1被默认配置为held,即保持不变。

4.打开使能子系统的Out1配置面板,将参数Output when disabled设为reset,以及将Initial output设为0,如图所示。
在这里插入图片描述
然后再次Run一下模型,可以看出,当使能信号为0的时候,输出值也置为了初始值0.
在这里插入图片描述

2.2 保持输出结果

2.1中讲解了输出口可以配置成reset或者hold,其实博主很喜欢这个Hold的配置,因为工作中经常需要将某个信号保存下来,就可以用这个功能。

例如,在车辆运行过程中,如果想要存下历史数据中的最大车速,就可以像下面那样建模。其中,输入是CAN信号上的车辆速度,输出是历史最大车速。
在这里插入图片描述
其中的含义是输出如果小于输入,就把输入信号通过使能子系统放出去赋值给输出,否则就保持原来的输出。因此,输出的值就是历史最大车速。

3 使能子系统代码生成

根据上文说的两种对Outport的配置方式,分别研究其生成的两种代码。

3.1 输出口配置为held

1.首先将上文的测试模型做一些修改,将输入输出用port端口代替。
在这里插入图片描述
2.将子系统内部的Out1端口的Output when disabled设置为held。
在这里插入图片描述
3.Ctrl + B生成代码并分析。
在这里插入图片描述
分析代码中的step函数可知,生成的代码用if条件判断In1是否大于零,决定是否执行Out1=In2*2这段代码,从而达到使能的效果。

值得注意的是,这个条件语句并没有跟随else,也就是说只要In1大于零触发了一次,即使接下来的采样周期中In1等于零,以后Out1的数值也一直保持上一次触发时候的计算结果。直到下一次触发的时候,输入的In2发生了变化,输出的Out1才会改变。

这也印证了模型中Out1端口把Output when disabled配置成held的效果。

3.2 输出口配置为reset

2.将子系统内部的Out1端口的Output when disabled设置为reset。
在这里插入图片描述
2.Ctrl + B生成代码并分析。
在这里插入图片描述
可以看出,这次的代码复杂了一些。首先,代码中的外层条件语句加上了else关键字。这是为了在In1等于0的时候,将Out1置为初始值。

但是代码中又嵌套了一个判断,并且以EnabledSubsystem_MODE这个布尔量作为判断条件。这是为了标志出现在的触发状态,给下一个采样周期做判断用。

比如说,第一个采样周期中,In1是使能的,就会把EnabledSubsystem_MODE置为true;如果第二个采样周期不使能,同时检测EnabledSubsystem_MODE得知上一个周期是使能的,就会把输出值初始化为0,同时把EnabledSubsystem_MODE置为false;假如第三个采样周期同样不使能,检测出第二个周期也不使能,就不会把已经置为0地Out1再做一遍置零操作了。这部分操作可以细细地品一下。

4 扩展

除了输出端口可配置以外,enable这个模块也可以配置,达到不同的效果。不过这部分用到的不多,有需求的时候可以更仔细地研究一下。
在这里插入图片描述
>>返回个人博客总目录

  • 23
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值