0 引言 上世紀九十年代以來,由于計算機技術、自動控制技術和仿真技術的飛速發展,訓練模擬器在各個領域特別是航海、航天、軍事領域得到了廣泛的應用并取得了很好的應用成果。動力系統是艦艇的重要系統之一,其操作人員的操作水平對艦艇能否遂行各項戰斗任務影響重大。因此,動力系統訓練模擬器在我國海軍已得到較廣泛應用。這些訓練模擬器大都采用半實物仿真的模式,模擬器在設備外觀上與被仿真設備完全一致,但其內部為計算機控制,并沒有真實設備。這種訓練模式的優點是學員的操作手感與被仿真設備完全一致,學員完成訓練后完全可以達到操作實際裝備所需的操作技能,能顯著提高軍事訓練的質量與速度。 半實物仿真設備面板上有各類操作與顯示部件,必須用數據采集設備采集操作人員操作開關等部件產生的數據,同時還要驅動指示燈、儀表等顯示部件將計算結果進行輸出。因此,設計一套可靠工作的數據采集與控制系統是研制半實物訓練模擬器的關鍵技術之一。 1 系統概述 動力系統設備多而且關系復雜,筆者開發的模擬器包括37 臺模擬設備,合計開關量輸入點733 個,開關量輸出點1115 個,模擬量輸入點19 個,模擬量輸出點149 個。系統的核心是仿真服務器(該服務器同時作為模擬器的教練員臺)。服務器上運行SimuEngine 仿真引擎,系統中所有的數學模型都由仿真引擎調度。I/O 設備采集半實物設備上的操作,由通信程序將操作數據通過以太網上傳至服務器上的實時數據庫,服務器根據實時數據庫對數學模型進行計算,計算結果也寫入實時數據庫。通信程序將最新計算結果發送給I/O 設備,I/O 設備驅動相應的指示燈或儀表進行顯示。系統總體結構如圖1 所示。 2 設備選型 接口系統的設計有四種方案可供選擇: (1)基于某種型號的微處理器或單片機設計專用的接口硬件。該方案的優點是成本低,但設計周期長,可靠性難以保證,且開發調試困難。 (2) 采用工業控制計算機以及配套的硬件接口。該方案的優點是成本較低,選型方便快捷、開發調試方便。但由于這種接口系統依賴于WINDOWS 操作系統運行,可靠性不高。 圖 1 系統總體結構 (3)采用可編程序控制器PLC 作為接口。該方案的優點是可靠性高、開發調試方便、模塊化結構、易于維護;缺點是成本高,而且傳統的中低端PLC 沒有以太網接口,不易構成較為復雜的網絡系統,最新推出的帶以太網接口的PLC 價格昂貴。 (4)采用可編程自動化控制器PAC(Programmable Automation Controller)。PAC 結合了PC 的處理器、RAM 和軟件的優勢,以及PLC 固有的可靠性和分布特性,是近年來在工控領域出現的新型控制器。 PAC 與傳統PLC 的性能比較見表1。 表 1 PAC 與傳統PLC 的性能比較 PAC 產品型號眾多,經過多方比較,選擇了ADAM5510-E/TCP。它采用模塊化結構,其CPU 模塊包括80188CPU、256KB FLASH ROM、256KB SRAM 和三個串行通訊口與一個10/100M 以太網接口。其底板有8 個擴展槽,可以安裝不同類型的I/O 模塊。系統內置ROM-DOS,與MS-DOS 操作系統兼容,提供了除BIOS 之外的基本MS-DOS 功能調用,允許運行用C 或C++等高級語言編譯的應用程序。與PLC 相比,5510 運算能力和通訊能力更強,模擬量點價位低。與工控機相比,5510 系統更加緊湊,抗干擾能力更強,因此適合做模擬器的I/O 設備。 本系統*選擇了四種 I/O 模塊:16 通道隔離數字量輸出模塊ADAM5056S、16 通道隔離數字量輸入模塊ADAM5051S、4 通道模擬量輸出模塊ADAM5024、8 通道高速模擬量輸入模塊ADAM5017H 等。另外,在某些操作臺上有數碼管顯示器件。由于數碼管的位數較多,為了節約輸出模塊,不宜用5056 的輸出口直接驅動數碼管的各段,因此選用了MAX7219 作為數碼管的驅動芯片。通常,使用單片機等微控制器通過7219 的DIN、CS 和CLK 三根信號線控制它進行數碼管的顯示。該項目中由5056 的三個輸出口模擬微控制器的三個口線對7219 進行控制。 3 程序設計 5510 沒有顯示界面,首先在PC 機上編寫應用程序,編譯好之后再下載到5510 內。5510采用了DOS 類操作系統,不支持多線程編程,每臺5510 的程序隨I/O 模塊配置不同略有不同,但程序的總體流程均如圖2 所示。 圖2 程序總體流程 3.1 初始化子程序 (1)啟動看門狗。系統由于某種原因陷入死循環后能自動退出,使系統恢復正常。 (2)初始化5024、5017。該兩種模擬量模塊在使用之前需要通過軟件進行設置。其中5024 設置為4"20mA 電流輸出,5017 設置為0"10V 輸入。 (3)啟動網絡心跳包檢測定時器。網絡心跳包用于確認網絡連接是否正常。 3.2 網絡連接子程序 控制器首先建立 socket,然后與服務器連接。網絡連接子程序的主要部分為: void ConnectServer() { //首先進行相關變量定義 if((SO_5510=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))== INVALID_SOCKET) //建立socket 并設置為TCP 方式 {//未能建立socket 的處理} pulArgp = 1; if(ioctlsocket(SO_5510, FIONBIO, &pulArgp)) //將socket 設置為非阻塞模式 {//未能設置socket 的處理} he=gethostbyname("172.18.55.1"); //server address Server_addr.sin_family = AF_INET; //TCP/IP Server_addr.sin_port = htons(Server_Port); Server_addr.sin_addr =*((struct in_addr *)he->h_addr); memset(&(Server_addr.sin_zero), 0, 8); ConnectReturnFlag = connect(SO_5510, (struct sockaddr *)&Server_addr,sizeof(struct sockaddr));//建立連接 if( ConnectReturnFlag == 0) {//建立連接成功的相應處理} else {//建立連接失敗的相應處理} } 3.3 接收數并處理子程序 5510 接收到數據包后首先分析數據包內的命令字。本系統中設計的命令字有開始采集、停止采集、檢查連接、有效數據等。如果是前三種命令則立即執行,如果是“有效數據”命令則打開數據包后面的內容(可能包含多個子包),子包內包含開關量、模擬量等若干子命令,程序根據不同子命令執行相應子程序。程序主體示意如下。 void ReceiveAndProcess() { if ((numbytes = recv(SO_5510, (char *)&RECVITEMS, sizeof(RECVITEMS), 0))== SOCKET_ERROR) {//沒有接收到數據的處理} if(numbytes>0)//收到數據后的處理 { switch(RECVITEMS.Command) //判斷命令字 { case Scollectstart: //開始采集命令 SendCommand(CReplyCollectStart);//表示收到開始采集命令 break; case Ssendgroupdata: //有效數據指令 { for(CircleNum=0;CircleNum { switch (RECVITEMS.Items[CircleNum].Command) //判斷子命令 { case SsendoneDOdata: //server 發送的開關量單字節指令 WriteOneDOChannel(RECVITEMS.Items[CircleNum]); break; case SsendoneAOdata: //server 發送的模擬量單字節指令 WriteOneAOChannel(RECVITEMS.Items[CircleNum]); break; default: break; } } } default: break; } } } 3.3 數據采集發送子程序 為了降低網絡傳輸的數據量,PAC 控制器只向服務器發送狀態發生變化的數據,而狀態沒有發生變化的數據則不發送。同樣,服務器通信程序SimuTrans 只向PAC 控制器發送模型計算后發生變化的數據。 為了保證數據不會丟失,針對不同種類的數據采用了不同的發送、回送方式。在該模擬器中,輸入的模擬量為艇員操作面板上的旋鈕時帶動內部的電位器產生0"10V 的模擬電壓信號,由于其操作是連續過程,操作過程會產生一系列變化數據,因此5017H 采集到的變化數據直接發送到服務器即可。對于操作按鈕、多位開關等部件產生的開關量數據,為了避免數據丟失采用了重復發送,并且服務器收到數據后要做應答,確保了數據傳輸的可靠性。 4 結論 該模擬器2007 年9 月通過了驗收、鑒定。在動力系統管理人員及在校學員的學習與訓練過程中發揮了重要作用,獲得了良好的軍事和經濟效益。該半實物仿真訓練模擬器的成功研制實踐說明,將新型PAC 控制器應用于模擬器代替傳統的工控機或PLC 不僅能縮短開發周期、使系統運行穩定可靠,而且系統開放性好,可以方便地與其他系統的模擬器連接組成更大規模的模擬器進行訓練,是模擬器研制的一種新思路。 |