数据转换

如果在编程中混用不同数据类型,将会发生数据转换。编写梯形图程序时,可在一个指令或表达式中对参数混用不同数据类型。
如果指令的所有操作数都使用以下内容,则指令的执行速度更快,需要的内存更少:
  • 相同的数据类型。
  • 中间数据类型:
    • 如果混用不同数据类型或使用非最优数据类型的标签,控制器会根据以下规则进行数据转换:
      • 操作数将按照数据类型优先级进行转换,优先级排序依次为 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
提供反馈
对本文档有问题或反馈吗? 请在这里提交您的反馈
Normal