基于Modbus TCP的OPC服務器設計
由于目前廣泛應用的DCS、FCS、SCADA 等傳統計算機測控系統使用的智能儀表設備、分布式I/O模塊、PLC 等設備來自于不同的生產商,而各生產商為了各自的商業利益,沒有遵循統一的接口規范,造成了設備之間的通信異常復雜,難以實現現場設備與上層控制軟件間的信息交互和各現場設備間的直接互聯與互操作,因此限制了計算機測控系統開放性、通用性的提高。
OPC(OLE for Process Control,用于過程控制的對象鏈接和嵌入)技術為解決工業客戶機與各種設備間通訊而產生的一項工業技術規范和標準。OPC 技術規范是OPC 基金會制定的,它提供了統一的數據訪問軟硬件接口,將現場信號按照統一的標準與SCADA(監控與數據采集系統),HMI(人機接口)等軟件無縫連接起來,同時將硬件和應用軟件有效地分離開。只要硬件開發商提供帶有OPC接口的服務器,任何支持OPC接口的客戶程序均可采用統一的方式對不同硬件廠商的設備進行存取,無須重復開發驅動程序,因此大大提高了控制系統的互操作性和適應性。
OPC技術
1.OPC核心基礎
COM主要是為了實現軟件復用和互操作,并且為基于Windows的應用程序提供統一的、可擴展的、面向對象的通訊標準,DCOM是COM技術在分布式計算領域的擴展,支持在局域網、廣域網甚至因特網上不同計算機的對象之間的通訊。
OPC技術是COM在工業領域的一種特殊應用,實質上,OPC規范就是定義了一些用于數據訪問、事件報警處理、歷史數據訪問等的COM對象和接口。
2.OPC DA規范
OPC DA規范是整個OPC協議族中的核心和基礎,所有的其他OPC規范都以OPC DA規范為基礎進行擴展而來。對于高敏感度的實時數據,將其從實時數據中分離,提出報警/事件的概念,制定了專門的OPC報警事件(OPC Alarm and Events)接口規范;對于面向趨勢顯示、歷史分析、報表的數據,OPC制定了歷史數據訪問(OPC Historical Data Access)接口規范。其他的OPC規范還包括OPC安全處理(OPC Security)接口規范、OPC批處理(OPC Batch)接口規范,OPC XML數據訪問(OPC XMLDA)規范,OPC數據交換(OPC Data Exchange)規范等。
在過程控制系統的架構中,整個系統以OPC DA服務器為中心,OPC AE服務器從OPC DA服務器上得到實時數據,并根據客戶的設置進行邏輯分析,產生相應的事件和報警信息發送到客戶端;OPC HAD服務器將從OPC DA服務器上獲得的實時數據按照客戶要求進行保存,便于客戶端進行查詢和分析數據的變化情況;OPC DX服務器將多個OPC DA服務器的數據組織起來,根據需要進行各個OPC DA服務器之間的數據交換:XML DA服務器將OPC DA服務器上的數據轉換成XML文本,并發布到互聯網上,實現數據更大范圍內的共享;OPC Security服務器則對整個數據層的數據加上了一層安全保護。
實際應用中也主要是以OPC DA規范、OPC AE規范和OPC HDA規范應用最為廣泛,尤其是OPC DA規范。因此通常提到的OPC服務器和客戶端都是指OPC DA服務器和OPC DA客戶端。
Modbus TCP OPC服務器的設計與實現
1. 總體結構
本文實現的OPC數據訪問服務器要完成對Modbus設備的數據采集功能,提供OPC數據存取規定的定制接口,同時通過數據存取區將設備數據與OPC接口聯系來。如圖1所示的OPC數據存取服務器總體結構,各個功能模塊相對獨立又相互協作,形成了一個有機整體。
圖1:OPC數據存取服務器總體結構。
本文設計的OPC數據存取服務器擁有獨立的進程空間,與客戶進行數據交換時穩定性高,同時提供了用戶友好的人機界面,便于用戶的自定義組態操作;硬件設備通訊模塊實現了標準的MdbusTCP通訊協議,可以實現與標準的ModbusTCP設備無縫互聯通信,簡單方便地獲取硬件設備的過程數據。
2. OPC接口模塊
OPC接口模塊包括OPC對象部分和數據存儲區部分,基于組件化的設計思想,可以設計成將COM和OPC技術細節隱藏,使得用戶將開發OPC數據采集服務器的工作集中在特定的數據采集任務上。
本文采用了OPCMaster的OM_OPCSvr.dll OPC接口動態庫工具來實現OPC接口模塊部分,OM_OPCSvr.dll完全支持OPC數據存取規范的所有版本,包括最新的DA 3.0版,它通過提供API函數完成OPC接口模塊的任務。其結構如圖2紅色虛線所示。
圖2:OPCMaster OPC接口動態庫工具結構。
OPC服務器初始化管理:通過調用InitOPCSvr(byte *pSvrCLSID,bool bExeSvr,DWord dwCoInit)來對的OPC服務器的CLSID、程序應用模型和初始化COM庫的線程模式進行初始化設置。通過調用SetServerRate(DWord dwServerRate)設置OPC服務器端向客戶端最快回調速率。通過調用SetVendorInfo(LPCWSTR lpVendorInfo, WORD wMajorVersion, WORD wMinorVersion, WORD wBuildNumber)設置Vendor及OPC服務器版本信息。
通過調用SetServerDelimiter(WCHAR cDelimiter)設置服務器標簽ID的分隔符,在這里我們設置cDelimiter為”.”。 通過調用SetCaseSensitivity(BOOL bOnOff = FALSE)設置OPC服務器端地址空間是否區分大小寫,在這里我們設置bOnOff=True,即區分地址空間大小寫。
OPC回調數據通信管理:在這里主要設置三個回調函數,分別是讀設備數據回調函數、寫設備數據回調函數和客戶端連接或斷開回調函數。
回調函數聲明分別如下:
/// 從設備讀數據tag回調函數
void ReadNotificationHandler(IntPtr hTag, out object Value, out UInt16 Quality, out System.Runtime.InteropServices.ComTypes.FILETIME Timestamp, out Int32 DeviceError)
/// 向設備寫數據Tag回調函數
void WriteNotificationHandler(IntPtr hTag, ref object Value, ref UInt16 Quality, ref System.Runtime.InteropServices.ComTypes.FILETIME Timestamp, out Int32 DeviceError)
/// 客戶端連接或斷開回調函數
void ClientConnNotificationHandler(UInt32 Num, bool bConnect)
聲明完回調函數后,需要調用使能回調函數EnableDeviceRead、EnableDeviceWrite和EnableClientConnNotify分別對上述3個回調函數使能,完成回調函數設置。
OPC服務器注冊管理:通過調用int RegisterOPCServer(byte[] pSvrCLSID, string lpProgID, string lpDescription, string lpVendor, string lpFilePath)完成對OPC服務器的注冊,以便OPC客戶端通過注冊表搜索到本機或本網絡內的OPC服務器。
通過調用int UnregisterOPCServer(byte[] pSvrCLSID, string lpProgID)完成OPC服務器的注銷功能。
3. 通信驅動模塊
ModbusTCP是Modbus協議的網絡協議,TCP端口號為502。ModbusTCP由協議頭MBAP、功能碼和數據域組成,協議格式如圖3所示。
圖3:基于ModbusTCP協議的請求和應答格式。
MBAP(Modbus Application Protocol)協議頭的主要功能時對Modbus應用數據單元ADU的標識。其詳細內容見表1。
表1:MBAP協議頭。
功能碼主要功能是標識請求什么類型數據,本通訊驅動模塊主要使用6種標準的Modbus功能碼,其詳細內容見表2。
表2:Modbus功能碼。
Modbus TCP消息幀通過TCP網絡協議進行傳輸,因此借助Dot Net 4.0平臺的Socket類定義封裝了一個TcpSocket TCP通信類,通過此類可以完成TCP連接斷開、發送接收數據和發現斷開自動重連功能。
本Modbus TCP協議通信驅動模塊屬于Modbus Slave,需要對設備返回的Modbus TCP消息幀進行MBAP驗證、請求數據獲取。圖4是對設備進行讀取數據的流程。
圖4:設備通信驅動模塊讀取設備數據流程。
4. 用戶界面
OPC服務器的用戶界面將數據項用樹形結構標識,然后設計數據項和硬件設備的數據綁定設置的界面以及實時顯示數據項列表界面,并將數據存儲區與硬件通信接口聯系起來,實現用戶自定義組態功能。在OPC服務器程序關閉時需要將數據項的屬性以及硬件設備設置參數作為組態配置文件保存起來,便于下次OPC服務器運行時能自動調入組態配置文件,自動完成初始設置。
主窗口:主窗口是OPC服務器程序的起始點,主要完成OPC服務器的初始化。主窗口是所有界面元素的組織容器,主要包括菜單欄、工具欄 、設備樹形列表 、標簽列表、信息列表和狀態欄,如圖5所示。
圖5:用戶界面。
添加設備:此處的設備是實際物理設備的一個邏輯引用,通過此邏輯設備設置與實際設備的通信參數及相關屬性。點擊菜單“添加?添加設備”,則打開設備屬性設置對話框,如圖6所示。用戶可以設置相關參數。
圖6:設備屬性設置對話框。
添加組:組是包容設備中一組同類型數據的容器,只需要設置其名稱即可。點擊“添加?添加組”,則打開設置組屬性對話框,如圖7所示。用戶可以設置組名稱。
圖7:組屬性設置對話框。
添加數據標簽:數據標簽是實際物理設備中數據的邏輯抽象,且進行了OPC數據封裝。點擊菜單“添加?添加標簽”,打開Modbus TCP設備數據標簽屬性設置對話框,用戶根據實際設備情況,設置數據點名稱、地址、數據類型、寄存器類型等屬性,如圖8所示。
圖8:Modbus設備數據標簽屬性設置對話框。
根據實際需要重復“添加設備-添加組-添加數據標簽”流程,配置好所需要存取的設備數據點。
組態配置文件:在OPC服務器程序關閉時需要將數據項的屬性以及硬件設備設置參數作為組態配置文件保存起來,便于下次OPC服務器運行時能自動調入組態配置文件,自動完成初始設置。本文利用DotNet 4.0的序列化和反序列化技術,可以將數據對象序列化到文件中和將文件反序列化到數據對象。
輪詢設備線程:經過組態配置好數據點后,運行OPC服務器,開始輪詢設備并將實時獲取的數據更新到數據緩沖區內,如圖9所示。
圖9:更新數據詳細流程。
本文小結
鑒于Windows在工控領域的成熟度和穩定性,以及Dot Net FrameWork的跨平臺性,本文基于Dot Net4.0平臺封裝了OPC接口,編程實現了ModbusTCP通信協議以及良好的人機交互界面,通過了功能測試和性能測試,500ms輪詢周期可穩定高效地讀寫千點設備數據,目前國內外SCADA系統中的OPC客戶端接口可以利用本OPC輕松實現與北京世紀聯信公司MultiBus-RTU等產品的互聯通信。
本OPC數據存取服務器目前實現的主要功能和特點包括:支持OPC 數據存取規范1.0、2.0和3.0;友好的人機交互界面;自定義組態及保存組態配置;支持標準的ModbusTCP通信協議;基于Dot Net4.0平臺,可以跨平臺運行;易與主流的SCADA軟件平臺互連通信。
評論