主要内容

提高代码可读性为MATLAB函数块

要求使用可读性优化

使用可读性优化你的代码,你必须有一个嵌入式编码器®许可证。这些优化仅出现在嵌入式实时代码生成()目标。

请注意

这些优化不适用于MATLAB®文件,你的电话MATLAB函数块。

有关更多信息,请参见配置一个系统目标文件

转换If-Elseif-Else代码切换实例语句

为嵌入式实时目标生成代码时,您可以选择转换if-elseif-else决策逻辑,切换实例语句。这种转换可以提高代码的可读性。

例如,当一个MATLAB函数块包含了一长串的条件切换实例结构:

  • 减少使用括号和大括号

  • 最大限度地减少重复生成的代码

如何将If-Elseif-Else代码切换实例语句

以下步骤描述了如何转换生成的代码MATLAB函数块从if-elseif-else切换实例语句。

一步 任务 参考
1

验证您的块遵循的规则转换。

验证的内容块
2

使转换。

使转换
3

为您的模型生成的代码。

为您的模型生成代码

转换规则

转换发生,必须持有以下规则。lh和RHS参考左边和右边的条件,分别。

构造 规则
MATLAB函数

必须有两个或两个以上的吗独特的条件,除了一个默认。

有关更多信息,请参见转换如何处理重复的条件

每个条件

必须测试平等。

必须使用相同的变量或lh的表达式。

请注意

你可以扭转lh和RHS。

每一个韩

必须是一个变量或表达式,而不是一个复合语句。

不能一个常数。

必须有一个整型或枚举数据类型。

不能对模拟有副作用。

例如,lh可以读但不能写全局变量。

每一个园艺学会

必须是一个常数。

必须有一个整型或枚举数据类型。

转换如何处理重复的条件

如果一个MATLAB函数块复制条件,转换只保留第一个条件。生成的代码丢弃重复条件的其他实例。

删除重复后,必须存在两个或两个以上的独特条件。否则,不发生转换,生成的代码包含实例重复的条件。

下面的例子展示如何转换处理重复的条件。

生成的代码的例子 代码转换后
if (x = = 1) {block1} else if (x = = 2) {block2} else if (x = = 1){/ /复制block3} else if (x = = 3) {block4} else if (x = = 1){/ /复制block5} {block6}其他
开关(x){案例1:block1;打破;案例2:block2;打破;案例3:block4;打破;默认值:block6;打破;}
if (x = = 1) {block1} else if (x = = 1){/ /复制block2} {block3}其他

不会改变,因为只存在一个独特的条件吗

转换代码的例子If-Elseif-Else决策逻辑来切换实例语句

假设你有以下模式MATLAB函数块。假定输出数据类型和输入数据类型控制器枚举类型定义。

块包含以下代码:

函数系统= fcn(类型)% # codegen如果系统(type = = Controller.P) = 0;elseif (type = = Controller.I)系统= 1;elseif (type = = Controller.PD)系统= 2;elseif (type = = Controller.PI)系统= 3;elseif (type = = Controller.PID)系统= 4;其他系统= 10;结束

枚举类型定义Controller.m是:

classdef控制器<仿真软件。金宝appIntEnumType枚举P(0)我(1)PD(2)π(3)PID(4)未知(10)结束

如果你为嵌入式实时生成代码的目标使用默认设置,你看到的是这样的:

如果(if_to_switch_eml_blocks_U。In1 = = P) {/ * < S1 >: 1:4的* / / * < S1 >: 1:5的* / if_to_switch_eml_blocks_Y。着干活= 0.0;如果(if_to_switch_eml_blocks_U}其他。In1 = =我){/ * < S1 >: 1:6的* / / * < S1 >: 1:7的* / if_to_switch_eml_blocks_Y。着干活= 1.0;如果(if_to_switch_eml_blocks_U}其他。In1 = = PD) {/ * < S1 >: 1:8的* / / * < S1 >: 1:9的* / if_to_switch_eml_blocks_Y。着干活= 2.0;如果(if_to_switch_eml_blocks_U}其他。In1 = =π){/ * < S1 >: 1:10的* / / * < S1 >: 1:11的* / if_to_switch_eml_blocks_Y。着干活= 3.0;如果(if_to_switch_eml_blocks_U}其他。In1 = = PID) {/ * < S1 >: 1:12的* / / * < S1 >: 1:13的* / if_to_switch_eml_blocks_Y。着干活= 4.0; } else { /* ':1:15' */ if_to_switch_eml_blocks_Y.Out1 = 10.0; }

lh变量if_to_switch_eml_blocks_U.In1在生成的代码中多次出现。

请注意

默认情况下,变量出现在块不保留他们的名字在生成的代码中。修改标识防止命名冲突。

每组之间的可追溯性的评论出现/ ** /标记。了解更多关于可追溯性,明白了在MATLAB函数块使用的可追溯性

验证的内容块

检查块遵循规则转换规则

构造 如何构建遵循规则
MATLAB函数

五个独特的条件存在,除了默认值:

  • (= = Controller.P型)

  • (= = Controller.I型)

  • (= = Controller.PD型)

  • (= = Controller.PI型)

  • (= = Controller.PID型)

每个条件

每一个条件:

  • 测试平等

  • 使用相同的输入lh

每一个韩

每个lh:

  • 包含一个变量

  • 块的输入,因此不是一个常数

  • 的枚举类型控制器您定义的Controller.m在MATLAB路径上

  • 不会影响模拟

每一个园艺学会

每一个园艺学会:

  • 是一个枚举值,因此一个常数

  • 的枚举类型控制器

使转换

  1. 打开配置参数对话框。

  2. 代码生成窗格中,选择ert.tlc系统目标文件

    这一步中指定一个嵌入式实时目标模型。

  3. 代码生成>代码风格窗格中,选择转换if-elseif-else模式切换实例语句复选框。

    提示

    这种转换在每个模型的基础上工作。如果您选中此复选框后,转换适用于:

    • MATLAB函数在一个模型

    • MATLAB函数Stateflow®图表的模型

    • 流程图在Stateflow图表模型

    有关更多信息,请参见增强代码的可读性流程图

为您的模型生成代码

在模型窗口中,出版社Ctrl + B

的代码MATLAB函数块使用切换实例语句代替if-elseif-else代码:

开关(if_to_switch_eml_blocks_U.In1){案例P: / * < S1 >: 1:4的* / / * < S1 >: 1:5的* / if_to_switch_eml_blocks_Y。着干活= 0.0;打破;我:/ * < S1 >: 1:6的* / / * < S1 >: 1:7的* / if_to_switch_eml_blocks_Y。着干活= 1.0;打破;例PD: / * < S1 >: 1:8的* / / * < S1 >: 1:9的* / if_to_switch_eml_blocks_Y。着干活= 2.0;打破;PI: / * < S1 >: 1:10的* / / * < S1 >: 1:11的* / if_to_switch_eml_blocks_Y。着干活= 3.0;打破;案例PID: / * < S1 >: 1:12的* / / * < S1 >: 1:13的* / if_to_switch_eml_blocks_Y。着干活= 4.0;打破; default: /* ':1:15' */ if_to_switch_eml_blocks_Y.Out1 = 10.0; break; }

切换实例语句增强可读性提供以下福利:

  • 减少了使用括号及括号的代码。

  • lh变量if_to_switch_eml_blocks_U.In1只出现一次,减少重复的代码。

相关的话题