徐衛峰,蔡 丹,牛洪海
(南京南瑞繼保電氣有限公司研究院,江蘇 南京 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控制器,也可應用于支持腳本的監控后臺,滿足用戶在無累積儀表時軟邏輯實現的需求。