PLC 必须处理三种主要类型的数值:布尔值、整数和浮点数。这些最后的浮点数可能会给程序员和技术人员带来最大的困惑。
任何包含处理器的数字控制系统都被设计为接收输入值,使用这些值计算解决方案,然后使用这些计算向其他设备提供输出。此过程中每个步骤使用的数字必须仔细选择 - 不仅足够精确以提供正确的输出值,而且还足够小,以免消耗太多有限的可用内存空间。
数字的主要类别
数字属于三个主要的值类别:
- 一位二进制数
- 多位整数
- 浮点数
单位布尔值只能保存 0 或 1 值。这些布尔值非常适合传感器和开关输入以及线圈输出。
多位整数通常是 8、16 或 32 个连续位,并且只能保存整数值。使用这些数字可以存储或计算的最大值受到位数的限制。较大的数字需要更多的位数,但也会消耗更多的内存。
图 1.PLC上的模拟输入需要使用浮点数,以确保正确读取温度、压力或光线等实际值。
最后一个类别经常出现在表示现实生活中的值时,例如温度、速度或压力。这些类型的值不限于整数,因为以一定的精度了解该值通常很重要。
例如,测量压力时,了解 15.1 Mpa 和 15.8 Mpa 之间的变化可能很重要。如果我们将值限制为整数,它们都会显示为 15 Mpa,从而失去精度。
这种数据类型的名称是“浮点十进制”数字,在编程软件中通常称为“浮点数”或“实数”数据类型。
32 位浮点数的 IEEE 754 结构
通常没有必要理解与实际值和二进制浮点等效值之间转换相关的每个数学运算。与许多数字转换的情况一样,这是一个复杂的过程,如果需要可以进行研究。但这并不意味着整个概念应该被忽略。
在本文中,这些数字将被称为浮点数。但是,如果您是 RSLogix 用户或该术语的任何其他适当的标题,您可以在心里将其转换为真实的。
PLC 中的浮点数由 32 位组成。在许多现代计算机处理器中,可以使用 64 位,但对于几乎所有 PLC,32 位是标准。这意味着就内存容量而言,浮点数不会比 32 位整数(例如 double 或 DINT)消耗更多空间。有时,两个 32 位数字可以组合起来形成一个 64 位浮点值。
浮点数的组成部分
浮点数由三个部分组成,每个部分使用 32 位的一部分。
符号位
第一位是符号位,用于标识它是正值还是负值。温度很容易为负值,如果真空表示为表压值,压力也可能为负值。速度可以是正/负,也可以使用 CW/CCW 或类似术语来区分。第一位标识正或负。
下表显示了 32 位浮点数的示例细分。此示例显示了可能的最小正值,指数为 1,尾数为 0。
表 1. 32 位浮点数的示例细分
符号位 | 指数 | 尾数 |
0 | 00000001 | 00000000000000000000000 |
正指数和负指数
浮点数的第二部分是使用 8 位的指数。数字的这一部分负责小数点的实际位置,因为这会对数字的大小产生巨大的差异。考虑数字 375 - 没有小数位,它是一个整数,一个整数,一个整数。如果我们把小数点放在开头,它是 0.375,但换个位置,它可能是 37.5——小数点的位置非常重要。
指数可以是正数或负数。正指数表示数字大于 1。负指数表示小于 1。在 32 位浮点数中,八个指数位给出的值范围是 0 到 255。但是,正值和负值都必须是可能的,因此指数实际上计算如下:
2^(指数 - 127)
0 和 255 的极端指数值保留给 0 和无穷大,因此对于数字转换,我们可以使用 1 到 254。
尾数
使用剩余 23 位的浮点数的最后也是最大的部分实际上显示了该值中包含的数字。这在技术上称为“尾数”,由任何浮点数中小数点后面的数字组成。当所有位都为 0 时,或者当所有位都为 1 时,通过使用二进制逆来找到尾数的极限范围,如下所示:
2 - 2^(0)
和
2 - 2^(-23)
PLC 数据类型表中浮点数的总范围是通过尾数乘以指数得出的。两者中的最小者找到最小的浮点值。两者中最大的找到最大的浮点值。
2 - 2^0 x 2^(1-127) = 1.1754944*10^-38
和
2 - 2^(-23) x 2^(256-127) = 3.4028235*10^38
浮点数的限制
与整数值相比,浮点数的主要谨慎考虑可能是计算解决方案的额外时间。在一个具体示例中,根据 Rockwell Automation 针对 ControlLogix 处理器的文档,执行 REAL 数据类型的 ADD 计算所需的时间比执行 DINT 相同 ADD 的时间长约 6.5 倍。
图 2.数据表摘录,在罗克韦尔自动化的 ControlLogix 或 CompactLogix 处理器上使用 32 位 DINT 与 32 位 REAL 数据类型的 ADD 指令时间。
有时,浮点数是必要的,但是处理指令的额外时间应该强烈提醒我们在合理的情况下考虑使用整数。
某些情况下的另一个潜在问题是无法真正处理绝对精确的值。对于整数,例如数数,您可以数 100 个项目,但最终永远不会数到 100.5 个项目。因此,它很容易显示为 100,没有理由显示 100.0000000 个项目。
然而,对于需要非常大精度的值(这意味着尾数非常大),该值可能会被舍入。对于许多系统来说,这可能不是问题,但当系统必须定期测量大模拟值时,舍入误差可能会导致问题。