郭峰++麻強(qiáng)
摘 要:風(fēng)力發(fā)電機(jī)葉片監(jiān)測(cè)系統(tǒng)能夠及時(shí)了解葉片的運(yùn)行狀態(tài),該系統(tǒng)的研發(fā)具有重要的現(xiàn)實(shí)意義。本文給出了系統(tǒng)的拓?fù)浣Y(jié)構(gòu)圖,設(shè)計(jì)了軟件體系結(jié)構(gòu),并針對(duì)葉片狀態(tài)數(shù)據(jù)傳輸?shù)奶攸c(diǎn),基于Netty框架設(shè)計(jì)了系統(tǒng)數(shù)據(jù)傳輸協(xié)議,有效解決了高頻數(shù)據(jù)接收和處理的問(wèn)題。
關(guān)鍵詞:風(fēng)電葉片監(jiān)測(cè)系統(tǒng);軟件體系結(jié)構(gòu);Netty
中圖分類(lèi)號(hào):TN915 文獻(xiàn)標(biāo)識(shí)碼:A
0.引言
風(fēng)力發(fā)電是具有大規(guī)模開(kāi)發(fā)前景的清潔新能源之一,在當(dāng)今社會(huì)有著重要的社會(huì)效益和經(jīng)濟(jì)效益。然而大部分優(yōu)質(zhì)風(fēng)資源都在人煙稀少、環(huán)境惡劣、氣候復(fù)雜的地區(qū),風(fēng)力發(fā)電場(chǎng)也大都坐落在這些地方,因而風(fēng)力發(fā)電機(jī)運(yùn)行狀態(tài)的監(jiān)測(cè)和維護(hù)便成了風(fēng)電行業(yè)的重要課題。葉片作為風(fēng)電機(jī)組關(guān)鍵零部件之一,其狀態(tài)的好壞直接影響著風(fēng)電機(jī)組的發(fā)電效率。葉片工作在高空、全天候條件下,經(jīng)常受到空氣介質(zhì)、大氣射線、沙塵、雷電、 暴雨、冰雪的侵襲,容易造成葉片損傷。傳統(tǒng)的依靠人工巡檢的方式發(fā)現(xiàn)葉片問(wèn)題,不僅費(fèi)時(shí)費(fèi)力,而且效率低下,往往不能及時(shí)發(fā)現(xiàn)葉片潛在的問(wèn)題和缺陷異常,這將對(duì)風(fēng)電機(jī)組運(yùn)行維護(hù)工作產(chǎn)生巨大影響,甚至導(dǎo)致安全事故。因此對(duì)葉片運(yùn)行狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)測(cè)是非常有必須要的,對(duì)于提高機(jī)組利用率,減少維護(hù)成本具有重要的意義。
1.系統(tǒng)拓?fù)浣Y(jié)構(gòu)
風(fēng)電葉片狀態(tài)的實(shí)時(shí)監(jiān)測(cè)系統(tǒng)包括監(jiān)測(cè)儀,傳輸網(wǎng)絡(luò)和服務(wù)端,服務(wù)端軟件部署在風(fēng)力發(fā)電廠的中心服務(wù)器上,傳輸網(wǎng)絡(luò)基于因特網(wǎng)構(gòu)建,監(jiān)測(cè)儀通過(guò)GPRS或Wifi接入因特網(wǎng),監(jiān)測(cè)數(shù)據(jù)通過(guò)TCP/IP傳輸?shù)街行姆?wù)器。工作人員可以在監(jiān)測(cè)中心或者通過(guò)移動(dòng)設(shè)備實(shí)時(shí)查看并及時(shí)獲知風(fēng)力發(fā)電機(jī)葉片的運(yùn)行狀態(tài)。監(jiān)測(cè)中心的監(jiān)測(cè)管理軟件能夠?qū)崿F(xiàn)數(shù)據(jù)的遠(yuǎn)程采集和遠(yuǎn)程監(jiān)測(cè),監(jiān)測(cè)的所有數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù),并能生成各種報(bào)表和表格。
本系統(tǒng)拓?fù)浣Y(jié)構(gòu)如圖1所示,主要由中心服務(wù)器、通信網(wǎng)絡(luò)、現(xiàn)場(chǎng)監(jiān)測(cè)設(shè)備、監(jiān)控設(shè)備4部分組成,通信網(wǎng)絡(luò)以Internet為基礎(chǔ)構(gòu)建, 現(xiàn)場(chǎng)監(jiān)測(cè)設(shè)備采集的數(shù)據(jù)通過(guò)Internet傳輸?shù)街行姆?wù)器, 監(jiān)控設(shè)備包括PC、筆記本電腦、智能手機(jī)等。
2.軟件體系結(jié)構(gòu)設(shè)計(jì)
分層是最重要最常見(jiàn)的軟件體系結(jié)構(gòu)風(fēng)格之一,根據(jù)服務(wù)端軟件的功能要求,本系統(tǒng)采用分層B/S結(jié)構(gòu),分為表示層,業(yè)務(wù)層,數(shù)據(jù)層。系統(tǒng)軟件體系結(jié)構(gòu)如圖2所示。
表示層有兩種形式,通過(guò)瀏覽器訪問(wèn)的Web應(yīng)用形式,和運(yùn)行在android平臺(tái)下的移動(dòng)APP形式。為實(shí)現(xiàn)界面和業(yè)務(wù)邏輯的分離,表示層采用JSP開(kāi)發(fā),并通過(guò)Spring MVC框架進(jìn)行訪問(wèn)控制。
為保證軟件低耦合,高內(nèi)聚特性以提高軟件的質(zhì)量,業(yè)務(wù)層采用Spring框架進(jìn)行封裝,并以tomcat作為web容器.
數(shù)據(jù)訪問(wèn)層包括數(shù)據(jù)庫(kù)訪問(wèn)和網(wǎng)絡(luò)通信兩個(gè)部分。數(shù)據(jù)庫(kù)訪問(wèn)模塊基于Mybatis框架開(kāi)發(fā),為數(shù)據(jù)庫(kù)中的每個(gè)表設(shè)計(jì)一個(gè)Java類(lèi),類(lèi)的屬性與表的字段對(duì)應(yīng),對(duì)數(shù)據(jù)庫(kù)的操作通過(guò)Mybatis進(jìn)行,而程序代碼中不出現(xiàn)SQL語(yǔ)句。 Java提供的NIO功能使用復(fù)雜,本系統(tǒng)基于Netty開(kāi)發(fā)網(wǎng)絡(luò)通信模塊,Netty封裝了socket通信功能,方便建立中心服務(wù)器與檢測(cè)儀的數(shù)據(jù)連接。
4.基于Netty的數(shù)據(jù)處理機(jī)制
當(dāng)前系統(tǒng)中每臺(tái)風(fēng)機(jī)有3個(gè)葉片,每個(gè)葉片上安裝6個(gè)傳感器,其中4個(gè)傳感器監(jiān)測(cè)應(yīng)變,另外兩個(gè)傳感監(jiān)測(cè)溫度,應(yīng)變和溫度以波長(zhǎng)的形式發(fā)送到數(shù)據(jù)庫(kù),波長(zhǎng)用浮點(diǎn)數(shù)表示。每臺(tái)風(fēng)機(jī)用一個(gè)調(diào)制解調(diào)儀以50Hz的頻率通過(guò)4G模塊向服務(wù)器發(fā)送數(shù)據(jù),每個(gè)調(diào)制解調(diào)儀有4個(gè)通道,分別連接每個(gè)葉片上的傳感器。目前4個(gè)通道有一個(gè)是空置的,未來(lái)通道數(shù)量有可能擴(kuò)充到8個(gè),每通道也可能會(huì)配置更多的傳感器。
本系統(tǒng)中傳感器數(shù)量不多,但是由于傳輸頻率較高,對(duì)接收服務(wù)具有一定的壓力,傳統(tǒng)的基于Socket的網(wǎng)絡(luò)數(shù)據(jù)傳輸實(shí)現(xiàn)方式是同步阻塞的,當(dāng)客戶(hù)端并行連接過(guò)多或者頻繁傳輸數(shù)據(jù)時(shí),消耗大量的服務(wù)器資源,造成服務(wù)器性能下降,不能及時(shí)處理客戶(hù)端的請(qǐng)求。針對(duì)此類(lèi)應(yīng)用場(chǎng)景,研究人員提出多種改進(jìn)方案,Netty是具有代表性的高效率的異步非阻塞式網(wǎng)絡(luò)通信框架,在電子商務(wù)、游戲、大數(shù)據(jù)等領(lǐng)域獲得了大量的應(yīng)用,如淘寶、hadoop的底層通信機(jī)制都是基于Netty實(shí)現(xiàn)的。
在本系統(tǒng)中,每幀數(shù)據(jù)大小是不同的,由于傳感器配置數(shù)量未來(lái)可能發(fā)生變化,或者在運(yùn)行過(guò)程中,某些傳感器可能發(fā)生故障無(wú)法發(fā)送數(shù)據(jù),因此,在傳輸過(guò)程中,每幀數(shù)據(jù)量是不同的,需要根據(jù)每個(gè)通道上的傳感器數(shù)量計(jì)算幀的大小。
基于上述因素,通信協(xié)議數(shù)據(jù)區(qū)格式見(jiàn)表1。
服務(wù)器讀取數(shù)據(jù)分為兩個(gè)階段:(1)讀取固定字節(jié)的幀頭數(shù)據(jù),判斷傳感器數(shù)據(jù)的長(zhǎng)度;(2)根據(jù)計(jì)算結(jié)果,讀取傳感器數(shù)據(jù)。
基于Netty設(shè)計(jì)實(shí)現(xiàn)的自定義解碼器關(guān)鍵代碼如下:
public class CustomDecoder extends ByteToMessageDecoder {
//固定長(zhǎng)度的幀頭數(shù)據(jù)是14個(gè)字節(jié)
private static int HEADER_SIZE = 14;
private static int dstStartPos = 3;
private static int dstStopPos = 11;
private static int count=0;
private static ByteBuf buf = Unpooled.buffer(1024);
private Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
//標(biāo)記讀指針位置,以便可以回滾指針endprint
in.markReaderIndex();
// 如發(fā)現(xiàn)剩余字節(jié)不夠14字節(jié),回滾指針,等待下次解碼
if (in.readableBytes() < HEADER_SIZE) {
buf.clear();
in.resetReaderIndex();
return null;
}
//讀取包頭信息
in.readBytes(buf, HEADER_SIZE);
byte[] req = new byte[buf.readableBytes()];
buf.readBytes(req);
// 每通道最多6個(gè)傳感器,1個(gè)字節(jié)保存通道的傳感器器數(shù)量,共8個(gè)字節(jié)
byte b1,b2,b3,b4,b5,b6,b7,b8;
b1=req[2]; b2=req[3]; b3=req[4]; b4=req[5];
b5=req[6]; b6=req[7]; b7=req[8]; b8=req[9];
//計(jì)算出不確定長(zhǎng)度的包體數(shù)據(jù)
int msgLen = (b1+b2+b3+b4+b5+b6+b7+b8)*2;
// 如發(fā)現(xiàn)剩余字節(jié)不夠包體長(zhǎng)度,回滾指針,等待下次解碼
if (in.readableBytes() < msgLen) {
System.out.println("包體長(zhǎng)度小,回滾”);
buf.clear();
in.resetReaderIndex();
return null;
}
//讀取包體信息
in.readBytes(buf, msgLen);
ByteBuf frame = ctx.alloc().buffer(HEADER_SIZE + msgLen);
frame.writeBytes(buf, 0, HEADER_SIZE + msgLen);
buf.clear();
return frame;
}
}
結(jié)語(yǔ)
系統(tǒng)采用多層B/S軟件架構(gòu),結(jié)合高效、安全、主流的java開(kāi)發(fā)框架——SSM(Spring MVC+Spring+Mybatis), 和異步非阻塞式的網(wǎng)絡(luò)通信框架Netty,系統(tǒng)具有方便快捷的操作界面、靈活安全的權(quán)限管理、提供PC端和移動(dòng)端實(shí)時(shí)和歷史數(shù)據(jù)的豐富報(bào)表,滿(mǎn)足了用戶(hù)隨時(shí)了解葉片狀態(tài)的需求。
目前,該系統(tǒng)已經(jīng)通過(guò)驗(yàn)收測(cè)試,用戶(hù)反應(yīng)運(yùn)行情況良好,尤其是數(shù)據(jù)傳輸方面,服務(wù)器能夠有效接收和處理高頻的傳感器數(shù)據(jù)。
參考文獻(xiàn)
[1]普雷斯曼,鄭人杰,等,譯.軟件工程,實(shí)踐者的研究方法[M].北京:機(jī)械工業(yè)出版社,2011.
[2]Spring+MyBatis企業(yè)應(yīng)用實(shí)戰(zhàn) 瘋狂軟件[M].北京:電子工業(yè)出版社,2017.
[3]李林鋒.Netty權(quán)威指南[M].北京:電子工業(yè)出版社,2014.
[4]溫昱.軟件架構(gòu)設(shè)計(jì)[M].北京:電子工業(yè)出版社,2007.endprint