Main Content

Stateflow 数据的运算

Simulink® 模型中的 Stateflow® 图具有一个动作语言属性,该属性定义可以在状态和转移动作中使用的运算。语言属性是:

  • MATLAB® 作为动作语言。

  • C 语言作为动作语言。

有关详细信息,请参阅使用 MATLAB 和 C 作为动作语言语法时的差异

二元运算

下表总结了 Stateflow 图中所有二元运算的解释,按优先级顺序列出(0 = 最高,10 = 最低)。二元运算采用左结合,因此在任何表达式中,具有相同优先级的运算符均为从左到右计算。其他运算的计算顺序未指定。例如,在以下赋值中:

A = f() > g();
f()g() 的计算顺序未指定。为了获得更可预测的结果,好的编码做法是将依赖求值顺序的表达式拆分成多个语句。

运算

优先级

MATLAB 作为动作语言

C 作为动作语言

a ^ b

0

幂。

幂。此运算等效于 C 库函数 pow。操作数首先转换为浮点数。有关详细信息,请参阅调用 C 库函数

通过清除启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅启用 C 语言位运算

a * b

1

乘法。

乘法。

a / b

1

除法。

除法。

a %% b

1

不支持。使用 remmod 函数。

余数。非整数操作数首先会转换为整数。

a + b

2

加法。

加法。

a - b

2

减法。

减法。

a >> b

3

不支持。使用 bitshift 函数。

a 右移 b 位。有关详细信息,请参阅按位运算

a << b

3

不支持。使用 bitshift 函数。

a 左移 b 位。有关详细信息,请参阅按位运算

a > b

4

比较,大于。

比较,大于。

a < b

4

比较,小于。

比较,小于。

a >= b

4

比较,大于或等于。

比较,大于或等于。

a <= b

4

比较,小于或等于。

比较,小于或等于。

a == b

5

比较,等于。

比较,等于。

a ~= b

5

比较,不等于。

比较,不等于。

a != b

5

不支持。请使用 a ~= b 运算。

比较,不等于。

a <> b

5

不支持。请使用 a ~= b 运算。

比较,不等于。

a & b

6

逻辑 AND。对于按位 AND,请使用 bitand 函数。

  • 按位 AND(默认值)。通过选中启用 C 语言位运算图属性来启用此运算。

  • 逻辑 AND。通过清除启用 C 语言位运算图属性来启用此运算。

有关详细信息,请参阅按位运算启用 C 语言位运算

a ^ b

7

不支持。对于按位 XOR,请使用 bitxor 函数。

按位 XOR(默认值)。通过选中启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅按位运算启用 C 语言位运算

a | b

8

逻辑 OR。对于按位 OR,请使用 bitor 函数。

  • 按位 OR(默认值)。通过选中启用 C 语言位运算图属性来启用此运算。

  • 逻辑 OR。通过清除启用 C 语言位运算图属性来启用此运算。

有关详细信息,请参阅按位运算启用 C 语言位运算

a && b

9

逻辑 AND。

逻辑 AND。

a || b

10

逻辑 OR。

逻辑 OR。

一元运算和动作

下表总结了 Stateflow 图中所有一元运算和动作的解释。一元运算:

  • 优先于二元运算符。

  • 采用右结合,因此在任何表达式中,它们均为从右向左计算。

运算

MATLAB 作为动作语言

C 作为动作语言

~a

逻辑 NOT。对于按位 NOT,请使用 bitcmp 函数。

  • 按位 NOT(默认值)。通过选中启用 C 语言位运算图属性来启用此运算。

  • 逻辑 NOT。通过清除启用 C 语言位运算图属性来启用此运算。

有关详细信息,请参阅按位运算启用 C 语言位运算

!a

不支持。请使用 ~a 运算。

逻辑 NOT。

-a

求负。

求负。

a++

不支持。请使用表达式 a = a+1

递增。等效于 a = a+1

a--

不支持。请使用表达式 a = a-1

递减。等效于 a = a-1

赋值运算

下表总结了 Stateflow 图中赋值运算的解释。

运算

MATLAB 作为动作语言

C 作为动作语言

a = b

简单赋值。

简单赋值。

a := b

不支持。使用类型转换运算以覆盖定点提升规则。请参阅类型转换运算

定点数赋值。请参阅Override Fixed-Point Promotion in C Charts

a += b

不支持。请使用表达式 a = a+b

等效于 a = a+b

a -= b

不支持。请使用表达式 a = a-b

等效于 a = a-b

a *= b

不支持。请使用表达式 a = a*b

等效于 a = a*b

a /= b

不支持。请使用表达式 a = a/b

等效于 a = a/b

a %%= b

不支持。请使用表达式 a = mod(a,b)a = rem(a,b)

等效于 a = a%%b

a &= b

不支持。请使用表达式 a = bitand(a,b)

等效于 a = a&b(按位 AND)。通过选中启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅按位运算启用 C 语言位运算

a ^= b

不支持。请使用表达式 a = bitxor(a,b)

等效于 a = a^b(按位 XOR)。通过选中启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅按位运算启用 C 语言位运算

a |= b

不支持。请使用表达式 a = bitor(a,b)

等效于 a = a|b(按位 OR)。通过选中启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅按位运算启用 C 语言位运算

类型转换运算

要将一种类型的值转换为另一种类型,请使用类型转换运算。您可以将数据转换为显式类型或另一个变量的类型。

转换为显式数据类型

要将数值表达式转换为显式数据类型,请使用以下类型转换函数之一:doublesingleint8int16int32int64uint8uint16uint32uint64boolean。例如,以下语句将表达式 x+3 转换为 16 位无符号整数,并将该值赋给数据 y

y = uint16(x+3);

或者,在使用 MATLAB 作为动作语言的图中,您可以使用 cast 函数并指定 "double""single""int8""int16""int32""int64""uint8""uint16""uint32""uint64""logical" 作为输入参量。例如,以下语句将表达式 x+3 转换为 16 位无符号整数,并将它的值赋给 y

y = cast(x+3,"uint16");

要将表达式转换为定点类型,使用 MATLAB 作为动作语言的图支持调用 fi (Fixed-Point Designer) 函数。例如,以下语句将表达式 x+3 转换为字长为 8 位、小数长度为 3 位的有符号定点值:

y = fi(x+3,1,8,3);

在使用 C 语言作为动作语言的图中,使用 fixdt (Simulink) 表达式作为参量来调用 cast 函数。例如,以下语句将表达式 x+3 转换为字长为 8 位、小数长度为 3 位的有符号定点值:

y = cast(x+3,fixdt(1,8,3));

基于其他数据转换类型

为了更方便地转换类型,您可以将数值表达式的类型转换为与另一个 Stateflow 数据相同的类型。

在使用 MATLAB 作为动作语言的图中,使用关键字 "like" 调用 cast 函数。例如,以下语句将 x+3 的值转换为与数据 z 相同的类型,并将该值赋给 y

y = cast(x+3,"like",z);

在使用 C 语言作为动作语言的图中,type 运算符返回现有 Stateflow 数据的类型。在 cast 运算中,使用此返回值代替显式类型。例如,以下语句将 x+3 的值转换为与数据 z 相同的类型,并将该值赋给 y

y = cast(x+3,type(z));

按位运算

下表总结了在使用 C 语言作为动作语言的 Stateflow 图中的所有位运算的解释。

运算

描述
a & b按位 AND。
a | b按位 OR。
a ^ b按位 XOR。
~a按位 NOT。

a >> b

a 右移 b 位。

a << b

a 左移 b 位。

除了移位运算 a >> ba << b 以外,您必须通过选择启用 C 语言位运算图属性来启用其他所有按位运算。请参阅启用 C 语言位运算

按位运算在二进制级别上处理整数。非整数操作数首先会转换为整数。整数操作数按照 C 提升规则来确定结果的中间值。然后,再将此中间值转换为您为运算结果指定的类型。

注意

使用 MATLAB 作为动作语言的图不支持按位运算。在这种情况下,请使用函数 bitandbitorbitxorbitnotbitshift

按位运算和整数溢出

用来为按位运算的中间值赋值的隐式转换会导致溢出。要保留结果的最右侧位并避免意外行为,请禁用图属性对整数溢出进行饱和处理

例如,此模型中的两个图都计算按位运算 y = ~u。图通过使用 32 位的目标整数大小来计算此运算的中间值,因此该值中最左侧的 24 个位均为 1。当图将中间值赋给 y 时,向 uint8 的转换会导致整数溢出。每个图的输出取决于图如何处理整数溢出。

  • 如果启用对整数溢出进行饱和处理,图会对按位运算的结果进行饱和处理并输出零值。

  • 如果禁用对整数溢出进行饱和处理,图会对按位运算的结果进行绕回处理,并输出最右侧的八个位。

有关详细信息,请参阅对整数溢出进行饱和处理

指针和地址运算

下表总结了在使用 C 语言作为动作语言的 Stateflow 图中的指针和地址运算的解释。

运算

描述

&a

地址运算。与自定义代码和 Stateflow 变量结合使用。

*a

指针运算。仅用于自定义代码变量。

例如,sf_bus_demo 模型包含接受指针作为参量的自定义 C 函数。当图调用自定义代码函数时,它使用 & 运算按地址传递 Stateflow 数据。有关详细信息,请参阅在 Stateflow 图中集成自定义结构体

使用 MATLAB 作为动作语言的图不支持指针和地址运算。指向结构体的指针只能在只读模式下使用,并且仅在传递这些指针的调用期间有效。

通过应用程序实现替换运算

如果您有 Embedded Coder®Simulink Coder™,您可以将代码生成器配置为在代码生成期间应用代码替换库 (CRL)。代码生成器更改它为运算生成的代码以满足应用程序要求。使用 Embedded Coder,您可以开发和应用自定义代码替换库。

代码替换库的运算条目可以指定积分或定点操作数和结果模式。您可以对以下运算使用运算条目:

  • 加法 +

  • 减法 -

  • 乘法 *

  • 除法 /

例如,在以下表达式中,如果 u1u2y 的类型能匹配代码替换库中的一种加法,则可以用特定于目标的实现替换表达式中的加法运算符 +

y = u1 + u2

C 语言状态图语义会限制运算符条目匹配,因为 C 语言状态图使用目标整数大小作为其在算术表达式中的中间类型。例如,以下算术表达式将中间的加法计算为一个目标整数类型的值:

y = (u1 + u2) % 3
如果目标整数大小为 32 位,则在将此表达式替换为来自代码替换库的加法运算符并生成有符号的 16 位结果时,肯定会有精度损失。

有关使用 MathWorks® 提供的代码替换库的详细信息,请参阅什么是代码替换? (Simulink Coder)代码替换库 (Simulink Coder)。有关开发自定义代码替换库的信息,请参阅What Is Code Replacement Customization? (Embedded Coder)Code You Can Replace From Simulink Models (Embedded Coder)

相关主题