Simulink代码生成: MinMax模块及其代码

本文研究MinMax模块的用法和该模块生成的代码,同时指出该模块使用时的一个注意点。

1 Simulink中的MinMax模块

在Simulink中,MinMax通常有多个输入信号,然后输出其中最大的或者最小的那个值。
在这里插入图片描述
在该模块的配置界面可以配置输入信号的数量,以及输出的是最大值还是最小值。

2 MinMax模块建模

通过一个简单的模型,可以直观地理解MinMax模块的用法。

1)新建一个Simulink模型,拖入一个MinMax模块。双击该模块,配置输入port数量为2,模式选为Max。
在这里插入图片描述
2)输入加上2个const常量,数值分别为5和10,输出加上display模块用于观测结果。运行模型仿真可以看到,输出了两个数中较大的10。
在这里插入图片描述

3 MinMax模块的代码

MinMax模块的用法很简单,但是在生成代码的时候就有一些问题。

把上一章节的模型的输入输出换成Inport和Outport,配置好Embedded Coder。

1)当不做任何配置的时候,模型的两个输入是double类型。

在这里插入图片描述
生成的代码直接调用了一个<math.h>中的内置函数fmax做了个比较。
在这里插入图片描述
如果是两个single浮点数输入,那么代码中就是float类型,代码中就会用 fmaxf这个内置函数。

如果MinMax的配置为min,生成的代码中则会实用fmax和fminf函数。

2)当两个输入都是整形数,例如都是uint8,代码会有所不同。因为整型数没有fmax函数,所以会用一个if语句来判断哪个输入比较大,再赋值给输出。
在这里插入图片描述

4 MinMax模块的bug

博主在工作中,用Matlab2018a的时候就发现了MinMax这个常用模块的一个bug,所以记录于此,希望博友们能避开这个坑点。

4.1 bug复现

复现这个bug的办法是,用Matlab2018a建模,将输入的两个常数设为uint8(1)和int8(5),将MinMax模块配置为min,输出数据类型改为继承内部规则。
在这里插入图片描述
然后再仿真模型,正常情况下,输入1和5,那么应该输出其中较小的1才对。但是仿真后的结果是输出了0,并且类型是个定点数。
在这里插入图片描述
再修改一下输入,设为uint8(3)和int8(7),输出的却是2.
在这里插入图片描述
博主试了很多次,只要是输入是奇数,并且分别为无符号整型和有符号整型时,输出就会不正常,会比预期的数值少了1.

4.2 bug模型的代码

将模型的输入端口配置成无符号整型和有符号整型,如下图。
在这里插入图片描述
然后Ctrl + B生成代码。
在这里插入图片描述
代码中用了一个临时变量tmp,然后再给输出参数赋值之前把tmp右移一位。说实话这段代码的操作博主也并没有看懂,如果有博友明白的希望指点一二。但是博主认为,仿真的时候都有问题,不管代码啥样子,那肯定是不能拿去编译的。

解决这个bug的最好办法应该是把MinMax的输入保持一致,如果不一致的话,用Data Type Conversion转成一致的类型再去使用。

5 总结

MinMax模块本身很简单,正常情况下的代码也很容易。在使用的时候只要注意到博主说的这个bug即可。

>>返回个人博客总目录

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值