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