使用 MATLAB 和 C 语言作为动作语言语法时的差异
Simulink® 模型中的 Stateflow® 图具有一个动作语言属性,该属性定义状态和转移动作的语法。图的画布左下角的图标表示该图的动作语言:
MATLAB® 是动作语言。
C 是动作语言。
您选择的动作语言会影响您编写状态和转移动作的方式、可用的运算以及图生成代码的方式。
MATLAB 是新 Stateflow 图的默认动作语言语法。要创建使用 C 语言作为动作语言的图,请输入:
sfnew -c选择动作语言
在以下情况下使用 MATLAB 作为动作语言:
原型构建和快速开发,您需要在此过程中快速迭代算法和逻辑。
矩阵和向量运算,您的图在此情况下广泛使用数组和复数数学运算。
MATLAB 集成,您要在此情况下利用现有 MATLAB 函数和工具箱。
对于以下情形,使用 C 语言作为动作语言:
需要为实时系统实现最大执行速度的性能关键型应用程序。
用于资源受限硬件的嵌入式目标和代码生成。
包含确定性行为的应用程序,在此情况下您需要可预测的时序和内存使用量。
动作语言的差异
MATLAB 和 C 动作语言在语法、支持的运算和代码生成行为方面有所不同。下列各表列出了两种动作语言之间最显著的差异。
基本运算
| 功能 | MATLAB 作为动作语言 | C 作为动作语言 |
|---|---|---|
递增与递减运算 | 图自动将语法更正为 MATLAB 语法。例如, | 图支持 |
赋值运算 | 图自动将语法更正为 MATLAB 语法。例如, | 图支持 a += b、a –= b、a *= b 和 a /= b。请参阅对 Stateflow 数据的运算。 |
比较运算 | a ~= b | 图支持 a != b 和 !a 运算。请参阅对 Stateflow 数据的运算。 |
注释标记 | 自动更正为 %。 | 图支持 // 和 /* */。请参阅对 Stateflow 数据的运算。 |
| 条件语句 | 仅在状态动作中受支持。 | |
| 循环语句 | 不支持循环语句。对于条件构型和循环构型,请改用图形函数。请参阅通过定义图形函数重用逻辑构型。 |
索引和数据处理
| 功能 | MATLAB 作为动作语言 | C 作为动作语言 |
|---|---|---|
向量和矩阵索引 | 从 1 开始的索引。例如 | 从 0 开始进行索引。例如 |
索引分隔符 | 带逗号的圆括号。例如 | 方括号。例如 |
可变大小数据 | 您可以在状态和转移动作中修改可变大小图数据。有关详细信息,请参阅Variable-Size Data in Charts That Use MATLAB as the Action Language。 | 您可以使用以下方法修改可变大小图数据:
所有使用可变大小数据的计算都必须在这些函数内部进行,而不是直接在状态或转移中进行。有关详细信息,请参阅Variable-Size Data in Charts That Use C as the Action Language。 |
| 标量扩展 | 不支持。 | 支持。请参阅将值赋给所有元素。 |
| 字符串分隔符 | 使用双引号 ( | 使用双引号 ("...") 或单引号 ('...') 作为分隔符。请参阅Manage Textual Information by Using Strings。 |
复数数据 | 使用复数表示法 | 使用 |
数据类型传播 | 遵循 MATLAB 定型规则。例如,将类型为 | 遵循 C 语言定型规则。例如,将类型为 |
高级功能和代码生成
| 功能 | MATLAB 作为动作语言 | C 作为动作语言 |
|---|---|---|
定点构造:
| 不支持。 | 支持。请参阅Override Fixed-Point Promotion in C Charts和Fixed-Point Context-Sensitive Constants。 |
显式类型转换运算 | ||
圆点表示法,用于指定 MATLAB 函数内的状态、局部数据、消息和局部事件 | 支持。请参阅使用圆点表示法标识数据。 | 不支持。 |
结构体参数 | 支持可调参数和不可调参数。 | 仅支持可调参数。 |
使用全局 | 支持。 | 不支持。 |
复数数据 | 使用复数表示法 | 使用 |
使用 MATLAB 作为动作语言时自动更正
使用 Stateflow 作为动作语言的 MATLAB 图会自动将以下 C 构造更正为 MATLAB 语法:
递增和递减运算,如
a++和a--。例如,a++更改为a = a+1。赋值运算,如
a += b、a –= b、a *= b和a /= b。例如,a += b更改为a = a+b。求值运算,如
a != b和!a。例如,a != b更改为a ~= b。注释标记
//和/* */更改为%。
要禁用此预设项,请使用 sfpref 函数:
sfpref(EnableLabelAutoCorrectionForMAL=false);
使用 MATLAB 作为动作语言的规范
在使用 MATLAB 作为动作语言的图中进行编码时,请遵循以下规范。
对向量和矩阵使用从 1 开始的索引
从 1 开始的索引与 MATLAB 语法一致。有关详细信息,请参阅索引表示法。
使用圆括号而不是方括号对向量和矩阵进行索引
以下语句有效:
a(2,5) = 0;
以下语句无效:
a[2][5] = 0;
有关详细信息,请参阅索引表示法。
对注释使用 MATLAB 格式
使用 % 指定状态和转移中的注释,以与 MATLAB 保持一致。例如,以下注释有效:
% This is a valid comment in the style of MATLABC 样式注释,如 // 和 /* */,会自动更正为使用 %。
用花括号将转移动作括起来
以下转移标签包含有效的转移动作:
E [x > 0] / {x = x+1;}以下转移标签不正确,但会自动更正为有效语法。
E [x > 0] / x = x+1;不要在条件动作和转移动作中使用控制流逻辑
仅在状态动作中支持控制流逻辑(如 if、switch、for 和 while 语句)。在条件动作或转移动作中使用控制流逻辑会导致语法错误。
不要在状态动作中声明全局变量或持久变量
状态动作中不支持关键字 global 和 persistent。
将初始值赋给局部数据和输出数据
当使用 MATLAB 作为动作语言时,没有初始值的数据读取会导致错误。
包括枚举值标识符的类型前缀
标识符 TrafficColors.Red 有效,但 Red 无效。
要从您的模型生成代码,请使用支持代码生成的 MATLAB 语言功能
否则,可以使用 coder.extrinsic 来调用不支持的函数,这可在仿真时提供您所需的功能,但它们不会包含在生成代码中。有关支持的功能和函数的列表,请参阅 语言、函数和对象支持 (Simulink)。