,,,
(華中科技大學 船舶與海洋工程學院,武漢 430074)
本顯控系統是一種新型水下試驗平臺的重要組成部分,是一種基于網絡的分布式系統。本課題研究的水面顯控系統是該水下試驗平臺的數據處理中心和監控顯示系統,進行實時顯控,并記錄試驗數據。
該試驗平臺工作于水下150 m深環境,平臺四角由錨固定,每個錨由一臺錨泊絞車和一臺張緊絞車進行控制收放,絞車由液壓馬達驅動,進行調平。利用牽引絞車牽引位于平臺上的小車,使小車在平臺導軌上達到指定速度以完成指定實驗。平臺模型及顯控系統結構見圖1、2。


圖1 平臺模型 圖2 顯控系統結構
顯控系統在功能上來說,分為三個功能模塊:網絡通信模塊、數據處理模塊和實時再現仿真模塊,功能結構圖見圖3。

圖3 顯控系統功能結構
系統主要由主控節點、數據處理節點(工控機2)、實時三維仿真節點(工控機1)、應急控制節點等組成,系統采用基于以太網的分布式結構,由數據圖表顯示節點控制整個仿真系統的數據接收、處理、存儲以及仿真推進,系統結構見圖4。

圖4 系統網絡結構
主控節點(主控PLC)接收水下設備傳輸上來的信號,并將其數據發送給指定節點。(主控節點的控制作用在這里不做討論)。
數據處理節點是數據的管理站點,它接收主控制節點傳送的數據,并進行數據解析、數據校驗、參數處理和數據存儲,另外還要對小車和平臺的速度等數據進行圖表曲線顯示,以及為實時三維仿真節點提供仿真數據。實時三維仿真節點主要進行三維建模、實時的三維仿真等。
應急節點是在水下設備不能正常工作的情況下啟動應急系統,水下數據將從應急節點傳輸。
網絡通信是本網絡顯控系統的硬件基礎,本系統使用普通的以太網為通信介質,采用標準的TCP/IP協議傳輸數據。
本系統網絡通信采用基于TCP協議的流式套接字,使用Winsock編程最常用的模式:服務器-客戶端模式(Server-Client)[1-2],網絡通信過程見圖5。

圖5 Server-Client模式通信過程
1.3.1 數據處理流程
實時數據處理是本系統的核心內容,是所有其它工作的數據中心,其工作流程如下。
1)數據處理節點接收到主控節點的數據碼字,對其進行數據解析,根據預設定的編碼位設置,解析幀類型、幀長等設備和編碼信息,以及運動和狀態等具體數據。典型小車數據位設置見表1。

表1 小車數據位設置
2)對數據進行濾波,即數據校驗。在程序中設置一個計算器count,一旦接收到異常數據,計數器從0開始計數,如果連續異常次數超過5此,也就是說count>5時,有理由認為設備發生了故障,這時必須進行檢查。數據校驗的程序流程圖見圖6。

圖6 數據校驗流程
3)將正確的數據進行存儲,供以后查閱。存儲的數據中不僅包括實時的小車速度、位置,平臺傾角、深度等信息,還包括具體信息數據的發送(或接收)時刻,設備號等。
4)對一些沒有直接信號的數據,還須通過計算后一起存儲,比如小車加速度,在程序中使用結構體Struct來表示一個設備數據。例如小車的數據結構定義為
Struct Car
{
char carID[8];//小車設備 ID號
char time[20];//時刻
float speed;//瞬時速度
float acceleration//瞬時加速度
float displacement;//位移
int direction;//方向
Coordinate coords;//坐標位置
}
之后,取出數據,對小車、平臺等數據進行圖表曲線的實時繪制。數據流程圖見圖7。

圖7 數據處理流程
1.3.2 設計實現
如果將所有的工作放在同一個線程,如果出現上面的情況,將會發生阻塞,發送過來的數據得不到及時的處理,很可能會丟失。
本系統采用多線程技術,創建3個線程:線程1(數據接收線程)負責處理數據的接收;線程2(數據處理線程)負責數據解析、數據存儲和發送放;線程3(曲線圖表線程)負責從數據區中取數據,以及曲線圖表顯示,簡單的數據流程見圖8。

圖8 數據處理節點流程
既然用到了多線程技術,必然會涉及到線程的同步問題。使隸屬于同一進程的各線程協調一致地工作稱為線程的同步[3]。當多個線程同時讀寫同一份共享資源的時候,可能會引起沖突。當線程1對數據區的寫操作和線程2的讀操作同時進行時,這時可能會出現讀數據錯誤,可以使用事件(CEvent)來進行線程的同步。
CEvent類提供了對事件的支持。事件是一個允許一個線程在某種情況發生時,喚醒另外一個線程的同步對象[4]。例如在某些網絡應用程序中,線程1負責監聽通信端口,線程2對接收的數據進行處理。通過使用CEvent類,線程1可以通知線程2何時處理數據。部分程序實現如下。
在線程1的函數中Thead1Func(LPVOID pParam)進行寫操作,寫完即喚醒讀操作:
......
WaitForSingleObject(hEvent.m_hObject,INFINITE);//等待
write();//寫入操作
hEvent.SetEvent();//設置為有信號,喚醒讀操作
......
在線程2的函數中Thead2Func(LPVOID pParam)進行讀操作,開始時即設置為有信號,可以進行寫操作:
......
hEvent.SetEvent();//設置為有信號
WaitForSingleObject(hEvent.m_hObject,INFINITE);//等待
read();//寫入操作
hEvent.SetEvent();//設置為有信號
......
同樣,線程2與線程3之間也可以使用這種同步處理。
1.4.1 三維模型動畫
由于OpenGL沒有提供高級命令函數來定義復雜的三維模型[5],本系統利用3DSMax建立三維立體模型。在3DSMax中,將所建立的幾何模型保存為3DS數據格式,然后導入到軟件系統中。需要注意的是3DS數據格式只能保存和轉換幾何信息,而色彩、材質等信息可能會在轉換時丟失[6]。
動畫是由一幀幀有序的圖像連續播放形成的,而每幀都是由一些特定圖形對象繪制在屏幕上形成的[7]。因此要形成動畫,必須選好每一幀的時間間隔,以及模型在每一幀之間的運動“間隙”(包括位移、角度等)。
理解動畫的原理對后面的參數處理將有很大的影響,因為三維仿真中,模型的運動必須考慮到時間間隔和運動“間隙”。
1.4.2 數值處理
讀取到解析后的數據后,數據還不能直接用于三維仿真。讀取的數據是真實物體的運動數據,必須經過參數處理,轉化為三位模型數據,才能運用于三維仿真中。
以小車為例,設小車軌道實際長為Lrl,模型中小車導軌長為Lml,以導軌最左端為坐標原點,設實際導軌上某坐標數值為Lrc,模型中導軌相應的坐標值為Lmc,則有

(1)
由式(1)可得模型坐標值Lmc=Lrl·c。
這樣可以輕松地用小車的真實坐標值,乘以比例值c,得到三位仿真位置坐標值。速度、加速度等涉及物理量也可以這樣處理。
但是角度的處理就不能這樣乘以一個比例值,角度值不需要比例值。實際上是利用相似性原理,將實體大小縮放成模型的大小,而角度是不變的(類比相似三角形)。
模型的比例值并不一定全都一樣,為增加模型的真實感,以及便于顯示觀察,某些模型比例值會作適當調整。如為便于觀察,錨的比例值Cm會比平臺的大,但從仿真的真實感考慮,錨的深度、下放和上拉的速度,計算時將使用平臺模型的比例值。這一點要特別注意。
1.4.3 時鐘處理
對于動畫演進,實際上是利用程序在間隔時間內重繪每個坐標點[8],時間間隔是靠定時器中斷產生的,在代碼中可由函數SetTimer()設置一個系統時鐘周期Tm(前述時間間隔)。
接收到的數據也有一個時鐘周期Tr(水下數據發送周期),如果Tr<1/24(人眼視覺停留時間),一般取仿真時鐘周期Tm=Tr即可,此時可以保證動畫的連續性。但是本系統水下有多個控制器和傳感器,它們發送數據的時鐘周期并不統一,取Tm=Trmin,那么對于Tr>Tm的設備數據須進行特殊處理。
當設備Tr>Tm時,設備的數據沒有出現在時刻N·Tm,這時會出現“數據真空”問題。那么必須使用一個比較合理的算法,利用已有的數據,近視地推算出N·Tm時刻的位置數據。
為此,設計比較可行的算法——中點逼近法。
在一段時間內,物體有數據傳輸過來,設從時刻t1開始,其數據傳輸時鐘周期為Tr,那么,在時刻t1,t1+Tr,t1+2·Tr…t1+i·Tr…,程序中可以讀到數據Mr0,Mr1,Mr2,…,Mri,…。
將時刻簡化,見圖9,

圖9 中點逼近法
現在的問題是,已知讀取到了tr0,tr1,tr2,…,tri-1,tri,時刻的數據Mr0,Mr1,Mr2,…,Mri,如何求出tmj時刻的數據Mrj。不斷取中點,使用中點不斷地逼近,直到某兩點的中點時刻為tmj,即認為該點時刻數據為Mrj。
1)如果tri=tmj,則有Mrj=Mri,算法結束;否則執行2)。
2)根據Mri-1,Mri求出Mri+1,tri是[tri-1,tri+1]的中點,取Mri為時間段[tri-1,tri+1]的平均值,設有
2·Mri=Mri-1+Mri+1
(2)
則有Mri+1=2·Mri-Mri-1。
再取[tri,tri+1]的中點時刻tM0,近似計算該時刻數據M0=(Mri+1+Mri)/2,如果tM0=tmj,則有Mrj=M0,算法結束。
3)否則,如果tM0>tmj,利用[tri,tM0]的中點,以及Mri和M0重復步驟2)(將tM0賦值給tri+1,將M0賦值給Mri+1);
4)否則,如果tM0 注意: ①傳輸時鐘開始時刻對應的第一個程序時鐘為仿真的開始,也就是說程序開始的時刻要早于傳輸;同樣,程序時鐘結尾時刻要晚于傳輸。 式中:S——位移或角度; Si-1——已經接受到的數據; v(vi-1和vi)——速度或角速度。 算法的可行性說明。 1)平臺和小車等的運動過程是一個比較緩慢的過程,一般來說,在某一段時間內可以近似地看成是線性運動,在這種情況下,用中點逼近比較合理; 2)程序時鐘周期取各數據傳輸的最小值,每一個周期非常短,那么數據變化也非常小,用中點逼近誤差很小。 以小車運動為例,選取小車數據傳輸周期為Tr=0.037 5 s,程序周期為Tm=0.025 s。小車的運動規律見圖10。 圖10 小車運動規律 試驗中,網絡傳輸的數據經過解析和濾波之后的數據如下,選取t∈(5,7.348)時間段(加速度開始勻速減小)中部分,以t=5.0 s為開始時刻,獲取到的數據只在N·Tr時刻,見表2。在三維仿真時,在時刻N·Tm的仿真數據見表3。 表2 實驗傳輸數據 表3 仿真數據 表3中,實際數據是根據小車運動規律(圖10所示)算出的小車的理想運動數據;推算位移是根據公式(3)算出的三維仿真中小車位移量。 從結果可以看出,網絡傳輸的數據較為穩定,數據處理各線程工作協調,能較好地保證數據傳輸和處理的同步。從表3可以看出,“中點逼近”得出的位移量和理想數據基本上是一致的,其誤差非常小,結果非常理想。 1)針對控制器在水下串口通信速率不高的特點,采用普通以太網的TCP/IP通信網絡,不僅提高了通信速率,而且大大增強了通信的穩定性。 2)利用半物理三維仿真動畫,能流暢地實時地從水面觀測水下工作狀態。 3)使用中點逼近法,能比較理想地解決程序時鐘和數據傳輸時鐘不一致而產生的“數據真空”問題。 本系統經過了多次船池模擬實驗,實驗證明,數據處理和接收穩定可靠,三維仿真實時性較高,該研究可以較好地實現顯控系統的要求。但其中也有欠缺,數據處理中的線程可以考慮使用線程池技術,參數處理中的時鐘處理算法原理上比較粗略,這些也是今后的研究內容。 [1] TANENBAUM A S.計算機網絡[M].潘愛民,譯.北京:清華大學出版社,2004. [2] 汪 翔,袁 輝.Visual C++實踐與提高——網絡編程篇[M].北京:中國鐵路出版社,2001. [3] 戴大蒙.基于非阻塞式Winsock的多線程網絡通信機制[J].計算機工程,2006,32(6):137-138. [4] 郭羽成.三維視景仿真中面向客戶端的網絡同步模型研究[D].武漢:武漢理工大學,2006. [5] 孫 卿.基于OpenGL的衛星運行仿真[D].武漢:華中科技大學,2004. [6] 葛 翔.基于OpenGL的三維建筑仿真與漫游技術研究[D].武漢:武漢理工大學,2006. [7] 陳 勇.仿生機器人運動形態的三維動態仿真[D].長春:吉林大學大學,2005. [8] 劉 升,王行愚,游曉明.基于VC++的OpenGL三維動畫仿真及場景漫游的實現[J].計算機工程與設計,2006,27(17):3235-3238.
2 實驗結果



3 結論