王永臻
(上海船舶運(yùn)輸科學(xué)研究所 艦船自動(dòng)化系統(tǒng)事業(yè)部, 上海 200135)
船舶電力系統(tǒng)是船舶的生命線(xiàn),在保障電力推進(jìn)、甲板機(jī)械、控制與通信等設(shè)備正常工作方面具有重要作用。大型船舶電力監(jiān)控系統(tǒng)的網(wǎng)絡(luò)拓?fù)渫ǔ2捎?層結(jié)構(gòu)設(shè)計(jì),其中:上層網(wǎng)絡(luò)采用冗余的高速交換式工業(yè)以太網(wǎng),網(wǎng)絡(luò)拓?fù)洳捎铆h(huán)形方式;下層網(wǎng)絡(luò)主要采用雙冗余CAN(Controller Area Network)現(xiàn)場(chǎng)總線(xiàn)網(wǎng)。現(xiàn)場(chǎng)監(jiān)控設(shè)備采集的數(shù)據(jù)主要通過(guò)下層網(wǎng)絡(luò)傳遞給網(wǎng)關(guān),網(wǎng)關(guān)通過(guò)上層網(wǎng)絡(luò)將數(shù)據(jù)傳遞給服務(wù)器,服務(wù)器將數(shù)據(jù)記錄到數(shù)據(jù)庫(kù)中。一艘大型船舶的測(cè)點(diǎn)有上萬(wàn)個(gè),按每秒采集1次數(shù)據(jù)計(jì)算,每天產(chǎn)生的數(shù)據(jù)量有幾十吉字節(jié)。根據(jù)實(shí)際需求,服務(wù)器需存儲(chǔ)最近3個(gè)月內(nèi)的監(jiān)控?cái)?shù)據(jù),而船舶的數(shù)據(jù)存儲(chǔ)空間有限,采集的數(shù)據(jù)必須先作壓縮處理,再進(jìn)行存儲(chǔ)。近年來(lái),為改變芯片、操作系統(tǒng)等核心軟硬件主要依靠進(jìn)口的現(xiàn)狀,船舶設(shè)備國(guó)產(chǎn)化研究越來(lái)越受重視,而目前國(guó)內(nèi)尚無(wú)滿(mǎn)足需求的工業(yè)數(shù)據(jù)庫(kù),現(xiàn)有的國(guó)產(chǎn)數(shù)據(jù)庫(kù)暫不能提供可靠的數(shù)據(jù)壓縮技術(shù),若直接將監(jiān)控?cái)?shù)據(jù)存入國(guó)產(chǎn)數(shù)據(jù)庫(kù)中,會(huì)導(dǎo)致數(shù)據(jù)存儲(chǔ)不及時(shí),造成數(shù)據(jù)堆積,從而影響船舶電力監(jiān)控系統(tǒng)的正常運(yùn)行。因此,需設(shè)計(jì)一種數(shù)據(jù)壓縮策略,先對(duì)監(jiān)測(cè)的數(shù)據(jù)進(jìn)行壓縮,再將其存入國(guó)產(chǎn)數(shù)據(jù)庫(kù)中,以滿(mǎn)足船舶監(jiān)控設(shè)備的需要。
數(shù)據(jù)壓縮技術(shù)主要分為無(wú)損壓縮技術(shù)和有損壓縮技術(shù)2種,傳統(tǒng)的無(wú)損壓縮技術(shù)的壓縮量較小,已無(wú)法滿(mǎn)足當(dāng)前船舶監(jiān)控設(shè)備的需求。目前的數(shù)據(jù)壓縮技術(shù)主要根據(jù)數(shù)據(jù)的特點(diǎn),選擇不同的壓縮方法。文獻(xiàn)[3]采用小波變換和嵌入式零樹(shù)編碼的方法壓縮電力數(shù)據(jù),先選取合適的小波基對(duì)數(shù)據(jù)進(jìn)行小波變換,再通過(guò)嵌入式零樹(shù)編碼對(duì)經(jīng)小波變換得到的數(shù)據(jù)進(jìn)行壓縮,該方法的壓縮比較高,運(yùn)算量適中,適用于電力系統(tǒng)錄波,但在船舶電力監(jiān)控系統(tǒng)中,由于采集數(shù)據(jù)的頻率較低,若采用該方法,需先將數(shù)據(jù)存儲(chǔ)一段時(shí)間,再對(duì)其進(jìn)行處理,這會(huì)導(dǎo)致數(shù)據(jù)處理時(shí)間較長(zhǎng),內(nèi)存消耗較大。文獻(xiàn)[4]采用基于密度劃分的數(shù)據(jù)存儲(chǔ)方法,先將相近的數(shù)據(jù)納入1個(gè)區(qū)域內(nèi),再去除冗余的數(shù)據(jù),達(dá)到預(yù)期的壓縮效果,這種方法可有效壓縮地理信息類(lèi)數(shù)據(jù),但解壓縮數(shù)據(jù)時(shí)算法較為復(fù)雜,且壓縮率較高,不適宜監(jiān)控系統(tǒng)采用。Wonderware工業(yè)數(shù)據(jù)庫(kù)采用旋轉(zhuǎn)門(mén)算法壓縮數(shù)據(jù),該算法原理簡(jiǎn)單,編程比較容易實(shí)現(xiàn),但當(dāng)數(shù)據(jù)在某一時(shí)間段內(nèi)發(fā)生突變時(shí),采用該算法壓縮的數(shù)據(jù)會(huì)嚴(yán)重失真,若減小壓縮誤差,壓縮率難以得到保證。
船舶電力監(jiān)控系統(tǒng)數(shù)據(jù)傳輸?shù)乃俾瘦^低,大部分僅1 s/次,數(shù)據(jù)波動(dòng)范圍不大,監(jiān)測(cè)數(shù)據(jù)在很長(zhǎng)一段時(shí)間內(nèi)圍繞某一均值上下波動(dòng),最小二乘法可有效跟蹤數(shù)據(jù)波動(dòng)情況,且在該傳輸速率下有充足的運(yùn)算時(shí)間;船舶電力監(jiān)控系統(tǒng)數(shù)據(jù)傳輸?shù)臏y(cè)點(diǎn)較多,導(dǎo)致每秒傳輸?shù)臄?shù)據(jù)量較大,滑動(dòng)窗口技術(shù)可對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行分段處理,為后續(xù)采用最小二乘法進(jìn)行數(shù)據(jù)計(jì)算提供便利?;谝陨咸匦裕疚母鶕?jù)船舶電力監(jiān)控系統(tǒng)數(shù)據(jù)的特點(diǎn)設(shè)計(jì)一種基于最小二乘法和滑動(dòng)窗口的數(shù)據(jù)壓縮策略,并在滑動(dòng)窗口中附加3個(gè)數(shù)據(jù)探測(cè)器,實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù)和相關(guān)參數(shù),以滿(mǎn)足監(jiān)控設(shè)備的需要。由于開(kāi)關(guān)量數(shù)據(jù)不適用于有損壓縮方式,故該策略?xún)H適用于模擬量數(shù)據(jù)。
最小二乘法具有原理簡(jiǎn)明、收斂速度快、易于理解和易于編程實(shí)現(xiàn)等特點(diǎn),已在系統(tǒng)參數(shù)估計(jì)領(lǐng)域得到廣泛應(yīng)用。最小二乘法的原理是利用輸入數(shù)據(jù)計(jì)算系統(tǒng)參數(shù),使通過(guò)系統(tǒng)參數(shù)估計(jì)的理論值與實(shí)際值的差值的平方差最小。從壓縮數(shù)據(jù)的角度分析,記錄輸入的數(shù)據(jù)流,給每個(gè)數(shù)據(jù)分配一定的權(quán)重,根據(jù)權(quán)重預(yù)測(cè)下一個(gè)到來(lái)的值,使預(yù)測(cè)值與實(shí)際值的差值的平方差最小,該平方差可看作壓縮數(shù)據(jù)的誤差。在壓縮數(shù)據(jù)時(shí),只需記錄權(quán)重分配比和初始值,從而達(dá)到減少數(shù)據(jù)存儲(chǔ)量的目的。解壓縮之后得到的數(shù)值就是根據(jù)參數(shù)和初始值計(jì)算得到的估計(jì)值,且估計(jì)值與實(shí)際值的差值的平方差最小,能在一定程度上保證數(shù)據(jù)的精度。在船舶電力監(jiān)控系統(tǒng)中,被控對(duì)象會(huì)源源不斷地提供新的輸入數(shù)據(jù),可利用新的信息提高數(shù)據(jù)壓縮精度。在船舶運(yùn)行工況穩(wěn)定的情況下,數(shù)據(jù)變化不頻繁,在均值附近浮動(dòng),可采用遞推最小二乘法,加入修正項(xiàng)提高數(shù)據(jù)壓縮精度。遞推最小二乘法的表達(dá)式為
(1)
遞推最小二乘法的運(yùn)算步驟如下:
(1) 根據(jù)初始數(shù)據(jù)構(gòu)造();
(2) 根據(jù)式(1)計(jì)算();
(4) 更新();
(5)=+1,返回步驟(1),繼續(xù)循環(huán)。
處理數(shù)據(jù)的窗口可分為固定值窗口、滑動(dòng)窗口和會(huì)話(huà)窗口等3種。固定值窗口只處理每個(gè)時(shí)間段內(nèi)的數(shù)據(jù),不重復(fù)處理數(shù)據(jù),保證每個(gè)數(shù)據(jù)最多被處理1次;滑動(dòng)窗口每次處理完窗口中的數(shù)據(jù)之后,向后滑動(dòng),剔除一部分舊的數(shù)據(jù),接收一部分新的數(shù)據(jù),部分?jǐn)?shù)據(jù)會(huì)被重復(fù)處理,保證每個(gè)數(shù)據(jù)至少被處理1次;會(huì)話(huà)窗口用于捕捉某一時(shí)間段內(nèi)發(fā)生的事件。船舶電力監(jiān)控系統(tǒng)查詢(xún)數(shù)據(jù)以時(shí)間為約束條件,因此窗口中的時(shí)間序列以數(shù)據(jù)接收時(shí)間為準(zhǔn)。根據(jù)式(1),每收到1個(gè)數(shù)據(jù),即更新1次參數(shù),因此處理數(shù)據(jù)的窗口采用滑動(dòng)窗口最為合適。
本文將測(cè)點(diǎn)傳輸?shù)臄?shù)據(jù)看作數(shù)據(jù)流,滑動(dòng)窗口負(fù)責(zé)控制流入數(shù)據(jù)的大小,滑動(dòng)窗口內(nèi)部的數(shù)據(jù)先采用最小二乘法壓縮處理,再存入數(shù)據(jù)庫(kù)中。在采集數(shù)據(jù)過(guò)程中,某些數(shù)據(jù)受抖動(dòng)影響,會(huì)突然偏大或偏小,這種數(shù)據(jù)會(huì)影響壓縮質(zhì)量,需在壓縮過(guò)程中將其剔除。若船舶工況發(fā)生改變,某些數(shù)據(jù)會(huì)脫離原來(lái)的穩(wěn)定范圍,這時(shí)若繼續(xù)采用最小二乘法處理,權(quán)重變化較大,數(shù)據(jù)壓縮精度下降,需存儲(chǔ)上一階段壓縮的數(shù)據(jù)并開(kāi)始新一輪的壓縮過(guò)程。在壓縮過(guò)程中,還需監(jiān)控最小二乘法參數(shù)收斂情況,若參數(shù)未收斂,則壓縮精度較差。綜上,在滑動(dòng)窗口中增加3臺(tái)探測(cè)器,用于提高數(shù)據(jù)壓縮精度。第一臺(tái)探測(cè)器負(fù)責(zé)監(jiān)測(cè)異常數(shù)據(jù),若有異常數(shù)據(jù),則及時(shí)將其剔除;第二臺(tái)探測(cè)器負(fù)責(zé)監(jiān)視數(shù)據(jù)波動(dòng)范圍,若數(shù)據(jù)波動(dòng)范圍變化較大,則說(shuō)明工況發(fā)生改變,前一個(gè)壓縮周期結(jié)束,開(kāi)啟下一個(gè)壓縮周期;第三臺(tái)探測(cè)器負(fù)責(zé)監(jiān)視參數(shù)收斂情況,若參數(shù)收斂,則壓縮結(jié)果可靠,反之判定壓縮結(jié)果不可靠。
本文所述數(shù)據(jù)壓縮策略模型見(jiàn)圖1,每當(dāng)有新的數(shù)據(jù)到來(lái)時(shí),處理過(guò)程如下:
1) 對(duì)新數(shù)據(jù)進(jìn)行檢測(cè),若該數(shù)據(jù)不是異常數(shù)據(jù),則將其傳遞到滑動(dòng)窗口中。在新數(shù)據(jù)被滑動(dòng)窗口接收之后,實(shí)時(shí)更新滑動(dòng)窗口內(nèi)部數(shù)據(jù)的波動(dòng)范圍,若數(shù)據(jù)波動(dòng)范圍未超過(guò)相關(guān)閾值,則采用最小二乘法更新壓縮參數(shù)。
2) 計(jì)算壓縮參數(shù)的收斂情況,判斷壓縮結(jié)果是否可靠。當(dāng)下一個(gè)數(shù)據(jù)到來(lái)時(shí),滑動(dòng)窗口向前滑動(dòng)1次,并剔除最舊的數(shù)據(jù),重復(fù)上述操作,直到滿(mǎn)足壓縮需求為止。滿(mǎn)足壓縮需求之后,合并窗口內(nèi)部的數(shù)據(jù),并將其存入數(shù)據(jù)庫(kù)中。
圖1 數(shù)據(jù)壓縮策略模型
異常探測(cè)器用于檢測(cè)異常數(shù)據(jù),其結(jié)構(gòu)體定義如下:
struct trigger1{
double lastValue[3];
double nowValue;
double nextValue[3];
double range;
};
當(dāng)船舶工況穩(wěn)定時(shí),某一時(shí)刻數(shù)據(jù)前后的幾個(gè)數(shù)據(jù)的值相差不大,本文選擇前后3個(gè)時(shí)刻的數(shù)據(jù)判斷數(shù)據(jù)異常情況。lastValue用于存儲(chǔ)該數(shù)據(jù)之前的3個(gè)數(shù)據(jù);nextValue用于存儲(chǔ)該數(shù)據(jù)之后的3個(gè)數(shù)據(jù);range為數(shù)據(jù)波動(dòng)范圍。計(jì)算該數(shù)據(jù)與這6個(gè)數(shù)據(jù)的差值,若6個(gè)差值均大于波動(dòng)范圍,則丟棄該數(shù)據(jù),否則將其加入滑動(dòng)窗口中。
數(shù)據(jù)波動(dòng)范圍記錄器用于記錄數(shù)據(jù)波動(dòng)范圍,其結(jié)構(gòu)體定義如下:
struct trigger2{
double arverror;
double standerror;
double rangeup;
double rangedown;
int errnumber;
}
參數(shù)收斂檢測(cè)器用于檢測(cè)最小二乘參數(shù)的收斂性,其結(jié)構(gòu)體定義如下:
struct trigger3{
double thetaerr;
double futurey;
bool convergence;
double lasttheta[50];
}
lasttheta用于存儲(chǔ)前幾次計(jì)算的參數(shù)矩陣;thetaerr為上次計(jì)算得到的參數(shù)與本次計(jì)算得到的參數(shù)的殘差;futurey為下一個(gè)數(shù)據(jù)的估計(jì)值;convergence用于判斷參數(shù)是否收斂。最小二乘參數(shù)需經(jīng)過(guò)一定次數(shù)的計(jì)算之后才能收斂,只有參數(shù)收斂才能保證數(shù)據(jù)壓縮精度。當(dāng)每次計(jì)算的參數(shù)的殘差小于某一設(shè)定值,且估計(jì)值與實(shí)際值相差不大時(shí),認(rèn)為參數(shù)收斂,數(shù)據(jù)壓縮結(jié)果有效。
壓縮數(shù)據(jù)的滑動(dòng)窗口結(jié)構(gòu)體定義如下:
struct window{
int number;
QList〈double〉 data;
int start;
int end;
trigger1 outlier;
trigger2 range;
trigger3 thetajudge;
int errnumber;
};
number為滑動(dòng)窗口內(nèi)存儲(chǔ)的數(shù)據(jù)個(gè)數(shù);data為數(shù)據(jù)值;start與end共同確立滑動(dòng)窗口目前處理的數(shù)據(jù)所在的位置;trigger1、trigger2和trigger3為附加的3臺(tái)探測(cè)器,用于保證數(shù)據(jù)壓縮精度。
1) 壓縮算法的步驟如下:
(1) 初始化窗口,初始化相關(guān)參數(shù);
(2) 計(jì)算接收數(shù)據(jù)的時(shí)間,若超時(shí),則轉(zhuǎn)到步驟(9),否則進(jìn)行步驟(3);
(3) 獲取新數(shù)據(jù),采用異常探測(cè)器判斷該數(shù)據(jù)是否為異常數(shù)據(jù),若是,則轉(zhuǎn)到步驟(2),否則進(jìn)行步驟(4);
(4) 采用數(shù)據(jù)波動(dòng)范圍記錄器計(jì)算數(shù)據(jù)波動(dòng)范圍;
(5) 采用最小二乘法更新參數(shù);
(6) 采用參數(shù)收斂檢測(cè)器計(jì)算參數(shù)收斂情況;
圖2 壓縮算法流程圖
(7) 當(dāng)數(shù)據(jù)波動(dòng)未超出指定范圍,且參數(shù)收斂時(shí),若處理的數(shù)據(jù)量大于等于100個(gè),則對(duì)這些數(shù)據(jù)進(jìn)行壓縮處理,并轉(zhuǎn)到步驟(9),否則轉(zhuǎn)到步驟(2);
(8) 當(dāng)數(shù)據(jù)波動(dòng)超出指定范圍時(shí),轉(zhuǎn)到步驟(10);
(9) 將壓縮后的數(shù)據(jù)存入數(shù)據(jù)庫(kù)中,并轉(zhuǎn)到步驟(2)開(kāi)始新的壓縮周期;
(10) 將原始數(shù)據(jù)直接存入數(shù)據(jù)庫(kù)中,并轉(zhuǎn)到步驟(2)開(kāi)始新的壓縮周期。
壓縮算法流程圖見(jiàn)圖2。
2) 解壓縮算法的步驟如下:
(1) 判斷數(shù)據(jù)是否為壓縮數(shù)據(jù),若是,則進(jìn)行步驟(2),否則轉(zhuǎn)到步驟(5);
(2) 讀取初始值向量和最小二乘參數(shù);
(3) 根據(jù)初始值和最小二乘參數(shù)計(jì)算解壓縮值;
(4) 利用得到的解壓縮值還原下一個(gè)解壓縮值,直到所有數(shù)據(jù)解壓縮完畢;
(5) 直接還原數(shù)據(jù)。
為驗(yàn)證本文提出的數(shù)據(jù)壓縮策略的有效性,利用實(shí)船采集的真實(shí)數(shù)據(jù)進(jìn)行壓縮測(cè)試,通過(guò)模擬軟件將真實(shí)數(shù)據(jù)發(fā)送給網(wǎng)關(guān),由網(wǎng)關(guān)傳輸給服務(wù)器。試驗(yàn)環(huán)境如下:處理器采用兆芯KaiXianKX-6640A,主頻為2.6 GHz,內(nèi)存為16 GB;操作系統(tǒng)采用中標(biāo)麒麟V7.0;數(shù)據(jù)庫(kù)采用達(dá)夢(mèng)數(shù)據(jù)庫(kù)8.0;編譯器為Qt5.7。
為衡量壓縮效果,引入指標(biāo)
(1)
(2)
式(1)和式(2):為壓縮比;為壓縮后數(shù)據(jù)占用的存儲(chǔ)空間;為壓縮前數(shù)據(jù)占用的存儲(chǔ)空間,壓縮比越小,數(shù)據(jù)占用的存儲(chǔ)空間越小;為壓縮數(shù)據(jù)與原數(shù)據(jù)的誤差百分比;為原數(shù)據(jù);為解壓縮之后的數(shù)據(jù);為數(shù)據(jù)個(gè)數(shù)。
下面以應(yīng)用較為廣泛的無(wú)損壓縮算法(LZ77算法)和工業(yè)數(shù)據(jù)庫(kù)中常用的旋轉(zhuǎn)門(mén)算法為參照,對(duì)不同壓縮算法的數(shù)據(jù)壓縮效果進(jìn)行對(duì)比,結(jié)果見(jiàn)表1,其中LZ77算法采用Qt5.7編譯器中的zlib開(kāi)源庫(kù),壓縮等級(jí)為1。LZ77算法雖然沒(méi)有壓縮誤差,但其壓縮比較大;旋轉(zhuǎn)門(mén)算法雖然壓縮比較小,但其誤差較大;最小二乘法的船舶電力監(jiān)控系統(tǒng)數(shù)據(jù)壓縮效果最優(yōu)。
表1 不同壓縮算法的數(shù)據(jù)壓縮效果對(duì)比
經(jīng)不同數(shù)據(jù)集測(cè)試,基于最小二乘法的數(shù)據(jù)壓縮結(jié)果見(jiàn)表2。不同數(shù)據(jù)集的壓縮比不同,但壓縮誤差均在可接受的范圍內(nèi)?;谧钚《朔ǖ臄?shù)據(jù)壓縮效果見(jiàn)圖3。解壓縮數(shù)據(jù)與原數(shù)據(jù)相差不大,單個(gè)數(shù)據(jù)誤差在可接受的范圍內(nèi),解壓縮數(shù)據(jù)與原數(shù)據(jù)的波動(dòng)趨勢(shì)基本一致。
表2 基于最小二乘法的數(shù)據(jù)壓縮結(jié)果
圖3 基于最小二乘法的數(shù)據(jù)壓縮效果
綜上,本文所述最小二乘法與LZ77算法相比壓縮率更低,與旋轉(zhuǎn)門(mén)算法相比壓縮誤差更小。經(jīng)不同數(shù)據(jù)集測(cè)試,最小二乘法能保持穩(wěn)定的壓縮效果。采用最小二乘法壓縮的數(shù)據(jù)與原數(shù)據(jù)相差不大,單個(gè)數(shù)據(jù)的誤差不會(huì)影響數(shù)據(jù)變動(dòng)的趨勢(shì)。本文采用的方法涉及矩陣運(yùn)算,運(yùn)算量相對(duì)較大。若矩陣維度較高,會(huì)造成數(shù)據(jù)處理不及時(shí),對(duì)CPU(Central Processing Unit)的要求更高;若矩陣維度較低,會(huì)造成數(shù)據(jù)壓縮效果不理想。因此,需根據(jù)實(shí)際情況選擇矩陣維度。
隨著船舶智能化的不斷發(fā)展,信息的應(yīng)用變得越來(lái)越重要,信息量增加會(huì)增大數(shù)據(jù)存儲(chǔ)負(fù)荷,數(shù)據(jù)壓縮技術(shù)能有效緩解數(shù)據(jù)存儲(chǔ)空間不夠的壓力。本文針對(duì)船舶電力監(jiān)控系統(tǒng)數(shù)據(jù)的特點(diǎn),采用最小二乘法,結(jié)合滑動(dòng)窗口技術(shù)設(shè)計(jì)了一種實(shí)時(shí)數(shù)據(jù)壓縮策略;同時(shí),利用實(shí)船采集的真實(shí)數(shù)據(jù)進(jìn)行測(cè)試,驗(yàn)證了該策略的可行性。試驗(yàn)數(shù)據(jù)集的大小受試驗(yàn)環(huán)境的限制,且無(wú)法模擬突發(fā)狀況下數(shù)據(jù)的變化情況。本文對(duì)閾值的設(shè)計(jì)較為簡(jiǎn)單,可能會(huì)導(dǎo)致部分?jǐn)?shù)據(jù)有較大的誤差。下一步將對(duì)更大規(guī)模的數(shù)據(jù)進(jìn)行壓縮測(cè)試,并將該算法植入監(jiān)控程序中,測(cè)試其在國(guó)產(chǎn)化設(shè)備上的應(yīng)用效果。