徐衛(wèi)峰,蔡 丹,牛洪海
(南京南瑞繼保電氣有限公司研究院,江蘇 南京 211102)
自動(dòng)控制系統(tǒng)中,單精度浮點(diǎn)數(shù)被廣泛應(yīng)用于生產(chǎn)工藝過(guò)程量監(jiān)測(cè)和回路調(diào)節(jié),以及復(fù)雜計(jì)算和累積量等模擬值處理。這些系統(tǒng)包括:可編程邏輯控制器(programmable logic controller,PLC)系統(tǒng)[1-3]、分布式控制系統(tǒng) (distributed control system,DCS)[4-5]。自動(dòng)控制系統(tǒng)選用帶累積功能的儀表,可實(shí)現(xiàn)較高準(zhǔn)確度過(guò)程量的累積,但實(shí)際應(yīng)用過(guò)程中存在很多未配置累積功能的儀表仍需監(jiān)視累積值的情況。常用的方法是采用基于浮點(diǎn)數(shù)的積分類型邏輯算法[6-7]。在實(shí)際運(yùn)行過(guò)程中,當(dāng)累積量達(dá)到一定程度時(shí),采用該方法會(huì)發(fā)生累積量不累積的現(xiàn)象。該問(wèn)題通常在系統(tǒng)運(yùn)行較長(zhǎng)時(shí)間后出現(xiàn)。
本文從單精度浮點(diǎn)數(shù)定義及其在計(jì)算機(jī)中的運(yùn)算規(guī)則出發(fā),研究不累積現(xiàn)象出現(xiàn)的原因,并提出一種有效的解決方案,以便不同的控制系統(tǒng)在不同的應(yīng)用場(chǎng)合實(shí)現(xiàn)。
常見(jiàn)的浮點(diǎn)有單精度、雙精度、擴(kuò)展雙精度三種類型,分別滿足不同的計(jì)算要求。單精度適合一般計(jì)算,雙精度適合科學(xué)計(jì)算,擴(kuò)展雙精度適合高精度計(jì)算。在自動(dòng)控制系統(tǒng)中,系統(tǒng)存儲(chǔ)資源和運(yùn)算能力的限制使得單精度浮點(diǎn)數(shù)得到了更廣泛的應(yīng)用。按照《二進(jìn)制浮點(diǎn)運(yùn)算標(biāo)準(zhǔn)》(IEEE 754-2008)[8-10]的定義,單精度浮點(diǎn)數(shù)可以表示為:
X=(-1)S×(1+F)×2(E-B)
(1)
式中:X為單精度浮點(diǎn)數(shù);S為符號(hào)位,取值為0或1;F為尾數(shù),取值范圍為0~(1-2-23);E為指數(shù),取值為0~255,0與255分別用作浮點(diǎn)數(shù)0和±∞;B為指數(shù)偏置,固定值是127,去除特殊規(guī)定后,正常表示的浮點(diǎn)數(shù)(E-B)的范圍為-126~+127。
按照標(biāo)準(zhǔn)定義,單精度浮點(diǎn)數(shù)的占用內(nèi)存空間為4 B。其中:符號(hào)位S占1 B;指數(shù)域E占8 B;尾數(shù)F占23 B。單精度浮點(diǎn)數(shù)內(nèi)存位定義如圖1所示。
圖1 內(nèi)存位定義圖
單精度浮點(diǎn)數(shù)的尾數(shù)由23 B表示,其表示的十進(jìn)制實(shí)數(shù)的有效數(shù)字存在限制[9-10]。有效數(shù)字p可表示為式(2),即單精度浮點(diǎn)數(shù)最大可表示的有效數(shù)字個(gè)數(shù)介于7~8之間。
p=log224=7.22
(2)
式中:指數(shù)24是因?yàn)閱尉阮愋秃碗p精度類型均有一個(gè)隱含位,因此它們的有效位數(shù)比存儲(chǔ)位數(shù)多一位。
累積量的計(jì)算可表示為式(3),即上一計(jì)算周期的累計(jì)值與當(dāng)前采樣值與時(shí)間乘積值的和。求和是其中的關(guān)鍵環(huán)節(jié)。
Xk=Xk-1+Pv×Δt
(3)
式中:Xk為當(dāng)前計(jì)算周期的累積量;Xk-1為上一個(gè)計(jì)算周期的累積量;Pv為需進(jìn)行累積的過(guò)程量;Δt為計(jì)算周期時(shí)間。
單精度浮點(diǎn)數(shù)求和計(jì)算遵循以下步驟。首先,將參與求和的兩個(gè)數(shù)規(guī)格化,即將指數(shù)轉(zhuǎn)換為相同大小,轉(zhuǎn)換過(guò)程同步轉(zhuǎn)換尾數(shù),確保與指數(shù)匹配;其次,將格式統(tǒng)一的兩個(gè)數(shù)相加;最后,返回計(jì)算結(jié)果。將兩個(gè)浮點(diǎn)數(shù)規(guī)格化,采用的方法是對(duì)較小數(shù)的指數(shù)進(jìn)行轉(zhuǎn)換,使之與較大數(shù)的指數(shù)相同。其原因在于:如以較小的數(shù)為基準(zhǔn),較大的數(shù)轉(zhuǎn)換時(shí)可能存在高位的損失,誤差大;如以較大的數(shù)為基準(zhǔn),雖然過(guò)程中可能存在低位的損失,但在大多數(shù)情況下是可以接受的。這種方式也更接近真實(shí)的計(jì)算結(jié)果。
為驗(yàn)證上述分析,設(shè)計(jì)了一個(gè)簡(jiǎn)單實(shí)例以驗(yàn)證單精度浮點(diǎn)數(shù)求和運(yùn)算。計(jì)算公式如式(4)所示。
Y=X1+X2
(4)
式中:Y為浮點(diǎn)數(shù)的和;X1為被加數(shù);X2為被加數(shù)。
為便于對(duì)比分析,設(shè)固定值為1,通過(guò)修改不同的X1來(lái)模擬差距較大的兩個(gè)數(shù)的和。X1提供3個(gè)樣本,分別為106、107和108。從試驗(yàn)結(jié)果來(lái)看,當(dāng)X1為106和107時(shí),結(jié)果分別為1 000 001和10 000 001,符合真實(shí)值;當(dāng)X1為108時(shí),結(jié)果為100 000 000,X2在計(jì)算過(guò)程中被忽略。
綜上所述,由于浮點(diǎn)數(shù)表示有效數(shù)字個(gè)數(shù)是有限的,且求和運(yùn)算過(guò)程以較大數(shù)作為轉(zhuǎn)換基準(zhǔn),因此存在大數(shù)加上小數(shù),造成小數(shù)被忽略,出現(xiàn)累積量無(wú)法累積的情況。浮點(diǎn)數(shù)有效數(shù)字個(gè)數(shù)為7位,如相加的兩個(gè)數(shù)如果超過(guò)107倍,則可能造成被加的數(shù)丟失。
對(duì)累積量而言,通常無(wú)法確保長(zhǎng)時(shí)間運(yùn)行值與當(dāng)前時(shí)刻需累加的積分量偏差倍數(shù)在107倍以內(nèi)。為避免出現(xiàn)單精度浮點(diǎn)數(shù)出現(xiàn)大數(shù)加小數(shù)導(dǎo)致小數(shù)被忽略的現(xiàn)象,必須確保兩者之間的差異不超過(guò)107倍。另外,對(duì)瞬時(shí)值而言,其采樣值有精度的要求,如大多數(shù)監(jiān)控系統(tǒng)對(duì)浮點(diǎn)數(shù)通常保留2位小數(shù)有效位。在此情況下,大數(shù)與小數(shù)的偏差倍數(shù)不能超過(guò)105倍??紤]到顯示的影響,建議留有3位小數(shù),此時(shí)偏差倍數(shù)為104倍;同理,如保留4位小數(shù),則偏差以103倍為宜。
鑒于累積量需控制相加兩數(shù)的差異倍數(shù)及精度,采用一個(gè)多級(jí)實(shí)現(xiàn)策略。累積量多級(jí)實(shí)現(xiàn)原理如圖2所示。該策略將每級(jí)浮點(diǎn)數(shù)累加控制在所需的精度范圍內(nèi)。第一級(jí)完成瞬時(shí)值的時(shí)間積分運(yùn)算,可用DCS、PLC提供的累積量模塊,也可按照矩形積分或梯形積分策略自行組態(tài)實(shí)現(xiàn)。當(dāng)?shù)谝患?jí)累積量達(dá)到限值,則觸發(fā)復(fù)歸信號(hào),使第一級(jí)累積量模塊復(fù)歸從零開(kāi)始累積。第二級(jí)為建立在第一級(jí)基礎(chǔ)上的累加和。當(dāng)?shù)谝患?jí)復(fù)歸信號(hào)發(fā)生,則同時(shí)觸發(fā)第二級(jí)的累加。同理,當(dāng)?shù)诙?jí)的累加和超限時(shí),觸發(fā)第二級(jí)的復(fù)歸信號(hào),同時(shí)也觸發(fā)第三級(jí)的累加。最后,將各級(jí)累積量輸出求和,即為最終的累積量。該策略要點(diǎn)在于各級(jí)復(fù)歸信號(hào)只能存在一個(gè)周期,即各級(jí)復(fù)歸和求和僅運(yùn)算一次,但第一級(jí)的累積量模塊累積功能除外。該方案也支持多于三級(jí)的情況,可根據(jù)實(shí)際需求調(diào)整級(jí)數(shù)。最終結(jié)果可能存在顯示上的第一級(jí)累積量丟失,但并不會(huì)影響累積過(guò)程,也不會(huì)出現(xiàn)不累積的情況。
圖2 累積量多級(jí)實(shí)現(xiàn)原理圖
此外,對(duì)于累積量來(lái)說(shuō),存在系統(tǒng)故障后恢復(fù)時(shí)繼續(xù)累積的需求,方案需支持累積量的掉電保持和恢復(fù)功能。每級(jí)累積量均存入系統(tǒng)的掉電非易失內(nèi)存,保證系統(tǒng)故障時(shí)累積信息不丟失。當(dāng)控制系統(tǒng)恢復(fù)時(shí),回讀故障前正常保存的值。該操作僅進(jìn)行一次。第一級(jí)是通過(guò)累積量模塊的初始值和觸發(fā)條件完成的回讀,后續(xù)累加則需通過(guò)選擇模塊完成。監(jiān)控后臺(tái)可通過(guò)文件讀寫(xiě)實(shí)現(xiàn)掉電保持功能。
根據(jù)上述策略,以功能塊圖實(shí)現(xiàn)的方案應(yīng)用于鑌鑫鋼鐵煤氣發(fā)電的補(bǔ)水流量累計(jì),瞬時(shí)流量為200~430 t/h。控制器邏輯運(yùn)算周期為200 ms,因此每次周期瞬時(shí)累加值為0.017 5 t。按照規(guī)則,為保證3位有效數(shù)字,取第一級(jí)累積量上限為103,第二級(jí)上限為106。按此設(shè)置,如果最后第三級(jí)輸出保證小數(shù)4位有效數(shù)字,則需約362年才可能出現(xiàn)累積失真的情況。實(shí)際運(yùn)行可根據(jù)每級(jí)計(jì)算精度要求調(diào)整限值,滿足現(xiàn)場(chǎng)要求。
本文在分析單精度浮點(diǎn)數(shù)定義及求和計(jì)算特點(diǎn)的基礎(chǔ)上,提出了一種分段累積、支持掉電保持的有效解決方案,并給出了分段設(shè)置指導(dǎo)意見(jiàn)。經(jīng)實(shí)際現(xiàn)場(chǎng)工程驗(yàn)證,該方案解決了浮點(diǎn)數(shù)累積不上去的問(wèn)題。該方案可應(yīng)用于DCS或PLC控制器,也可應(yīng)用于支持腳本的監(jiān)控后臺(tái),滿足用戶在無(wú)累積儀表時(shí)軟邏輯實(shí)現(xiàn)的需求。