主要内容

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

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

  • MATLAB® 是动作语言。

  • C 是动作语言。

您选择的动作语言会影响您编写状态和转移动作的方式、可用的运算以及图生成代码的方式。

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

sfnew -c

选择动作语言

在以下情况下使用 MATLAB 作为动作语言:

  • 原型构建和快速开发,您需要在此过程中快速迭代算法和逻辑。

  • 矩阵和向量运算,您的图在此情况下广泛使用数组和复数数学运算。

  • MATLAB 集成,您要在此情况下利用现有 MATLAB 函数和工具箱。

对于以下情形,使用 C 语言作为动作语言:

  • 需要为实时系统实现最大执行速度的性能关键型应用程序。

  • 用于资源受限硬件的嵌入式目标和代码生成。

  • 包含确定性行为的应用程序,在此情况下您需要可预测的时序和内存使用量。

动作语言的差异

MATLAB 和 C 动作语言在语法、支持的运算和代码生成行为方面有所不同。下列各表列出了两种动作语言之间最显著的差异。

基本运算

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

递增与递减运算

图自动将语法更正为 MATLAB 语法。例如,a++ 更正为 a = a+1

图支持 a++a--。请参阅对 Stateflow 数据的运算

赋值运算

图自动将语法更正为 MATLAB 语法。例如,a += b 更正为 a = a+b

图支持 a += ba –= ba *= ba /= b。请参阅对 Stateflow 数据的运算

比较运算

a ~= b图支持 a != b!a 运算。请参阅对 Stateflow 数据的运算

注释标记

自动更正为 %图支持 ///* */。请参阅对 Stateflow 数据的运算
条件语句

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

仅在状态动作中受支持。

循环语句

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

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

索引和数据处理

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

向量和矩阵索引

从 1 开始的索引。例如 A(1,2)。请参阅Stateflow 中向量和矩阵的运算

从 0 开始进行索引。例如 A[0][1]。请参阅Stateflow 中向量和矩阵的运算

索引分隔符

带逗号的圆括号。例如 A(1,2)。请参阅Stateflow 中向量和矩阵的运算

方括号。例如 A[0][1]。请参阅Stateflow 中向量和矩阵的运算

可变大小数据

您可以在状态和转移动作中修改可变大小图数据。有关详细信息,请参阅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

标量扩展

不支持。

支持。请参阅将值赋给所有元素
字符串分隔符

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

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

复数数据

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

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

数据类型传播

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

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

高级功能和代码生成

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

定点构造:

  • 特殊赋值运算符 :=

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

不支持。

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

显式类型转换运算

使用 MATLAB 类型转换函数或 cast 函数。不支持 type 运算符。请参阅类型转换运算

使用 MATLAB 类型转换函数或 cast 函数与 type 运算符。请参阅类型转换运算

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

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

不支持。

结构体参数

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

仅支持可调参数。

使用全局 fimath 对象

支持。

不支持。

复数数据

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

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

使用 MATLAB 作为动作语言时自动更正

使用 Stateflow 作为动作语言的 MATLAB 图会自动将以下 C 构造更正为 MATLAB 语法:

  • 递增和递减运算,如 a++a--。例如,a++ 更改为 a = a+1

  • 赋值运算,如 a += ba –= ba *= ba /= 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 MATLAB

C 样式注释,如 ///* */,会自动更正为使用 %。

用花括号将转移动作括起来

以下转移标签包含有效的转移动作:

E [x > 0] / {x = x+1;}

以下转移标签不正确,但会自动更正为有效语法。

E [x > 0] / x = x+1;

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

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

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

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

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

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

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

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

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

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

另请参阅

主题