摘要:根據當前基于Web遠程工業監控方案的不足,利用Flash的交互性強,本身導出的文件小,適合網絡傳輸、利用AS(ActiON Script)提高了與其他語言的交互性等特點,提出了基于flash的遠程工業監控系統設計思路。提出了本系統的4層體系結構,并基于這4層的體系結構,對本系統進行了詳細的硬件連接設計和系統軟件設計。該系統的核心思想是利用Socket實現了Flash客戶端和服務器端的數據通信,利用RemoteObiect實現歷史數據的存儲。本系統的設計對基于Web遠程工業監控提供了新的思路,具有實際的應用價值。
目前,監控領域的產品普遍關注現場級別,即采用客戶端/服務器(C/S)模式,其目的是保證監控系統的穩定性和可靠性。但隨著計算機技術、網絡技術、控制技術的不斷發展,同時為了使現場總線、企業信息網、外部互聯網能夠充分的融合,提高企業自動化水平和設備的維護管理水平,基于網絡化的Web遠程監控將會在以后的監控系統中得到廣泛的應用。
1 現狀分析
當前,基于Web的遠程工業監控方案一般有3種:1)將OPC或其他通信方式采集的數據通過中間軟件存入到數據庫中,然后通過Web頁面與數據庫進行交互,以達到設備監控的目的:2)通過做插件嵌入到web瀏覽器中,實現與控制器的交互;3)通過Web service實現與控制器的交互,即將設備的控制接口以及數據信息通過部署Web service的方式發送出去,監控中心通過網絡發現并調用這些web service方法,完成現場設備的控制和數據采集。第一種方案,中間過程過于復雜,違背了監控系統的穩定性和可靠性的原則,中間環節的限制因素較多,并且不便于控制,監控的延時也非常明顯,時效性不足;第二種方案,在網頁中插入開發的監控設備的控件,則需要降低瀏覽器的安全性,同時針對每一臺監控的主機都要提前下載控件后才能使用,并且此類控件與Web瀏覽器的其他Web頁面的功能融合性以及監控頁面顯示效果等方面較差,較難實現B/S模式下豐富的顯示效果;第三種方案,通過Web service建立非實時連接的傳輸,就必須通過循環體來不斷的刷新數據,不僅會增加設備的負擔,同時將會存在固定的延時問題。因此文中基于以上監控方案的不足,提出了基于Flash的遠程監控系統實現方案。該方案利用Flash的交互性強,本身導出的文件小,適合網絡傳輸,利用AS提高了與其他語言的交互性等特點,將會大大改進以上3種方案各自的不足,使基于Web的遠程監控系統在可靠性、穩定性、時效性、與Web的兼容性、頁面顯示效果和用戶交互的體驗效果大大改善。
2 基于Flash遠程工業監控系統體系結構
基于Flash遠程監控系統的體系結構可以分為4層:現場設備的檢測與控制、Web發布系統、客戶端數據的接收與命令的發送和數據存儲與轉發。現場設備檢測與控制一方面負責采集現場各個控制節點的運行數據,經過匯總、預處理后傳遞給中間層子系統;另一方面接收中間層子系統轉發來的控制命令,對命令進行解析、驗證,然后指導現場的各個控制節點采取相應的動作。Web發布系統主要是由Web服務器提供Web服務,實現客戶端的發布,Web服務器為中間環節,完成與客戶子系統以及現場子系統的交互。客戶子系統是與用戶直接交互的部分,它接收用戶的輸入,從現場設備的檢測與控制子系統中獲取監測數據或向其發送命令。數據存儲與轉發系統主要由數據庫服務器和提供Web ser vice的服務組成,數據庫服務器則完成采集數據的存儲功能。通過這4個過程的作用來實現設備的遠程監控。其體系結構如圖1所示。
圖1 基于flash的遠程設備監控系統體系結構
3 基于Flash遠程監控系統的設計
3.1 系統硬件連接設計
現場設備通過串口與數據采集模塊通訊,數據采集模塊通過工業以太網與Web服務器連接,Web服務器通過以太網與數據庫服務器連接。數據采集模塊采用PAC(可編程自動化控制器),支持Modbus/TEP通信協議。Web服務器和數據庫服務器采用HP服務器,安裝操作系統為Windo ws Server 2008 Enterprise.網絡拓撲結構采用星型拓撲結構,是為了能夠與現場采集設備建立更有效的連接。Web服務器存儲數據直接面向數據庫服務器,便于減輕整個網絡負擔,防止由于數據量過大而引起網絡阻塞。同時數據庫服務器實現雙機熱備,來提高系統的可靠性。將數據庫分為兩部分:中心數據庫和企業級數據庫,中心數據庫主要存放當前數據,企業級數據庫則存放歷史數據以及設備和用戶的管理數據,實現動態數據與靜態數據的隔離。網絡拓撲圖如圖2所示。
圖2 系統總體架構圖
3.2 系統軟件設計
軟件設計的核心內容為PAC編程和客戶端Flash編程。PAC編程語言為C語言,編輯環境為BC編譯器,Flash編程語言為Action Script,編輯環境為Flash builder4.5.
本系統通過創建一個以TCP數據流方式建立的Socket從而實現PAC服務端與基于Web的Flash客戶端的數據傳輸。建立通信的過程為:首先PAC服務端通過Socket監聽自身的Modbus/TCP專用端口502,客戶端程序則通過此端口及PAC服務端的IP地址作為連接Socket參數,創建一個Socket與PAC服務端建立連接。網絡無故障,則連接建立。客戶端通過Flash中Socket的SendMessage()和ReadBytes()方法來發送和接收信息。
利用Flash創建的基于Modbus/TCP套接字模型為如圖3所示。
圖3 Modbus/TCP套接字模型
3.2.1 1PAC服務端程序實現
PAC服務端的實現主要分為通過Socket與上位機的通信和通過串口服務與外圍設備的通信兩大部分。
通過Socket與上位機的通信主要分為監聽和連接。在監聽狀態下負責監聽客戶端的請求連接,并負責接受此連接。本系統PAC端設計監聽類為ServerListen,監聽類首先通過int bind(int sockfd,struct sockaddr*my_addr,int addrten)綁定了本地的502端口,然后通過函數int listen (int sockfd,intbacklog)將客戶端的連接請求放入隊列中等待,直到函數intaccept(int sockfd,void*addr,int*addrlen)處理它,然后返回一個全新的套接字文件來描述此單個連接。這樣,對于同一個連接就有兩個文件描述符,原先的一個文件描述符正在監聽你指定的端口,新的文件描述符可以用來調用send()和recv()。在連接狀態下負責與客戶端進行數據的接收和發送,通過數據傳輸類Server Custom來實現。在此類中利用int send(SOCKETs,const char FAR*buf,int len,int flags)函數將PAC服務端的數據發送到客戶端,如果網絡發生故障或待發送數據的長度len小于當前程序要發送數據的緩沖區的長度,則返回SOCKET_ERROR,利用int recv(SOCKETs,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)來監聽連接過程中出現的錯誤,利用mysoeket.addEventListener(Event.CLOSE,OnClose)監聽連接是否關閉,利用mysocket.addEventListener(ProgressEvent.SOCKET DATA,receivedata) 中的mysoeket.readMultiByte(mysocket.bytesAvailabl e,“utf8”)接收PAC服務端發送過來的數據。添加控制功能則是通過flash頁面中的控件的觸發事件來完成。在觸發事件中添加mysocket. writeUTFBytes(data),并調用mysocket.flush()方法將觸發的事件發送出去,從而完成了與服務端的數據交換。
在發送與接收數據的過程中由于遵循的為Modbus/TCP協議,發送和接收的數據要遵循Modbus標準的數據幀格式,因此需要根據Modbus協議的標準格式對所接收和發送的數據幀進行轉化。在接收的數據中,要對接收的數據進行分析,根據自己的定義,將地址與監控終端的信息取出,并轉換為String類型,在頁面上對應顯示。
3.2.3 客戶端與數據庫的交互
對采集來的數據除了在頁面上顯示,需要存入數據庫作為歷史備份。客戶端Flash與Oracle數據庫無法直接交互,可以通過服務器端技術連接數據庫,這3種連接方式為:HttpService、WebService和RemoteObject.3種通訊方式比較如表1所示。
表1 Flash與Oracle數據庫3種交互方式比較
從上表中可以看出,前兩種通信數據量較小,要傳輸大量的數據或是實現不同對象的序列化傳輸,需要利用高效的傳輸協議AMF(Aetion Script 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》標簽來訪問遠程對象,如下所示:
下面通過ID調用遠程方法,利用。net的服務端與數據庫進行交互,定時存儲和讀取數據庫中的內容:
4 結論
本文提出的基于Flash的遠程設備監控系統的設計,對于當前的基于Web的遠程設備監控提供了一種新的方式。利用了Flash的Socket實現了與PAC的Modbus/TCP協議的數據通信。由于Flash的限制,當前還無法實現Flash與Oracle數據庫直接的數據交互,在本設計中由于只存取歷史數據和操作日志,數據傳輸頻率不是很高,因此對本設計并沒有太多影響。但ActionScript3可以獨立實現與MySOL進行數據交互,因此我們相信在AS下一版本的推出將會實現與Oracle的獨立交互。本系統中利用Flash的各種特性,在可靠性、穩定性、時效性、與Web的兼容性、頁面顯示效果和用戶交互的體驗效果上將會有很大的改善。如果在現有的開發環境中,對數據交互和Flash頁面的動畫展示部分進行封裝,將會大大減少軟件的開發強度,具有實際的應用價值。
評論
查看更多