数据转换
如果在编程中混用不同数据类型,将会发生数据转换。编写梯形图程序时,可在一个指令或表达式中对参数混用不同数据类型。
如果指令的所有操作数都使用以下内容,则指令的执行速度更快,需要的内存更少:
- 相同的数据类型。
- 中间数据类型:
- 如果混用不同数据类型或使用非最优数据类型的标签,控制器会根据以下规则进行数据转换:
- 操作数将按照数据类型优先级进行转换,优先级排序依次为 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 标签。
- 混用 INT 标签与立即数时,由于 remote_rack_1:I.Data[0] 为 INT 标签,用于对照校验该标签的值首先应移至 int_0(同样为 INT 标签)中。随后,EQU 指令会对两个标签进行比较。
整数转换为 REAL
控制器以 IEEE 单精度浮点数格式存储 REAL 值。它使用 1 位存储值的符号,23 位存储底数,8 位存储指数(共 32 位)。如果同一条指令的输入混合使用了整型标签(SINT、INT 或 DINT)以及 REAL 型标签,控制器首先会将整型值转换为 REAL 值,然后再执行此指令。
- SINT 或 INT 值始终会转换为相等的 REAL 值。
- DINT 值可能不会转换为相等的 REAL 值:
- REAL 值最多使用 24 位来存储底数(23 个存储位加一个“隐藏”位)。
- DINT 值最多使用 32 位存储值(一位存储符号,31 位存储值)。
如果 DINT 值需要 24 个以上的有效位,则无法转换为相等的 REAL 值。在这种情况下,控制器将存储经四舍五入至最接近偶数值后的最高 24 位数据。
提醒事项:
根据控制器型号是 5x80 控制器还是 5x70 控制器,Logix Designer 应用程序对数字的解释会有所不同。例如:
- 对于 5x70 控制器,Logix Designer 会将字面值 2 解析为 REAL 类型。
- 对于 5x80 控制器,Logix Designer 会将字面值 2 解析为 DINT。
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 | -2 |
-3.5 | -4 |
-1.6 | .2 |
-1.5 | .2 |
-1.4 | .1 |
1.4 | 1 |
1.5 | 2 |
1.6 | 2 |
2.5 | 2 |
3.5 | 4 |
提供反馈