对 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 | 逻辑或。 | 逻辑或。 |
| 5 | 逻辑非 | 逻辑非 |
| 5 | 不支持 | 逻辑非 |
赋值运算
使用 = 运算符将值赋给变量:
sensor_reading = adc_value; control_output = pid_result;
对于使用 C 语言作为动作语言的图,您可以使用以下复合赋值运算符。
| 运算 | 等效于 | 示例 |
|---|---|---|
a += b |
|
|
|
|
|
|
|
|
|
|
|
递增和递减
在使用 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));
类型转换运算
要将一种类型的值转换为另一种类型,请使用类型转换运算。您可以将数据转换为显式类型或另一个变量的类型。
转换为显式数据类型
要将数值表达式转换为显式数据类型,请使用以下类型转换函数之一:double、single、int8、int16、int32、int64、uint8、uint16、uint32、uint64 和 boolean。例如,以下语句将表达式 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 作为动作语言 |
|---|---|---|---|
| 6 | 逻辑与。对于按位 AND,请使用 |
有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
| 7 | 不支持。对于按位 XOR,请使用 | 按位 XOR(默认值)。通过选中启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
| 8 | 逻辑或。对于按位 OR,请使用 |
有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
按位运算
下表总结了在使用 C 语言作为动作语言的 Stateflow 图中的所有位运算的解释。
运算 | 描述 |
|---|---|
a & b | 按位 AND。 |
a | b | 按位 OR。 |
a ^ b | 按位 XOR。 |
~a | 按位 NOT。 |
| 将 a 右移 b 位。 |
| 将 a 左移 b 位。 |
除了移位运算 a >> b 和 a << b 以外,您必须通过选择启用 C 语言位运算图属性来启用其他所有按位运算。有关详细信息,请参阅启用 C 语言位运算。
按位运算在二进制级别上处理整数。非整数操作数首先会转换为整数。整数操作数按照 C 提升规则来确定结果的中间值。然后,再将此中间值转换为您为运算结果指定的类型。
按位运算和整数溢出
用来为按位运算的中间值赋值的隐式转换会导致溢出。要保留结果的最右侧位并避免意外行为,请禁用图属性对整数溢出进行饱和处理。
例如,此模型中的两个图都计算按位运算 y = ~u。图通过使用 32 位的目标整数大小来计算此运算的中间值,因此该值中最左侧的 24 个位均为 1。当图将中间值赋给 y 时,向 uint8 的转换会导致整数溢出。每个图的输出取决于图如何处理整数溢出。
如果启用对整数溢出进行饱和处理,图会对按位运算的结果进行饱和处理并输出零值。
如果禁用对整数溢出进行饱和处理,图会对按位运算的结果进行绕回处理,并输出最右侧的八个位。

指针和地址运算
下表总结了在使用 C 语言作为动作语言的 Stateflow 图中的指针和地址运算的解释。
运算 | 描述 |
|---|---|
| 地址运算。与自定义代码和 Stateflow 变量结合使用。 |
| 指针运算。仅用于自定义代码变量。 |
例如,sf_bus_demo 模型包含接受指针作为参量的自定义 C 函数。当图调用自定义代码函数时,它使用 & 运算按地址传递 Stateflow 数据。有关详细信息,请参阅在 Stateflow 图中集成自定义结构体。
使用 MATLAB 作为动作语言的图不支持指针和地址运算。指向结构体的指针只能在只读模式下使用,并且仅在传递这些指针的调用期间有效。