查看: 321|回复: 2|关注: 0

[未答复] Simulink/Stateflow/Matlab function三种方式生成代码疑问

[复制链接]

新手

10 麦片

财富积分


050


2

主题

6

帖子

0

最佳答案
发表于 2020-9-1 17:36:19 | 显示全部楼层 |阅读模式
本帖最后由 LYW_W1U34 于 2020-9-1 17:38 编辑

我在用标题三种方式搭建两个数相加的模型,分别生成三个函数,为什么代码中要先定义中间变量,再赋值给输出?代码如下
  1. void demo_S_Func_step(void)
  2. 5        {
  3. 6          int8_T rtb_TmpBlkForSigObjICAtMATLABFu;
  4. 7          rtb_TmpBlkForSigObjICAtMATLABFu = (int8_T) demo_S_Func_ADD_Func_Simulink(V_In1,
  5. 8            V_In2);
  6. 9          V_Out1 = rtb_TmpBlkForSigObjICAtMATLABFu;
  7. 10          rtb_TmpBlkForSigObjICAtMATLABFu = (int8_T) demo_S_Func_ADD_Func_Stateflow
  8. 11            (V_In1, V_In2);
  9. 12          V_Out2 = rtb_TmpBlkForSigObjICAtMATLABFu;
  10. 13          rtb_TmpBlkForSigObjICAtMATLABFu = (int8_T) demo_S_Func_ADD_Func_MFunc(V_In1,
  11. 14            V_In2);
  12. 15          V_Out3 = rtb_TmpBlkForSigObjICAtMATLABFu;
  13. 16        }
复制代码
   另外,为什么Stateflow/Matlab function生成的代码会进行数据溢出判断,而simulink没有?那溢出判断到底需不需要呢?
  1. int8_T demo_S_Func_ADD_Func_Simulink(int8_T rtu_V_In1, int8_T rtu_V_In2)
  2. 7        {
  3. 8          return (int8_T)(rtu_V_In1 + rtu_V_In2);
  4. 9        }
复制代码

  1. 6        int8_T demo_S_Func_ADD_Func_Stateflow(int8_T rtu_V_In1, int8_T rtu_V_In2)
  2. 7        {
  3. 8          int32_T tmp;
  4. 9          tmp = rtu_V_In1 + rtu_V_In2;
  5. 10          if (tmp > 127)
  6. 11          {
  7. 12            tmp = 127;
  8. 13          }
  9. 14          else
  10. 15          {
  11. 16            if (tmp < -128)
  12. 17            {
  13. 18              tmp = -128;
  14. 19            }
  15. 20          }
  16. 21        
  17. 22          return (int8_T)tmp;
  18. 23        }
复制代码
  模型和需要的信号,附件里有,然后matlab版本是2017b,谢谢回答

demo_S_Func.slx

32.7 KB, 下载次数: 0

模型

add_func.mat

2.34 KB, 下载次数: 0

需要的信号

回复主题 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


2

主题

6

帖子

0

最佳答案
 楼主| 发表于 2020-9-1 18:02:23 | 显示全部楼层
自己试了一下,把Optimization---Signals and parameters---Advanced parameters 中的Buffer for reusable subsystems,不选择,就没有中间变量了,但是溢出判断依然存在。
  1. void demo_S_Func_step(void)
  2. 5        {
  3. 6          demo_S_Func_ADD_Func_Simulink(V_In1, V_In2);
  4. 7          demo_S_Func_ADD_Func_Stateflow(V_In1, V_In2);
  5. 8          demo_S_Func_ADD_Func_MFunc(V_In1, V_In2);
  6. 9        }
  7. 10       
复制代码
     
微信截图_20200901175902.png
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


2

主题

6

帖子

0

最佳答案
 楼主| 发表于 2020-9-2 09:25:53 | 显示全部楼层
摸索了一下,发现Stateflow属性设置里面,不勾选Saturate on integer overflow,Stateflow生成的代码就不会进行溢出检测了
  1. <div class="blockcode"><blockquote>void demo_S_Func_ADD_Func_Stateflow(int8_T rtu_V_In1, int8_T rtu_V_In2)
  2. 7        {
  3. 8          V_Out2 = (int8_T)(rtu_V_In1 + rtu_V_In2);
  4. 9        }
复制代码



微信截图_20200902091113.png
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表