尹海峰,庫祥臣
(河南科技大學(xué) 機電工程學(xué)院,河南 洛陽 471003)
相對于傳統(tǒng)發(fā)電行業(yè),風(fēng)力發(fā)電行業(yè)受到風(fēng)資源分布的限制。風(fēng)電機組受惡劣環(huán)境的影響比較厲害,時常在變速變載的條件下工作,受到風(fēng)產(chǎn)生的扭矩、彎矩和軸向推力的作用,其部件容易發(fā)生變形,產(chǎn)生附加的結(jié)構(gòu)應(yīng)力,使得風(fēng)電機組齒輪箱、軸承、發(fā)電機等關(guān)鍵設(shè)備經(jīng)常出現(xiàn)故障。對風(fēng)電機組進行畫面實時監(jiān)控可以大大降低維修費用與停機時間,減少不必要經(jīng)濟損失。本文仿真系統(tǒng)采用OpenGL技術(shù),在Windows 環(huán)境中以Visual C++為開發(fā)工具進行開發(fā)。OpenGL 具有繪制三維圖形的各項功能,它可以與Visual C++緊密結(jié)合,可以實現(xiàn)有關(guān)計算和圖形算法,實現(xiàn)三維模型的可視化[1]。用OpenGL來實現(xiàn)三維顯示,具有簡單、直觀、高效率等特點,它具有強大的三維建模功能及幀緩存動畫技術(shù),并且可以對模型進行光照、材質(zhì)、紋理、反走樣等處理,使得動態(tài)仿真過程呈現(xiàn)逼真三維立體顯示。
OpenGL 是一個獨立于窗口的圖形庫,而圖形最終是在窗口系統(tǒng)里繪制出來的,我們可以建立一個通用的OpenGL 控件,用來繪制機組各部件圖形,當(dāng)引入這個控件時,控件會自動初始化OpenGL[2]。引入控件還有一個好處,它可以在對話框中顯示Open-GL 渲染的畫面,我們可以在對話框中添加其他控件,并在ClassWizard 中為對話框類添加事件響應(yīng)函數(shù),實現(xiàn)與圖形的交互控制。
(1)創(chuàng)建一個MFC ActiveX Control 應(yīng)用程序框架。在StdAfx.h 頭文件中加入與0penGL 相關(guān)的頭文件和連接,在“Project”中添加靜態(tài)庫“opengl32.lib,glu32.lib,glaux.lib,glut32.lib”,在ClassWizard 中實現(xiàn)消息響應(yīng)函數(shù)的設(shè)置,最后為COpenGlView 添加保護型變量HDC m_hDC;HGLRC m_hRC;
(2)設(shè)置像素格式。它反映了0penGL 的繪制風(fēng)格、顏色模式、顏色位數(shù)等。正確設(shè)置像素格式:①填充PIXELFORMATDESCRIPTOR 結(jié)構(gòu);②用ChoosePixelFormat 函數(shù)在硬件所支持的像素格式中選出與給定的像素格式最匹配的一個設(shè)備描述表(Dc);③用SetPixelFormat 函數(shù)將其設(shè)為當(dāng)前像素格式[3]。
(3)建立著色描述表(Render context)并當(dāng)前化著色描述表。在進行OpenGL 繪制之前,必須先建立著色描述表并將其當(dāng)前化,這樣繪制的物體才能顯示出來。
(4)設(shè)置坐標(biāo)變換方式。每次窗口創(chuàng)建或改變大小的時候。都要重新設(shè)置視口大小,因此我們需要在OnSize()中進行視口設(shè)置。
圖1 風(fēng)電葉片
在風(fēng)力發(fā)電仿真中,模型要能準(zhǔn)確的反映機組的結(jié)構(gòu)特點、零部件的幾何相對關(guān)系,因此要對每個運動部件進行單獨的幾何建模,風(fēng)電機組整體結(jié)構(gòu)可分為:葉片、輪轂、低速軸、高速軸、固定支架、齒輪箱、發(fā)電機、控制柜、偏航電機、塔架幾部分。
風(fēng)力發(fā)電機葉片專用翼型已成系列,我們可按其常規(guī)外形進行曲面造型。OpenGL 中的GLU 提供了一個NURBS 接口,該接口是建立在OpenGL 求值程序函數(shù)的基礎(chǔ)上,可進行曲面構(gòu)造。NURBS 能夠比傳統(tǒng)的網(wǎng)格建模方式更好地控制物體表面的曲線度,從而能夠創(chuàng)建出更逼真、生動的模型[4]。以下為u 向p 階,v 向q 階的NURBS 曲面的數(shù)學(xué)表達式:
式中:{Pi}為曲面網(wǎng)格控制點;{wi}為曲面控制點的權(quán)因子;{Ni,p(u)},{Nj,p(v)}分別為p 階和q 階B樣條基函數(shù)。
對于風(fēng)電葉片本仿真系統(tǒng)只需直觀、形象的表達其外部結(jié)構(gòu),不需要嚴(yán)格體現(xiàn)其氣動外形結(jié)構(gòu)??梢愿鶕?jù)風(fēng)電葉片凹面弧度及弧長確定所畫曲面半徑,進而推算出NURBS 曲面的控制點。將控制點儲存在ctlpoints[m][n][k]中,再通過調(diào)用gluNurbsSurface()函數(shù)進行NURBS 曲面繪制。然后根據(jù)風(fēng)電葉片的輪廓邊界,將邊界坐標(biāo)存儲在edgePt[r][l]中,調(diào)用函數(shù)gluBeginTrim()進行定義修剪。修剪曲線為逆時針方向,保留修剪曲線內(nèi)部部分。
風(fēng)電輪轂部件可劃分為兩部分進行建模,前半部分為1/4 橢球,后半部分為圓臺形,輪轂?zāi)P腿鐖D2所示。橢球模型的建立可以從球形入手,實體球面用一個二十面體進行逼近,對二十面體中的三角形進行分割,再通過歸一化將頂點移到球面上,通過重復(fù)這一分割過程得到一個實體球面,再進行g(shù)lScale(TYPE x,TYPE y,TYPE z)縮 放 變 換 和glTranslate(TYPE x,TYPE y,TYPE z)平移變換,使得球面X 軸半徑為Y、Z 軸的2 倍,向X 軸正方向平移1/2X 軸半徑,然后添加一個剪裁面:
可得出1/4 橢球,橢球的剪裁面半徑為:y1=y* sinπ/3,其中x = 2y = 2z;由橢球剪裁面半徑可知,圓臺的上底面半徑為y1,為保證橢球到圓臺的平滑過渡,選著適當(dāng)?shù)膴A角θ,可推算出下底面半徑y(tǒng)2= y1+H* sinθ,其中H 圓臺高度。圓臺的繪制可將其劃分為許多四邊形網(wǎng)格,從下至上劃分為M 個環(huán)形面,每個環(huán)形面劃分為N 個四邊形網(wǎng)格,每個網(wǎng)格上的坐標(biāo)為:
其中0 ≤i <N,0 ≤j <M,M = N-N* y1/y2;i 為網(wǎng)格的第i 列,j 為網(wǎng)格的第j 行。再通過以下流程繪制出圓臺部分,以1/4 橢球坐標(biāo)系為基準(zhǔn),通過glRotatef()繞Z 軸旋轉(zhuǎn)與glTranslatef()向X 軸正方向平移,經(jīng)過兩次模型變換將兩部件契合在一起。
圖2 輪轂
圖3 圓臺繪制流程圖
由于其他幾個部件皆可用三角形網(wǎng)格法和以上圓臺的建模方法進行構(gòu)建,我們將在這里統(tǒng)一講述。三角網(wǎng)格法是OpenGL 繪制不規(guī)則圖形常用的方法之一。其繪圖流程如下:首先確定物體表面各個頂點坐標(biāo),將坐標(biāo)存儲在vertices[]數(shù)組中;然后,遵循環(huán)繞規(guī)則將物體表面劃分為一個個環(huán)繞在物體表面的三角形,將其環(huán)繞順序存儲在round[]數(shù)組中,最后調(diào)用函數(shù)進行繪制:
按照以上兩種方法構(gòu)建出風(fēng)電機組其余各部件的三維模型。最后,通過OpenGL 中的gltranslatef()、gl-Rotatef()、glscalef()、glViewPort()等函數(shù)實現(xiàn)模型的旋轉(zhuǎn)、平移、縮放、視口變換、正交投影和透視投影等操作[6],進行各部件的合理拼裝,得出完整的風(fēng)電機組三維模型。由于0penGL 具有很強的渲染能力,我們可以對模型進行光照、材質(zhì)、紋理、反走樣、霧化等處理,使得模型如同在現(xiàn)實中一樣,具有光潔度、紋理、層次感。圖4,圖5 為完整風(fēng)力發(fā)電機三維模型。
圖4 風(fēng)力發(fā)電機概貌
圖5 風(fēng)力發(fā)電機內(nèi)部組件
風(fēng)電機組動畫仿真采用了雙緩存技術(shù)和顯示列表實現(xiàn)動畫顯示。雙緩存技術(shù)即采用前后兩個緩存,在雙緩存模式下,位平面被分為前臺緩存和后臺緩存。只有前臺緩存才被顯示,因此當(dāng)完整的畫面在后臺緩存中哂出以后,就調(diào)用swapBuffer()函數(shù),使其成為前臺可見緩存[5]。這樣循環(huán)往復(fù),隱藏了畫圖的過程,視頻圖像可以在人眼察覺不出的時間間隔交替出現(xiàn),于是看起來所有的畫面都是連續(xù)的。顯示列表的設(shè)計能優(yōu)化程序運行性能,尤其是網(wǎng)絡(luò)性能,它被設(shè)計成命令高速緩存,而不是動態(tài)數(shù)據(jù)庫緩存。采用雙緩存技術(shù)及顯示列表實現(xiàn)動畫顯示可大量減少刷新時間和計算量,使得畫面更加流暢。
風(fēng)電機組要進行刷新操作,首先要在ClassWizard 中為對話框類添加事件響應(yīng)函數(shù)OnTimer(),此函數(shù)為一個時鐘計時器,設(shè)置計時器,每0.01s 響應(yīng)一次:SetTimer(1,10,NULL);每次響應(yīng)刷新一下OpenGL 中的畫面:
可在ClassWizard 中為對話框類添加事件響應(yīng)函數(shù)OnOutofmemorySlider(),通過修改輪轂及主軸在每次刷新中旋轉(zhuǎn)的角度,實現(xiàn)輪轂及主軸轉(zhuǎn)速的控制;修改機艙繞塔架的旋轉(zhuǎn)角度,來實現(xiàn)機艙隨風(fēng)向變化而產(chǎn)生相應(yīng)的旋轉(zhuǎn)。該界面主要功能是打開模型、仿真操作、運動控制等,在操作菜單下可以打開“串口通信接收”,提供各參數(shù)的實時顯示[7]。系統(tǒng)設(shè)定不同級別的報警閾值,超出閾值范圍會出現(xiàn)相應(yīng)級別的預(yù)警,并在該部位顯示出來。
網(wǎng)絡(luò)通信主要是在發(fā)送端把信息通過規(guī)定好的協(xié)議進行組裝包,在接收端按照規(guī)定好的協(xié)議把包進行鋸析,從而提取出對應(yīng)的信息,達到通信的主要的目的[8]。
本系統(tǒng)采用基于TCP/IP 協(xié)議的Winsock 數(shù)據(jù)通信,首先在V C++6.0 的應(yīng)用程序生成向?qū)е?在對話框程序向?qū)У牡诙降腤indows Socket 選項選中即可自動加載Socket 初始化代碼[9]。通信程序由兩部分構(gòu)成,一部分是服務(wù)器程序,另一部分是客戶端程序。在服務(wù)器程序中,添加兩個基類為CSocket 的類分別實現(xiàn)Socket 的監(jiān)聽和與客戶端的通信。在CListeningSocket 類中,添加函數(shù)OnAccept 負(fù)責(zé)Socket 的監(jiān)聽,當(dāng)有客戶端連接服務(wù)器時,執(zhí)行此函數(shù)。在CClientSocket 類中,添加函數(shù)OnReceive 和On-Send 負(fù)責(zé)接收和發(fā)送數(shù)據(jù)。在客戶端程序中我們將添加一個基類為CSocket 的類來實現(xiàn)與服務(wù)器的連接和通信。在CChatSocket 類中,添加函數(shù)OnReceive和OnSend 負(fù)責(zé)接收和發(fā)送數(shù)據(jù)[10]。在系統(tǒng)界面中打開“串口通信接收”,將機組的振幅、高低速軸轉(zhuǎn)速、機艙轉(zhuǎn)角等數(shù)據(jù)由服務(wù)器端傳輸?shù)娇蛻舳耍ㄟ^數(shù)據(jù)處理,將各數(shù)據(jù)設(shè)定為操作界面中的動態(tài)參數(shù),從而實現(xiàn)風(fēng)電機組的動態(tài)仿真。
本文采用OpenGL 技術(shù),在Visual C++6.0 環(huán)境下,開發(fā)的風(fēng)電機組三維可視化仿真系統(tǒng),建立了形象逼真的三維模型,實現(xiàn)了風(fēng)力發(fā)電機運行狀態(tài)的動態(tài)仿真,為進一步研究風(fēng)力發(fā)電機在線實時狀態(tài)監(jiān)測奠定了基礎(chǔ)。
[1]楊艷華,楊維芳,張志華. 基于OpenGL 的鐵路軌枕模型的三維可視化研究與實現(xiàn)[J]. 蘭州交通大學(xué)學(xué)報,2011,30(6):35-39.
[2]孫波. OpenGL 編程實例學(xué)習(xí)教程[M]. 北京:北京大學(xué)出版社,2000.
[3]曹自洋,郝礦榮. OpenGL 在機器人三維動態(tài)仿真系統(tǒng)中的應(yīng)用[J]. 計算機應(yīng)用研究,2004,21(5):200-201,204.
[4]Dave Shreiner,Mason Woo,Jackie Neider,Tom Davis. Open-GL 編程指南[M]. 北京:人民郵電出版社,2005.
[5]王泉國,王孚懋,劉凱. 基于OpenGL 的快速成型實時仿真動畫軟件的開發(fā)[J]. 煤礦機械,2012,33(1):254-256.
[6]王泉國,王孚懋,劉凱. 基于OpenGL 的快速成型實時仿真動畫軟件的開發(fā)[J]. 煤礦機械,2012,33(1):254-256.
[7]孫曉潔,葉樺,費樹岷,等. 基于OpenGL 的混凝土泵車智能臂架系統(tǒng)仿真[J]. 科技通報,2011,27(5):686-690.[8]曹衍龍,劉海英. Visual C++網(wǎng)絡(luò)通信編程實用案例精選[M]. 北京:人民郵電出版社,2006.
[9]孫軍文,安妮,王中訓(xùn). 基于V C++6.0 的網(wǎng)絡(luò)通信設(shè)計[J]. 現(xiàn)代電子技術(shù),2011,34(23):52-55.
[10]劉松,鐘子發(fā). 基于對等模式的Socket 網(wǎng)絡(luò)通信[J].微處理機,2008,29(5):46-50.