Main Content

使用 MATLAB 和 C 作为动作语言语法时的差异

Simulink® 模型中的 Stateflow® 图具有一个动作语言属性,该属性定义状态和转移动作的语法。图的画布左下角的图标表示该图的动作语言。

  • MATLAB® 作为动作语言。

  • C 语言作为动作语言。

MATLAB 是新 Stateflow 图的默认动作语言语法。要创建使用 C 语言作为动作语言的图,请输入:

sfnew -c

比较动作语言的功能

下表列出了两种动作语言之间最显著的功能差异。

功能MATLAB 作为动作语言C 作为动作语言

向量和矩阵索引

以圆括号括起并以逗号分隔的从 1 开始的索引。例如 A(4,5)。请参阅Stateflow 中向量和矩阵的运算

以方括号括起的从 0 开始的索引。例如 A[3][4]。请参阅Stateflow 中向量和矩阵的运算

C 构造:

  • 递增与递减操作 a++a--

  • 赋值运算 a += ba –= ba *= ba /= b

  • 求值运算 a != b!a

  • 二元运算 a %% ba >> ba << ba & ba | b

  • 注释标记 ///* */

自动更正为 MATLAB 语法。例如,a++ 更正为 a = a+1。请参阅使用 MATLAB 作为动作语言时自动更正

支持。请参阅对 Stateflow 数据的运算

状态动作中的条件和循环控制语句

支持。例如,您可以在状态动作中使用 ifforwhile 语句。请参阅循环及条件语句

不支持。对于条件模式和循环模式,请改用图形函数。请参阅通过定义图形函数重用逻辑模式

转移动作的格式

自动更正会用花括号 {} 将转移动作括起来。请参阅转移动作

不需要用花括号 {} 将转移动作括起来。请参阅转移动作

可变大小数据

在状态和转移动作中修改可变大小图数据。有关详细信息,请参阅Variable-Size Data in Charts That Use MATLAB as the Action Language

使用以下方法修改可变大小图数据:

  • MATLAB 函数

  • Simulink 函数

  • 使用 MATLAB 作为动作语言的真值表

所有使用可变大小数据的计算都必须在这些函数内部进行,而不是直接在状态或转移中进行。有关详细信息,请参阅Variable-Size Data in Charts That Use C as the Action Language

定点构造:

  • 特殊赋值运算符 :=

  • 上下文相关常量,例如 4.3C

不支持。

支持。请参阅Override Fixed-Point Promotion in C ChartsFixed-Point Context-Sensitive Constants

复数数据

使用复数表示法 a + bicomplex 运算符。请参阅Operations for Complex Data in Stateflow

使用 complex 运算符。不支持复数表示法。请参阅Operations for Complex Data in Stateflow

数据类型传播

遵循 MATLAB 定型规则。例如,将类型为 double 的数据与类型为 int32 的数据相加会得到类型为 int32 的数据。

遵循 C 语言定型规则。例如,将类型为 double 的数据与类型为 int32 的数据相加会得到类型为 double 的数据。

显式类型转换运算

使用以下转换形式之一:

  • MATLAB 类型转换函数。例如 single(x)

  • 具有类型关键字的 cast 函数。例如 cast(x,"int8")

  • 具有 "like" 关键字的 cast 函数。例如 cast(x,"like",z)

不支持 type 运算符。请参阅类型转换运算

使用以下转换形式之一:

  • MATLAB 类型转换函数。例如 uint16(x)

  • 具有 type 运算符的 cast 函数。例如 cast(x,type(z))

不支持对 cast 函数使用类型关键字。请参阅类型转换运算

标量扩展

不支持。

支持。请参阅为矩阵的所有元素赋值
字符串数据

使用双引号 ("...") 作为分隔符。请参阅Manage Textual Information by Using Strings

使用双引号 ("...") 或单引号 ('...') 作为分隔符。请参阅Manage Textual Information by Using Strings

数据属性的设定:

  • 第一个索引

  • 将最终值保存到基础工作区

  • 单位

不支持。

支持。有关详细信息,请参阅:

图形函数、真值表函数和 MATLAB 函数中的数据作用域

Constant, Parameter, Input, OutputLocal, Constant, Parameter, Input, Output, Temporary

圆点表示法,用于指定 MATLAB 函数内的状态、局部数据、消息和局部事件

支持。请参阅使用圆点表示法标识数据

不支持。

自定义代码函数和变量

行为取决于导入自定义代码配置参数。

  • 当您启用导入自定义代码时,状态和转移既支持自定义代码函数,也支持自定义代码变量(默认值)。

  • 当您禁用导入自定义代码时,仅支持自定义代码函数。使用 coder.ceval (MATLAB Coder) 函数。

请参阅Reuse Custom Code in Stateflow ChartsImport custom code (Simulink)

状态和转移既支持自定义代码函数,也支持自定义代码变量。

结构体参数

支持可调参数和不可调参数。

仅支持可调参数。

使用全局 fimath 对象

支持。

不支持。

使用 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;

不要在条件动作和转移动作中使用控制流逻辑

仅在状态动作中支持控制流逻辑(如 ifswitchforwhile 语句)。在条件动作或转移动作中使用控制流逻辑会导致语法错误。

不要在状态动作中声明全局变量或持久变量

状态动作中不支持关键字 globalpersistent

将初始值赋给局部数据和输出数据

当使用 MATLAB 作为动作语言时,没有初始值的数据读取会导致错误。

包括枚举值标识符的类型前缀

标识符 TrafficColors.Red 有效,但 Red 无效。

要从您的模型生成代码,请使用支持代码生成的 MATLAB 语言功能

否则,可以使用 coder.extrinsic 来调用不支持的函数,这可在仿真时提供您所需的功能,但它们不会包含在生成代码中。有关支持的功能和函数的列表,请参阅 语言、函数和对象支持 (Simulink)

另请参阅

相关主题