数据转换
如果在编程中混用数据类型,将会发生数据转换。
进行以下编程时: | 在以下情况下会发生数据转换: |
梯形图 结构化文本 | 一条指令或表达式中 混用不同数据类型的参数。 |
功能块 | 将数据类型不同的两个参数连接在一起 |
以下条件下,可以提高指令执行速度、节省内存空间:
- 使用相同数据类型。
- 立即数数据类型:
- 所有功能块指令仅支持一种数据类型的操作数。
- 如果混用不同数据类型或使用非最优数据类型的标签,控制器会根据以下规则进行数据转换:
- 按照数据类型等级由低到高的顺序对操作数执行数据转换,SINT、USINT、INT、UINT、DINT、UDINT、LINT、ULINT、REAL 和 LREAL 的等级从 1(最低)到 10(最高)依次排列。小贴士: 要避免因数据转换而占用时间和内存,应在一条指令中全部使用相同数据类型的操作数。
将 SINT 或 INT 型转换为 DINT 型,或者将 DINT 转换为 LINT 型
对于 SINT 或 INT 型输入源标签,可通过符号扩展升级为 DINT 型。将 SINT 或 INT 值转换为 DINT 值的指令会使用以下转换方法之一。
转换方法 | 具体处理方式 |
符号扩展 | 将最高有效位的值(值的符号位)放在现有位左侧的每一位,直至达到 32 或 64 位。 |
填零 | 在现有位左侧填零,直至达到 32 或 64 位。 |
逻辑指令使用填零方式。其他所有指令均使用符号扩展方式。
以下示例显示使用符号扩展和填零方式转换某个值后所得的结果。
该值 | 2#1111_1111_1111_1111 | (-1) |
通过符号扩展转换为该值 | 2#1111_1111_1111_1111_1111_1111_1111_1111 | (-1) |
通过填零转换为该值 | 2#0000_0000_0000_0000_1111_1111_1111_1111 | (65535) |
如果在指令中使用 SINT 或 INT 标签和立即数,而该指令通过符号扩展方式进行数据转换,则应使用以下一种方法处理立即数。
以十进制基数形式指定立即数。
如果输入基数形式而非十进制形式的值,应指定该立即数的全部 32 位。为此,应将最高有效位的值输入其左侧的每一位,直至达到 32 位。
为每个操作数创建一个标签,并在指令中使用相同的数据类型。要分配常数值,可采用两种方法:
将值输入一个标签。
增加一个 MOV 指令,将值移动到一个标签中。
使用 MEQ 指令仅检查所需位。
以下示例介绍两种混用立即数与 INT 标签的方法。在两个示例中,均通过检查 1771 I/O 模块的位,来确认是否使用了所有位。1771 I/O 模块的输入数据字为 INT 标签,因此最简单的方法是使用 16 位常数值。
重要提示:
混用 INT 标签与立即数
由于 remote_rack_1:I.Data[0] 为 INT 标签,用于对照检查该标签的值也输入为 INT 标签。

重要提示:
混用 INT 标签与立即数
由于 remote_rack_1:I.Data[0] 为 INT 标签,用于对照检查该标签的值首先移至 int_0(同样为 INT 标签)中。随后,EQU 指令会对两个标签进行比较。

整型转换为 REAL 型
控制器以 IEEE 单精度浮点数格式存储 REAL 值。它使用一位存储值的符号,使用 23 位存储底数,使用八位存储指数(共 32 位)。如果同一条指令的输入混合使用了整型标签(SINT、INT 或 DINT)以及 REAL 型标签,控制器首先会将整型值转换为 REAL 值,然后再执行此指令。
- SINT 或 INT 值始终会转换为相等的 REAL 值。
- DINT 值可能不会转换为相等的 REAL 值:
- REAL 值最多使用 24 位来存储底数(23 个存储位加一个“隐藏”位)。
- DINT 值最多使用 32 位存储值(一位存储符号,31 位存储值)。
如果 DINT 值需要 24 个以上的有效位,则无法转换为相等的 REAL 值。控制器会将值四舍五入为最近的偶数值,并存储最高的 24 位。
DINT 型转换为 SINT 或 INT 型
将 DINT 值转换为 SINT 或 INT 值时,控制器会截断 DINT 的高位部分,并根据数据类型的要求存储相应的低位。如果该值过大,转换过程中会发生溢出。
DINT 型转换为 INT 和 SINT 型 | ||
DINT 值 | 转换为更小值 | |
16#0001_0081 (65,665) | INT: | 16#0081 (129) |
SINT: | 16#81 (-127) | |
REAL 型转换为 SINT、INT 或 DINT 型
将 REAL 值转换为整型值时,控制器会对小数部分四舍五入,并根据数据类型的要求存储相应的位。如果该值过大,转换过程中会发生溢出。
数值的四舍五入参见以下示例。
< 0.5 的小数向下舍入到最接近的整数。
> 0.5 的小数向上舍入到最接近的整数。
= 0.5 的小数向上或向下舍入到最接近的整数。
重要提示:
REAL 值转换为 DINT 值
| ||
REAL 值 | 转换为 DINT 值 | |
-2.5 -3.5 | -2 -4 | |
-1.6 | -2 | |
-1.5 | -2 | |
-1.4 | -1 | |
1.4 | 1 | |
1.5 | 2 | |
1.6 | 2 | |
2.5 3.5 | 2 4 | |
提供反馈