程西娜 蔡文齋
(中國電子科技集團公司第三十九研究所陜西西安 710065)
該題目來源于本承研單位統一標準化天線監控程序設計開發項目,鑒于以前工程監控程序分為各工程組開發模式之弊端,該研發室欲開發出一款通用的天線類應用程序框架,在該框架基礎上再加入各自工程特點的業務邏輯模塊,最終形成某工程使用的監控軟件。經有關專家充分論證后,欲開發出一種通用的與工程無關的底層控制類框架平臺,用來完成整個控制工程最關鍵的功能如通訊、線程調度和消息傳遞機制等等,對業務邏輯開發者而言,無需關心硬件層的操作,只需依據具體項目要求編制有關的數據處理工作即可,這樣可以提高研制效率。本文主要論述了此框架中相關模塊的實現方法,諸如多串口通訊模塊、網絡通訊模塊和主控線程模塊。
整個框架運行在windowsxp3系統上,使用Delphi XE2開發[1-4]。采用抽象構架與應用邏輯相結合的開發方法。首先設計一個與控制工程項目無關的核心框架,完成整個系統硬件級通信調度和調試等功能,該框架主要功能模塊為:所有硬件層設備通信模塊、調度模塊、主工作線程模塊、動態調試支持模塊、存儲線程和日志線程工作模塊。框架模塊與具體控制工程無關,一旦調試完成,其函數級文件即可使用在以后其它任何該類工程中。該框架設計方法已經由導師發表[5],不再贅述。該文主要討論在新開發環境下DELPHIXE2如何實現出工程用的部分模塊。
框架將通訊用數據定義為抽象緩沖區形式,當框架代碼段完成設備讀后,發一個用戶定義的消息給前臺應用邏輯窗口給界面,通知硬件層數據已準備就緒。這樣業務邏輯中僅實現讀消息函數即可完成數據處理和顯示等工作,這樣設計的好處在于軟件結構清晰明了,這兩部分可以獨立開發。因為這次開發工具的版本提升,以前的許多實現方法都做了調整,本文主要討論在新環境下這些部分功能塊是如何實現的。
多路串口分別使用ComPort組件和MoxaPcomm組件庫實現,ComPort組件為VCL組件,可以在DELPHI環境下無縫使用,MoxaPcomm為臺灣專業串口廠商提供的串口庫,可在DELPHI環境下使用DLL技術加載[6],這里重點介紹多路串口初始化參數配置的技術實現。
該應用程序框架為了適用于所有這一類項目,設計時考慮的的是通用性,所以將該部分設計為具備可以配置的動態自調整功能,例如工程1使用12個串口,工程2使用32路串口等等,使用一抽象的串口結構定義串口類,再使用動態數組形式定義串口實例,在窗口創建函數中首先枚舉系統中所有串口數量,根據系統中串口數量設置動態數組長度,再使用程序方法自動生成配置界面,配置界面使用DELPHI的屬性頁技術展現,采用NextSuite組件集的NxInspector組件實現,該組件在設計時定制是較方便的,但當串口較多時,每個串口都有10個參數,程序員工作量較大,而且不能夠動態生成,經反復試驗,使用如下關鍵代碼實現了程序自動生成:


運行程序Inspector組件中的COM 樹已生成,在COM參數配置樹中勾選需要打開的串口,配置波特率、數據位、終止位、校驗位和超時值等參數,配置完畢后點擊。點擊apply按鈕,對應的串口指示燈變亮,表明已經打開成功,如圖1所示。

圖1 串口配置樹
Moxa串口庫編程與ComPort編程方法有差異,Moxa串口庫使用動態鏈接庫方式提供,底層實現與ComPort不同,但多參數配置部分仍然可以使用屬性頁方式編程,串口的讀寫仍然使用動態分派機制。
網絡部分使用了多頁組件PageControl,分別為UDP、TCP/IP和組播3個頁面[7]。網絡的讀寫采用了Indy10.0.52組件開發,分為客戶端和服務器端,通過界面設置IP地址和端口,數據以數組的形式發送,delphi 2007以上版本使用Indy10組件,與以前版本差異較大。Indy9組件[8]的讀是采用流方式,如UDP讀的重載函數為IdUDPServerUDP Read(Sender:TObject;AData:TStream;ABinding:TIdSocket Handle);,讀緩存區的內容需要用AData.Read(ReadBuffer,AData.Size)函數獲得;而Indy10組件的讀是直接采用緩存區的方式,如UDP讀的重載函數為IdUDPServerUDPRead (AThread:TIdUDPListener Thread;AData:TBytes;ABinding:
TIdSocket Handle),讀緩存區的內容直接從AData里獲得。
3.2.1 UDP方法的實現
UDP通訊的特點是點對點的通訊方式,服務器開放端口,客戶端只需要將數據發至該服務器開放的端口即可,由于它不屬于連接型協議,即發送時不需要接收方確認,可能會出現丟包現象,但是它具有處理速度快和資源消耗小的優點。
采用了組件包中IdUDPServer和IdUDPClient實現了8路服務器端的讀操作和1路客戶端的寫操作。服務器端的設置同樣采用了Inspector組件,以配置樹的形式展現,點擊需要開放的服務器的“Enable”,對應的端口被激活;客戶端的設置需填入遠程地址和端口號,勾選“激活”后客戶端打開成功,如圖2所示。

圖2 服務器和客戶端配置
服務器和客戶端打開成功后,重載服務器組件IdUDPServer的OnUDPRead函數,該函數在每讀取到一幀數據時自動執行,通過TIdSocketHandle類的ABinding變量可以獲得客戶端的IP地址和端口號,在TBytes類型的AData變量中可以獲得讀取的緩存區的內容。再采用內存拷貝函數,將AData內的字節放到對應的讀服務器緩存區。函數如下:

3.2.2 TCP/IP方法的實現
TCP是面向連接的通信協議,通過3次握手建立連接,通訊完成時要拆除連接,具有穩定性好的特點[9]。采用了組件包中IdTCPServer和IdTCPClient組件實現。
客戶端寫的操作實現:從界面獲得遠端IP和端口號,在服務器打開的前提下,連接服務器。此時如果服務器沒有打開,界面會有提示需先打開服務器。連接成功后,給客戶端的寫緩存區里賦值需要發送的字節,調用IdTCPClient組件的IO句柄的Write(TCPWriteBuffer)函數,完成客戶端寫的功能。
服務器端的讀操作實現:重載了服務器組件IdTCPServer的OnConnect函數,OnDisconnect函數和OnExecute函數。其中OnConnect函數和OnDisconnect函數是在客戶端連接和斷開服務器時的動作,發給界面連接或斷開的提示。讀服務器是采用了OnExecute函數,該函數在每讀取到一幀數據時自動執行,用TIdContext類的AContext變量的IO 句柄的ReadBytes(TCPReadBuffer)函數,將讀到的數據放到服務器的讀緩存區。部分代碼如下:

3.2.3 組播方法的實現
組播協議與現在廣泛使用的單播協議不同之處在于,一個主機用單播協議向n個主機發送相同的數據時,發送主機需要分別向n個主機發送,并發送n次。而組播協議只需要發送一次,其數據由網絡中的路由器和交換機逐級復制并發給各個接收方,是一種一對多的通訊方式,這樣既節省服務器資源也節省網絡主干的帶寬資源[10]。
組播中的讀是在客戶端實現,寫是在服務器中實現,這一點與前2種方法正好相反。采用了組件包的IdIPMCastClient實現了1路客戶端的讀操作和IdIPMCastServer實現了1路服務器端的寫操作。
服務器端的寫操作:給服務器端的寫緩存區里賦值需要發送的字節,使用IdIPMCastServer組件的Send函數即可實現寫操作。
客戶端的讀操作:重載IdIPMCastClient組件的OnIPMCastRead函數,該函數在每讀到一幀數據時自動執行,在TBytes類型的AData變量中可以獲得讀取的緩存區的內容。再采用內存拷貝函數,將AData內的字節放到對應的讀服務器緩存區。部分代碼如下:

控制主線程由主控制事件驅動,線程開始后永遠等待該主控制事件對象,當該事件對象變為有信號態時,復位該數據對象到無信號態,調主控函數完成控制操作,再次進入線程開始進入另一次等待。事件的有信號態由中斷線程的中斷服務線程設置,該部分與硬件接口形式有關系,一般使用Modam狀態變化或者TTL電平形式的硬件接入方式。主控線程流程圖如圖3所示。

圖3 主線程框圖
由整體基礎架構由承研單位有關專家負責,作者編程并調試出文中介紹的各部分模塊,經連接測試,代碼無誤功能齊全。調試期間網絡通訊部分樣例太少阻力較大,經專家指導及反復試驗最終使用文中介紹的方法實現了設計。
[1]譚 燕,趙 磊,李之明.Delphi 高級輔助工具精解[M].北京:中國鐵道出版社,2003:28-55.
[2]李之明,高玉琢.Delphi7 組件經典解析[M].北京:中國鐵道出版社,2003:88-105.
[3]CANTU M.Delphi Xe Handbook:A Guide to New Features in Delphi Xe[M].USA:Createspace,2011:88-92.
[4]李 慧.Delphi 程序開發范例寶典(第三版)[M].北京:人民郵電出版社,2012:285-291.
[5]蔡文齋.Win32 環境下一種通用控制軟件的實現方法[J].現代電子技術,2005(8):51.
[6]張秀關.單片機與計算機串口通信實踐[M].北京:電子工業出版社,2013:30-37.
[7]胡 鳴.Windows 網絡編程技術[M].北京:科學出版社,2008:67-89.
[8]蔡文齋.應用INDY 組件設計網絡調試器[J].現代電子技術,2006(24):94.
[9]尹圣雨.TCP/IP 網絡編程[M].北京:人民郵電出版社,2014:24-55.
[10]劉 瑩,徐 恪.Internet 組播體系結構[M].北京:科學出版社,2008:44-58.