主要内容

增强代码的可读性流程图

为流程图所生成的代码

如果你有嵌入式编码器®你为模型,包括Stateflow生成代码®对象,代码从一个流程图类似样品。

应用以下特征:

  • 默认情况下,生成的代码使用if-elseif-else语句来表示开关模式。把要使用的代码切换实例语句,看到If-Elseif-Else代码转换为切换实例语句

  • 默认情况下,变量出现在流程图不保留他们的名字在生成的代码中。确保没有修改标识符命名冲突发生。

  • 可追溯性的评论出现在每组之间的转换/ ** /标记。了解更多关于可追溯性,明白了跟踪Stateflow元素生成的代码

示例代码的决策逻辑模式

如果(modelname_U。In1 = = 1.0){/ *转型:“< S1 >: 11 * / / *转型:“< S1 >: 12”* / modelname_Y。着干活= 10.0;/ *过渡:“< S1 >: 15 ' * / / *转型:“< S1 >: 16”其他* /}{/ *转型:“< S1 >: 10”如果(modelname_U * /。In1 = = 2.0){/ *转型:“< S1 >: 13 * / / *转型:“< S1 >: 14 * / modelname_Y。着干活= 20.0;/ *转型:“< S1 >: 16 * /}{/ *转型:其他的< S1 >: 17 * / modelname_Y。着干活= 30.0;}}

一个迭代循环的示例代码模式

(sf_i = 0;sf_i < 10;sf_i + +){/ *转型:“< S1 >: 40 * / / *转型:“< S1 >: 41 * / modelname_B。y = modelname_B。y + modelname_U.In1;/ *转型:“< S1 >: 39”* /}

一个开关模式的示例代码

如果(modelname_U。In1 = = 1.0){/ *转型:“< S1 >: 149”* / / *转型:“< S1 >: 150 * / modelname_Y。着干活= 1.0;/ *转型:“< S1 >: 151”* / / *转型:“< S1 >: 152”* / / *转型:“< S1 >: 158”* / / *转型:“< S1 >: 159”其他* /}{/ *转型:“< S1 >: 156”如果(modelname_U * /。In1 = = 2.0){/ *转型:“< S1 >: 153”* / / *转型:“< S1 >: 154 * / modelname_Y。着干活= 2.0;/ *转型:“< S1 >: 155”* / / *转型:“< S1 >: 158”* / / *转型:“< S1 >: 159”其他* /}{/ *转型:“< S1 >: 161 * / modelname_Y。着干活= 3.0;}}

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

为嵌入式实时目标生成代码时,您可以选择转换if-elseif-else代码切换实例语句。这种转换可以提高代码的可读性。例如,当一个流程图包含一长串的条件,切换实例结构:

  • 减少使用括号和大括号

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

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

一步 任务 参考
1

验证您的流程图如下所示的规则转换。

验证流程图的内容
2

使模型的转换和生成代码。

使转换
3

解决生成的代码。

  • 如果你看到切换实例陈述你的流程图,可以停止。

  • 如果你看到if-elseif-else陈述你的流程图,更新图表和重复前面的步骤。

解决生成的代码

转换规则

转换发生,遵循这些指导方针。lh和RHS参考左边和右边的条件,分别。

构造 规则
流程图

必须有一个默认的和两个或两个以上的独特的条件。

有关更多信息,请参见重复的条件

每个条件

必须测试平等。

必须使用相同的变量或lh的表达式。你可以扭转lh和RHS。

每一个韩

必须是一个变量或表达式。

不能一个常数。

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

不能有任何副作用模拟。

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

每一个园艺学会

必须是一个常数或一个参数。

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

重复的条件

如果一个流程图有重复的情况下,转换只保留第一个条件。丢弃重复条件的其他实例的代码。

删除重复后,必须存在两个或两个以上的独特条件。如果不是,转换不发生和代码包含了所有重复的条件。

生成的代码的例子 代码转换后
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}其他

没有变化,因为只有一个独特的条件存在

转换代码的例子切换实例语句

假设你有这个模型包含一个图表。

图表包含一个流程图和四个MATLAB®功能。

图表的MATLAB函数包含在表中列出的代码。在每种情况下,内联函数的选择汽车。内联函数的更多信息,请参阅指定属性的图形功能(Stateflow)

MATLAB函数 代码
停止
函数停止% # codegen coder.extrinsic (disp);disp (“。”) traffic_speed = 0;
经济放缓
函数放缓% # codegen coder.extrinsic (disp) disp(“慢下来”。)traffic_speed = 1;
加速
功能加速% # codegen coder.extrinsic (disp);disp(“沿着”。)traffic_speed = 2;
函数=光色(x) % # codegen if (x < 20)颜色= TrafficLights.GREEN;elseif (x > = 20 & & < 25)颜色= TrafficLights.YELLOW;其他颜色= TrafficLights.RED;结束

输出颜色函数的使用枚举类型TrafficLights。枚举类型定义TrafficLights.m是:

classdef TrafficLights <仿金宝app真软件。IntEnumType枚举红(0)黄(5)绿(10)结束

有关更多信息,请参见定义枚举数据类型(Stateflow)

验证流程图的内容

检查流程图Stateflow图表遵循规则转换规则

构造 如何构建遵循规则
流程图

一个默认的条件和两个独特的条件存在:

  • (光(十字路口)= =红色)

  • (光(十字路口)= =黄色)

每个条件

每一个条件:

  • 测试平等

  • 使用相同的函数调用光(路口)的韩

每一个韩

每个lh:

  • 包含一个表达式

  • 是一个函数调用的输出,而不是一个常数

  • 的枚举类型TrafficLights您定义的TrafficLights.m在MATLAB的道路。看到定义枚举数据类型(Stateflow)

  • 使用一个函数调用,没有副作用

每一个园艺学会

每一个园艺学会:

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

  • 的枚举类型TrafficLights

使转换

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

  2. 代码生成窗格中,选择ert.tlc系统目标文件ERT-based目标模型。

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

    如果您选中此复选框后,转换适用于:

    • 在所有图表模型的流程图

    • 一个模型的MATLAB函数在所有图表

    • 所有MATLAB函数在这种模式

  4. 在模型中,C代码选项卡上,单击构建从模型中生成源代码。

解决生成的代码

生成的代码流程图出现这样的代码:

如果(sf_color = =红色){/ *转型:“< S1 >: 11”* / / *转型:“< S1 >: 12”* / / * MATLAB函数“停止”:“< S1 >: 23”* / / *的< S1 >: 23:6 * / rtb_traffic_speed = 0;/ *过渡:“< S1 >: 15 ' * / / *转型:“< S1 >: 16”其他* /}{/ *转型:“< S1 >: 10 * / / * MATLAB函数“光”:“< S1 >: 19”如果(ifelse_using_enums_U * /。In1 < 20.0){/ *的< S1 >: 19:3 * / / * < S1 >:第4节的* / sf_color =绿色;如果(ifelse_using_enums_U}其他。In1 > = 20.0) & & (ifelse_using_enums_U。In1 < 25.0)){/ *的< S1 >:上19:5 * / / * < S1 >:十九章的* / sf_color =黄色;其他}{/ *的< S1 >: 19:8 * / sf_color =红;}如果(sf_color = =黄色){/ *转型:“< S1 >: 13 * / / *转型:“< S1 >: 14 * / / * MATLAB函数“放缓”:“< S1 >: 24 * / / *的< S1 >: 24:6 * / rtb_traffic_speed = 1;/ *转型:“< S1 >: 16”其他* /}{/ *转型:‘< S1 >: 17 * / / * MATLAB函数“加速”:“< S1 >: 25”* / / *的< S1 >: 25:6 * / rtb_traffic_speed = 2;}}

由于MATLAB函数出现内联,不等比较出现在这些行代码:

如果(ifelse_using_enums_U。In1 < 20.0) {....如果(ifelse_using_enums_U}其他。In1 > = 20.0) & & (ifelse_using_enums_U。In1 < 25.0)) {....

因为不平等出现在的主体if-elseif-else转换为代码流程图切换实例语句不发生。做下列之一:

改变了内联函数的性质。如果您不想修改你的流程图,改变内联函数的性质:

  1. 右键单击函数框并选择属性

  2. 在properties对话框中,内联函数的选择中,选择函数

  3. 点击好吧关闭对话框。

请注意

你不需要更改为其他三个内联属性图的MATLAB函数。因为流程图不调用这些函数在评价条件,这些函数可以保持内联属性汽车

当你为你的模型重新生成代码,代码流程图现在出现这样的代码:

开关(ifelse_using_enums_light (ifelse_using_enums_U.In1)){案例红:/ *转型:“< S1 >: 11 * / / *转型:“< S1 >: 12”* / / * MATLAB函数‘停止’:‘< S1 >: 23 * / / *的< S1 >: 23:6 * / ifelse_using_enums_Y。着干活= 0.0;/ *过渡:“< S1 >: 15 ' * / / *转型:“< S1 >: 16”* /休息;例黄色:/ *转型:‘< S1 >: 10 * / / *转型:‘< S1 >: 13 * / / *转型:‘< S1 >: 14 * / / * MATLAB函数“放缓”:“< S1 >: 24”* / / *的< S1 >: 24:6 * / ifelse_using_enums_Y。着干活= 1.0;/ *转型:“< S1 >: 16 * /休息;默认值:/ *转型:' < S1 >: 17 * / / * MATLAB函数“加速”:“< S1 >: 25”* / / *的< S1 >: 25:6 * / ifelse_using_enums_Y。着干活= 2.0;打破;}

由于MATLAB函数不再出现内联,转换切换实例语句发生。增强可读性,切换实例语句提供这些好处:

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

  • lh表达式ifelse_using_enums_light (ifelse_using_enums_U.In1)只出现一次,减少重复的代码。

确保切换实例语句修改流程图。如果你不想改变内联函数的性质、修改你的流程图:

  1. 添加本地数据表color_out的枚举类型TrafficLights

  2. 取代的每个实例光(路口)color_out

  3. 添加操作{color_out =光(十字路口)}的缺省转换流程图。

现在的图类似于这个图表:

当你为你的模型重新生成代码,代码流程图使用切换实例语句。

相关的话题