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