孫曉波,王榮浩 ,張鵬舉
(1.解放軍理工大學 工程兵工程學院,江蘇 南京 210007;2.東華大學 機械工程學院,上海 201620)
目前,監控領域的產品普遍關注現場級別,即采用客戶端/服務器(C/S)模式,其目的是保證監控系統的穩定性和可靠性。但隨著計算機技術、網絡技術、控制技術的不斷發展,同時為了使現場總線、企業信息網、外部互聯網能夠充分的融合,提高企業自動化水平和設備的維護管理水平,基于網絡化的Web遠程監控將會在以后的監控系統中得到廣泛的應用。
當前,基于Web的遠程工業監控方案一般有3種:1)將OPC或其他通信方式采集的數據通過中間軟件存入到數據庫中,然后通過Web頁面與數據庫進行交互,以達到設備監控的目的;2)通過做插件嵌入到web瀏覽器中,實現與控制器的交互;3)通過Web service實現與控制器的交互,即將設備的控制接口以及數據信息通過部署Web service的方式發送出去,監控中心通過網絡發現并調用這些web service方法,完成現場設備的控制和數據采集。第一種方案,中間過程過于復雜,違背了監控系統的穩定性和可靠性的原則,中間環節的限制因素較多,并且不便于控制,監控的延時也非常明顯,時效性不足;第二種方案,在網頁中插入開發的監控設備的控件,則需要降低瀏覽器的安全性,同時針對每一臺監控的主機都要提前下載控件后才能使用,并且此類控件與Web瀏覽器的其他Web頁面的功能融合性以及監控頁面顯示效果等方面較差,較難實現B/S模式下豐富的顯示效果;第三種方案,通過Web service建立非實時連接的傳輸,就必須通過循環體來不斷的刷新數據[1],不僅會增加設備的負擔,同時將會存在固定的延時問題。因此文中基于以上監控方案的不足,提出了基于Flash的遠程監控系統實現方案。該方案利用Flash的交互性強,本身導出的文件小,適合網絡傳輸,利用AS提高了與其他語言的交互性等特點,將會大大改進以上3種方案各自的不足,使基于Web的遠程監控系統在可靠性、穩定性、時效性、與Web的兼容性、頁面顯示效果和用戶交互的體驗效果大大改善。
基于Flash遠程監控系統的體系結構可以分為4層:現場設備的檢測與控制、Web發布系統、客戶端數據的接收與命令的發送和數據存儲與轉發。現場設備檢測與控制一方面負責采集現場各個控制節點的運行數據,經過匯總、預處理后傳遞給中間層子系統;另一方面接收中間層子系統轉發來的控制命令,對命令進行解析、驗證,然后指導現場的各個控制節點采取相應的動作。Web發布系統主要是由Web服務器提供Web服務,實現客戶端的發布,Web服務器為中間環節,完成與客戶子系統以及現場子系統的交互[2]。客戶子系統是與用戶直接交互的部分,它接收用戶的輸入,從現場設備的檢測與控制子系統中獲取監測數據或向其發送命令。數據存儲與轉發系統主要由數據庫服務器和提供Web service的服務組成,數據庫服務器則完成采集數據的存儲功能。通過這4個過程的作用來實現設備的遠程監控。其體系結構如圖1所示。

圖1 基于flash的遠程設備監控系統體系結構Fig.1 Architecture of remote device control system based on flash
現場設備通過串口與數據采集模塊通訊,數據采集模塊通過工業以太網與Web服務器連接,Web服務器通過以太網與數據庫服務器連接。數據采集模塊采用PAC(可編程自動化控制器),支持Modbus/TCP通信協議。Web服務器和數據庫服務器采用HP服務器,安裝操作系統為Windows Server 2008 Enterprise。網絡拓撲結構采用星型拓撲結構,是為了能夠與現場采集設備建立更有效的連接。Web服務器存儲數據直接面向數據庫服務器,便于減輕整個網絡負擔,防止由于數據量過大而引起網絡阻塞。同時數據庫服務器實現雙機熱備,來提高系統的可靠性。將數據庫分為兩部分:中心數據庫和企業級數據庫,中心數據庫主要存放當前數據,企業級數據庫則存放歷史數據以及設備和用戶的管理數據,實現動態數據與靜態數據的隔離。網絡拓撲圖如圖2所示。
軟件設計的核心內容為PAC編程和客戶端Flash編程。PAC編程語言為C語言,編輯環境為BC編譯器,Flash編程語言為Action Script,編輯環境為Flash builder 4.5。

圖2 系統總體架構圖Fig.2 Overall frame of system
本系統通過創建一個以TCP數據流方式建立的Socket從而實現PAC服務端與基于Web的Flash客戶端的數據傳輸。建立通信的過程為:首先PAC服務端通過Socket監聽自身的Modbus/TCP專用端口502[3],客戶端程序則通過此端口及PAC服務端的IP地址作為連接Socket參數,創建一個Socket與PAC服務端建立連接。網絡無故障,則連接建立。客戶端通過 Flash 中 Socket的 SendMessage()和 ReadBytes()方法來發送和接收信息[4]。
利用Flash創建的基于Modbus/TCP套接字模型為如圖3所示。

圖3 Modbus/TCP套接字模型Fig.3 Socket model of Modbus/TCP
3.2.1 1PAC服務端程序實現
PAC服務端的實現主要分為通過Socket與上位機的通信和通過串口服務與外圍設備的通信兩大部分。
通過Socket與上位機的通信主要分為監聽和連接。在監聽狀態下負責監聽客戶端的請求連接,并負責接受此連接。本系統PAC端設計監聽類為ServerListen,監聽類首先通過int bind(int sockfd,struct sockaddr*my_addr,int addrlen)綁定了本地的502端口,然后通過函數int listen(int sockfd,int backlog)將客戶端的連接請求放入隊列中等待,直到函數int accept(int sockfd,void*addr,int*addrlen)處理它,然后返回一個全新的套接字文件來描述此單個連接。這樣,對于同一個連接就有兩個文件描述符,原先的一個文件描述符正在監聽你指定的端口,新的文件描述符可以用來調用send()和recv()。在連接狀態下負責與客戶端進行數據的接收和發送,通過數據傳輸類ServerCustom來實現。在此類中利用int send(SOCKET s,const char FAR*buf,int len,int flags)函數將 PAC服務端的數據發送到客戶端,如果網絡發生故障或待發送數據的長度len小于當前程序要發送數據的緩沖區的長度,則返回 SOCKET_ERROR, 利用 int recv (SOCKET s,char FAR*buf,int len,int flags)從客戶端接收數據。 函數先等待 s的發送緩沖中的數據被協議傳送完畢,如果協議在傳送s的發送緩沖中的數據時出現網絡錯誤,則函數返回SOCKET_ERROR錯誤,如果s的發送緩沖中沒有數據或者數據被協議成功發送完畢后,函數先檢查套接字s的接收緩沖區,如果s的接收緩沖區中沒有數據或者協議正在接收數據,那么函數就一直等待,直到協議把數據接收完畢。
對于外圍設備進行通信主要是通過串口服務,首先調用自己定義的COM口初始化函數InstallCom將端口初始化,然后通過build_REQ_Read函數實現根據ModBusRtu通訊協議將COM口讀取的外圍設備的數據放入自定義的數組中,并通過CRC16_modbus進行CRC校驗。接收的數據正確,則通過analyse_Read_Result分析從串口讀取的數據,并將讀取的數據位存放到Share_Mem[MaxShareMemNum]數組中。然后將Share_Mem數組作為REMOTCP_ModServer_Create參數與上位機進行通訊。對外圍設備發送指令,則是通過函數SendCommand選擇控制對象的COM后,將指令發送到外圍設備,外圍設備接收到指令后動作。
3.2.2 客戶端程序與PAC服務端通訊的實現
客戶端的實現主要分為3個部分:通過Flash的Socket與PAC服務端的數據交互,將接收的數據在頁面上動態顯示和將獲取的數據實時存入到數據庫,實現實時數據庫的歷史存儲功能。
客戶端Flash與PAC服務端的數據交互主要是通過Socket進行的。首先定義Socket,利用connect連接PAC服務器的地址和端口號502,利用mysocket.addEventListener(Event.CONNECT,OnConnect)監聽是否已建立連接,利用mysocket. addEventListener (IOErrorEvent. IO_ERROR,ioErrorHandler)來監聽連接過程中出現的錯誤,利用mysocket.addEventListener(Event.CLOSE,OnClose)監 聽 連 接是否關閉,利用 mysocket.addEventListener(ProgressEvent.SOCKET_DATA,receivedata) 中 的 mysocket.readMultiByte(mysocket.bytesAvailable,“utf8”) 接收 PAC 服務端發送過來的數據。添加控制功能則是通過flash頁面中的控件的觸發事件來完成。在觸發事件中添加mysocket.writeUTFBytes(data),并調用mysocket.flush()方法將觸發的事件發送出去,從而完成了與服務端的數據交換。
在發送與接收數據的過程中由于遵循的為Modbus/TCP協議,發送和接收的數據要遵循Modbus標準的數據幀格式,因此需要根據Modbus協議的標準格式對所接收和發送的數據幀進行轉化。在接收的數據中,要對接收的數據進行分析,根據自己的定義,將地址與監控終端的信息取出,并轉換為String類型,在頁面上對應顯示。
3.2.3 客戶端與數據庫的交互
對采集來的數據除了在頁面上顯示,需要存入數據庫作為歷史備份。客戶端Flash與Oracle數據庫無法直接交互[5],可以通過服務器端技術連接數據庫,這3種連接方式為:HttpService、WebService和 RemoteObject。 3種通訊方式比較如表1所示。

表1 Flash與Oracle數據庫3種交互方式比較Tab.1 Comparison of three kind of interactive modes between Flash and Oracle database
從上表中可以看出,前兩種通信數據量較小,要傳輸大量的數據或是實現不同對象的序列化傳輸,需要利用高效的傳輸協議 AMF(ActionScript Message Format)來代替 SOAP協議傳輸的方案。
開源項目FluorineFx就是專門針對.net平臺與Flex通信提供的AMF協議通信網關,筆者可以通過FluorineFx方便地完成與.net的通信。
要使用開源項目FluorineFx需要使用FluroineFx通信的.net和Flex配置,分為以下3步:
1)NET服務端的開發
建立解決方案,并添加FluroineFx服務器庫。添加成功后項目模板會自動創建一個Sample類和Echo方法。接著添加FluorineFx網站到解決方案,添加成功后網站會自動引用FluorineFx服務庫的DLL。
2)Flex開發
在Flex開發中需要根據以上的參數進行配置。首先創建Flex項目,并將項目路徑指向先前建立的FluorineFx網站的根路徑。項目創建完畢后,可以通過FluorineFx與.net進行通信。
3)遠程訪問
在Flex的mxml文件下通過<mx:RemoteObject>標簽來訪問遠程對象[6],如下所示:
<mx:RemoteObject id= ”Service” destination= ”fluorine”source=”FlexDotNet.ServiceLibrary.Sample”>
<mx:method name=”Echo” result=”onResult(event)”></mx:method>
</mx:RemoteObject>
下面通過ID調用遠程方法,利用.net的服務端與數據庫進行交互,定時存儲和讀取數據庫中的內容:
<mx:Script>
Import mx.rpc.events.ResultEvent;
Internal function onClick():void
{
Service.Echo(txtTest.text);
}
Internal function onResult(evt:ResultEvent):void
{
txtTest.text=evt.result.toString();
}
</mx:Script>
本文提出的基于Flash的遠程設備監控系統的設計,對于當前的基于Web的遠程設備監控提供了一種新的方式。利用了Flash的Socket實現了與PAC的Modbus/TCP協議的數據通信。由于Flash的限制,當前還無法實現Flash與Oracle數據庫直接的數據交互,在本設計中由于只存取歷史數據和操作日志,數據傳輸頻率不是很高,因此對本設計并沒有太多影響。但ActionScript3可以獨立實現與MySQL進行數據交互,因此我們相信在AS下一版本的推出將會實現與Oracle的獨立交互。本系統中利用Flash的各種特性,在可靠性、穩定性、時效性、與Web的兼容性、頁面顯示效果和用戶交互的體驗效果上將會有很大的改善。如果在現有的開發環境中,對數據交互和Flash頁面的動畫展示部分進行封裝,將會大大減少軟件的開發強度,具有實際的應用價值。
[1]Karli W,Christian N.Beginning Visual C#[M].Wiley Publishing,Inc,2010.
[2]Stephen W.ASP.NET 3.5 Unleashed[M].Pearson Education,Inc,2008.
[3]陳碩,李春龍,韓順成,等.基于WinCE平臺的Modbus/TCP通信設計與實現[C]//第30屆中國控制會議,2011,4710-4713.
[4]Stanley B L,Josee L,Barbara E M.C++Primer[M].Pearson Education, Inc,2005.
[5]Kevin L.Oracle Datebase 11g完全參考手冊 [M].劉偉琴,張格仙,譯.北京:清華大學出版社,2010.
[6]David G.Flash Builder 4 and Flex 4Bible[M].Wiley Publishing,Inc,2010.