徐卫峰,蔡 丹,牛洪海
(南京南瑞继保电气有限公司研究院,江苏 南京 211102)
自动控制系统中,单精度浮点数被广泛应用于生产工艺过程量监测和回路调节,以及复杂计算和累积量等模拟值处理。这些系统包括:可编程逻辑控制器(programmable logic controller,PLC)系统[1-3]、分布式控制系统 (distributed control system,DCS)[4-5]。自动控制系统选用带累积功能的仪表,可实现较高准确度过程量的累积,但实际应用过程中存在很多未配置累积功能的仪表仍需监视累积值的情况。常用的方法是采用基于浮点数的积分类型逻辑算法[6-7]。在实际运行过程中,当累积量达到一定程度时,采用该方法会发生累积量不累积的现象。该问题通常在系统运行较长时间后出现。
本文从单精度浮点数定义及其在计算机中的运算规则出发,研究不累积现象出现的原因,并提出一种有效的解决方案,以便不同的控制系统在不同的应用场合实现。
常见的浮点有单精度、双精度、扩展双精度三种类型,分别满足不同的计算要求。单精度适合一般计算,双精度适合科学计算,扩展双精度适合高精度计算。在自动控制系统中,系统存储资源和运算能力的限制使得单精度浮点数得到了更广泛的应用。按照《二进制浮点运算标准》(IEEE 754-2008)[8-10]的定义,单精度浮点数可以表示为:
X=(-1)S×(1+F)×2(E-B)
(1)
式中:X为单精度浮点数;S为符号位,取值为0或1;F为尾数,取值范围为0~(1-2-23);E为指数,取值为0~255,0与255分别用作浮点数0和±∞;B为指数偏置,固定值是127,去除特殊规定后,正常表示的浮点数(E-B)的范围为-126~+127。
按照标准定义,单精度浮点数的占用内存空间为4 B。其中:符号位S占1 B;指数域E占8 B;尾数F占23 B。单精度浮点数内存位定义如图1所示。
图1 内存位定义图
单精度浮点数的尾数由23 B表示,其表示的十进制实数的有效数字存在限制[9-10]。有效数字p可表示为式(2),即单精度浮点数最大可表示的有效数字个数介于7~8之间。
p=log224=7.22
(2)
式中:指数24是因为单精度类型和双精度类型均有一个隐含位,因此它们的有效位数比存储位数多一位。
累积量的计算可表示为式(3),即上一计算周期的累计值与当前采样值与时间乘积值的和。求和是其中的关键环节。
Xk=Xk-1+Pv×Δt
(3)
式中:Xk为当前计算周期的累积量;Xk-1为上一个计算周期的累积量;Pv为需进行累积的过程量;Δt为计算周期时间。
单精度浮点数求和计算遵循以下步骤。首先,将参与求和的两个数规格化,即将指数转换为相同大小,转换过程同步转换尾数,确保与指数匹配;其次,将格式统一的两个数相加;最后,返回计算结果。将两个浮点数规格化,采用的方法是对较小数的指数进行转换,使之与较大数的指数相同。其原因在于:如以较小的数为基准,较大的数转换时可能存在高位的损失,误差大;如以较大的数为基准,虽然过程中可能存在低位的损失,但在大多数情况下是可以接受的。这种方式也更接近真实的计算结果。
为验证上述分析,设计了一个简单实例以验证单精度浮点数求和运算。计算公式如式(4)所示。
Y=X1+X2
(4)
式中:Y为浮点数的和;X1为被加数;X2为被加数。
为便于对比分析,设固定值为1,通过修改不同的X1来模拟差距较大的两个数的和。X1提供3个样本,分别为106、107和108。从试验结果来看,当X1为106和107时,结果分别为1 000 001和10 000 001,符合真实值;当X1为108时,结果为100 000 000,X2在计算过程中被忽略。
综上所述,由于浮点数表示有效数字个数是有限的,且求和运算过程以较大数作为转换基准,因此存在大数加上小数,造成小数被忽略,出现累积量无法累积的情况。浮点数有效数字个数为7位,如相加的两个数如果超过107倍,则可能造成被加的数丢失。
对累积量而言,通常无法确保长时间运行值与当前时刻需累加的积分量偏差倍数在107倍以内。为避免出现单精度浮点数出现大数加小数导致小数被忽略的现象,必须确保两者之间的差异不超过107倍。另外,对瞬时值而言,其采样值有精度的要求,如大多数监控系统对浮点数通常保留2位小数有效位。在此情况下,大数与小数的偏差倍数不能超过105倍。考虑到显示的影响,建议留有3位小数,此时偏差倍数为104倍;同理,如保留4位小数,则偏差以103倍为宜。
鉴于累积量需控制相加两数的差异倍数及精度,采用一个多级实现策略。累积量多级实现原理如图2所示。该策略将每级浮点数累加控制在所需的精度范围内。第一级完成瞬时值的时间积分运算,可用DCS、PLC提供的累积量模块,也可按照矩形积分或梯形积分策略自行组态实现。当第一级累积量达到限值,则触发复归信号,使第一级累积量模块复归从零开始累积。第二级为建立在第一级基础上的累加和。当第一级复归信号发生,则同时触发第二级的累加。同理,当第二级的累加和超限时,触发第二级的复归信号,同时也触发第三级的累加。最后,将各级累积量输出求和,即为最终的累积量。该策略要点在于各级复归信号只能存在一个周期,即各级复归和求和仅运算一次,但第一级的累积量模块累积功能除外。该方案也支持多于三级的情况,可根据实际需求调整级数。最终结果可能存在显示上的第一级累积量丢失,但并不会影响累积过程,也不会出现不累积的情况。
图2 累积量多级实现原理图
此外,对于累积量来说,存在系统故障后恢复时继续累积的需求,方案需支持累积量的掉电保持和恢复功能。每级累积量均存入系统的掉电非易失内存,保证系统故障时累积信息不丢失。当控制系统恢复时,回读故障前正常保存的值。该操作仅进行一次。第一级是通过累积量模块的初始值和触发条件完成的回读,后续累加则需通过选择模块完成。监控后台可通过文件读写实现掉电保持功能。
根据上述策略,以功能块图实现的方案应用于镔鑫钢铁煤气发电的补水流量累计,瞬时流量为200~430 t/h。控制器逻辑运算周期为200 ms,因此每次周期瞬时累加值为0.017 5 t。按照规则,为保证3位有效数字,取第一级累积量上限为103,第二级上限为106。按此设置,如果最后第三级输出保证小数4位有效数字,则需约362年才可能出现累积失真的情况。实际运行可根据每级计算精度要求调整限值,满足现场要求。
本文在分析单精度浮点数定义及求和计算特点的基础上,提出了一种分段累积、支持掉电保持的有效解决方案,并给出了分段设置指导意见。经实际现场工程验证,该方案解决了浮点数累积不上去的问题。该方案可应用于DCS或PLC控制器,也可应用于支持脚本的监控后台,满足用户在无累积仪表时软逻辑实现的需求。