使用 MATLAB 和 C 作为动作语言语法时的差异
Simulink® 模型中的 Stateflow® 图具有一个动作语言属性,该属性定义状态和转移动作的语法。图的画布左下角的图标表示该图的动作语言。
MATLAB® 作为动作语言。
C 语言作为动作语言。
MATLAB 是新 Stateflow 图的默认动作语言语法。要创建使用 C 语言作为动作语言的图,请输入:
sfnew -c
比较动作语言的功能
下表列出了两种动作语言之间最显著的功能差异。
功能 | MATLAB 作为动作语言 | C 作为动作语言 |
---|---|---|
向量和矩阵索引 | 以圆括号括起并以逗号分隔的从 1 开始的索引。例如 | 以方括号括起的从 0 开始的索引。例如 |
C 构造:
| 自动更正为 MATLAB 语法。例如, | |
状态动作中的条件和循环控制语句 | 不支持。对于条件模式和循环模式,请改用图形函数。请参阅通过定义图形函数重用逻辑模式。 | |
转移动作的格式 | 自动更正会用花括号 | 不需要用花括号 |
并行状态的排序 | 仅显式排序。请参阅并行状态的执行顺序。 | 显式或隐式排序。请参阅并行状态的执行顺序。 |
可变大小数据 | 在状态和转移动作中修改可变大小图数据。有关详细信息,请参阅Variable-Size Data in Charts That Use MATLAB as the Action Language。 | 使用以下方法修改可变大小图数据:
所有使用可变大小数据的计算都必须在这些函数内部进行,而不是直接在状态或转移中进行。有关详细信息,请参阅Variable-Size Data in Charts That Use C as the Action Language。 |
定点构造:
| 不支持。 | 支持。请参阅Override Fixed-Point Promotion in C Charts和Fixed-Point Context-Sensitive Constants。 |
复数数据 | 使用复数表示法 | 使用 |
数据类型传播 | 遵循 MATLAB 定型规则。例如,将类型为 | 遵循 C 语言定型规则。例如,将类型为 |
显式类型转换运算 | 使用以下转换形式之一:
不支持 | 使用以下转换形式之一:
不支持对 |
标量扩展 | 不支持。 | 支持。请参阅为矩阵的所有元素赋值。 |
字符串数据 | 使用双引号 ( | 使用双引号 (" ..." ) 或单引号 (' ...' ) 作为分隔符。请参阅Manage Textual Information by Using Strings。 |
数据属性的设定:
| 不支持。 | 支持。有关详细信息,请参阅:
|
图形函数、真值表函数和 MATLAB 函数中的数据作用域 | Constant , Parameter , Input , Output | Local , Constant , Parameter , Input , Output , Temporary |
圆点表示法,用于指定 MATLAB 函数内的状态、局部数据、消息和局部事件 | 支持。请参阅使用圆点表示法标识数据。 | 不支持。 |
自定义代码函数和变量 | 行为取决于导入自定义代码配置参数。
请参阅Reuse Custom Code in Stateflow Charts和Import custom code (Simulink)。 | 状态和转移既支持自定义代码函数,也支持自定义代码变量。 |
结构体参数 | 支持可调参数和不可调参数。 | 仅支持可调参数。 |
使用全局 | 支持。 | 不支持。 |
使用 MATLAB 作为动作语言的规范
对向量和矩阵使用从 1 开始的索引
从 1 开始的索引与 MATLAB 语法一致。有关详细信息,请参阅索引表示法。
使用圆括号而不是方括号对向量和矩阵进行索引
以下语句有效:
a(2,5) = 0;
以下语句无效:
a[2][5] = 0;
有关详细信息,请参阅索引表示法。
使用 MATLAB 格式进行注释
使用 %
指定状态和转移中的注释,以与 MATLAB 保持一致。例如,以下注释有效:
% This is a valid comment in the style of MATLAB
C 样式注释,如 //
和 /* */
,会自动更正为使用 %。
用花括号将转移动作括起来
以下转移标签包含有效的转移动作:
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)。