主要内容

Stateflow 数据的运算

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

  • MATLAB® 作为动作语言。

  • C 语言作为动作语言。

Stateflow 图支持标准编程运算,如加法、比较和赋值。可用的特定运算取决于图的动作语言。

  • 两种动作语言都支持基本算术(+-*)和比较(><==

  • C 动作语言支持额外的运算,如按位运算符(&|

  • MATLAB 动作语言对 C 使用运算符的某些运算使用函数。

所有运算都适用于 Stateflow 数据类型,包括整数、浮点数和布尔值。有关详细信息,请参阅使用 MATLAB 和 C 语言作为动作语言语法时的差异

算术运算

使用算术运算对传感器值、控制信号和系统参数执行计算。

运算优先级描述示例

^

0

voltage_squared = voltage ^ 2

*

1

乘法

power = voltage * current

/

1

除法efficiency = output_power / input_power

+

2

加法total_force = applied_force + friction_force

-

2

减法error = setpoint - measured_value

比较运算

使用比较运算计算控制逻辑中的条件和阈值。

运算优先级描述示例

>

4

大于

if (temperature > max_temp)

<

4

小于

if (pressure < min_pressure)

>=

4

大于或等于

if (speed >= target_speed)

<=

4

小于或等于

if (voltage <= safety_limit)

==

5

等于if (mode == CALIBRATION)

~=

5

不等于 (MATLAB)if (status ~= READY)

!=

5

不等于 (C)if (status != READY)

逻辑运算

使用逻辑运算组合多个条件。

运算优先级MATLAB 动作语言C 动作语言
&&

9

逻辑与。

逻辑与。

||

10

逻辑或。

逻辑或。

~a

5

逻辑非逻辑非

!a

5

不支持逻辑非

赋值运算

使用 = 运算符将值赋给变量:

sensor_reading = adc_value;
control_output = pid_result;

对于使用 C 语言作为动作语言的图,您可以使用以下复合赋值运算符。

运算等效于示例

a += b

a = a + b

accumulator += sample

a -= b

a = a - b

error -= correction

a *= b

a = a * b

gain *= adjustment

a /= b

a = a / b

average /= sample_count

递增和递减

在使用 C 语言作为动作语言的图中,您可以使用 ++–- 来递增或递减数据值。例如:

counter++; // Equivalent to counter = counter + 1
sample_index--; // Equivalent to sample_index = sample_index - 1

类型转换运算

您可以在任何 Stateflow 图中使用 MATLAB 类型函数。

pressure_int = int16(pressure_reading);
voltage_single = single(voltage_measurement);

使用 cast 函数的方式取决于您的动作语言。

在使用 MATLAB 作为动作语言的图中,请使用:

result = cast(sensor_value, "int32");
scaled_value = cast(raw_data, "like", reference_signal);

在使用 C 语言作为动作语言的图中,请使用:

result = cast(sensor_value, int32);
scaled_value = cast(raw_data, type(reference_signal));

类型转换运算

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

转换为显式数据类型

要将数值表达式转换为显式数据类型,请使用以下类型转换函数之一: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));

二元运算

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

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

运算

优先级

MATLAB 作为动作语言

C 作为动作语言

a & b

6

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

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

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

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

a ^ b

7

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

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

a | b

8

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

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

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

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

按位运算

下表总结了在使用 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 作为动作语言的图不支持指针和地址运算。指向结构体的指针只能在只读模式下使用,并且仅在传递这些指针的调用期间有效。

另请参阅

主题