OPC通訊開發簡介--基於WTOPCSVR的OPC服務器端和基於WTCLIENT的OPC客戶端開發

說明

    基於OPC開發工具WtOPCSvr(服務器端)和WTclient(客戶端)可以不去實現底層細節,通過調用API函數即可實現OPC通訊功能,但該開發工具的技術文檔介紹簡略,以及OPC技術本身的開發資料沒有詳細的介紹,故撰寫此說明方便以後的OPC開發,本說明包含了OPC通訊的介紹,包括實現步驟以及細節的詳細說明(通訊細節和一些關鍵變量),以及對開發工具的一些介紹。
警告:本文爲作者對OPC的粗淺理解,加之主要爲了向不瞭解OPC技術的人簡單說明其原理與實現,難免會有較多介紹不嚴謹的地方,敬請諒解,如果可以,請指出錯誤的地方以便作者改正。

一、OPC技術介紹

    OPC是什麼?網絡釋義:“OPC是OLE for Process Control的縮寫,即應用於過程控制的OLE。OPC建立於OLE規範之上,它爲工業控制領域提供了一種標準的數據訪問機制。將硬件與應用軟件有效地分離開來,是一套與廠商無關的軟件數據交換標準接口和規程,主要解決過程控制系統與其數據源的數據交換問題,可以在各個應用之間提供透明的數據訪問。”
    可以看到,OPC是一種通訊規範。什麼是通訊規範?以串口通訊爲例,通訊雙方的參數包括波特率,校驗位等等設置正確,再通過標準的串口線相連,就可以實現通訊。OPC作爲一種通訊規範,通訊雙方通過搭建符合標準的連接,和經過符合標準的流程(設置好參數)建立通訊後,也就可以通訊了。不過串口通訊雙方基本是對等關係,而OPC通訊是典型的C/S結構,分爲客戶端和服務器部分,且通訊的發出者都是客戶端,服務器只能響應客戶端的請求,這在下一部分部分詳細介紹。
    爲什麼在工業控制中要採用OPC通訊?在課程設計中經常會有這種情況:以一個嵌入式系統實現一些物理動作或採集某些信息,將嵌入式系統與計算機連接用來下裝程序和在調試時讀取其中的參數,爲了更加方便還會開發計算機運行的上位監控軟件,不用在調試狀態就可以顯示當前嵌入式系統某些參數。工業控制更需要類似的設計,傳統工業控制和上述例子類似,現場的嵌入式系統和現場設備與計算機相連,計算機安裝有上位軟件用來讀取監控到的實時數據和進行一些寫入操作,例如溫度,壓力等,如下圖所示:傳統通訊流程
    但是這種傳統的通訊方式存在的問題是,由於現場設備生產廠家的不同,上位軟件以及上位和傳感器交流的驅動程序需要廠家本身來提供,每次更換或升級設備,驅動程序要重新開發,上位軟件也要更新,對於生產現場設備的廠家很麻煩,對於用戶來說,由於生產廠家的獨立性,讀取某個廠家的設備數據必須使用相應的上位,也很繁瑣。OPC技術的產生就是爲了解決這樣繁瑣的問題,通過符合標準的OPC服務器,將現場設備的數據保存在其中,用戶使用符合OPC標準的客戶端(相當於上位監控軟件),也不需要開發驅動程序,直接與服務器相連接,就可以讀取現場設備的數據,極大地優化了通訊過程。

二、OPC通訊的流程

    OPC通訊的粗略結構如下圖:
在這裏插入圖片描述
    如果現場設備符合OPC標準,它們提供數據給服務器,用戶在計算機上操作客戶端連接到服務器後,就可以訪問所有連在服務器上的現場設備數據。也就是說,相比較傳統的直接連接的通訊方式,OPC通訊在現場和用戶角度來看,都經過了OPC服務器,這樣的結構設計就解決了不同廠商現場設備的異構性。
    對於客戶端來說,具體的通信流程是這樣的:首先要連接服務器,然後建立組,最後建立項,由項和服務器中某個數據點(規範說法是標籤)對應,即可讀取和寫入標籤的數據。
    其中連接服務器,本地服務器只需要提供服務器的名字,遠程服務器需要提供IP地址和服務器名。連接完畢後需要在服務器內建立組,所建立的組實際上並不是改變了服務器的數據結構,而是在客戶端中建立了一個容納項的“容器”,每個項都必須歸屬於一個組,一個組管理多個項——組相當於文件系統中的文件夾,本身不保存任何信息,而其中包含了多個用來保存數據的項,這種設計對於管理一些項很方便。最後用來與現場數據建立真正連接的是項,項不是一個數據結構,而是一個“連接”,一個指向真正現場數據的“指針”,客戶端通過項就可以對應到一個現場數據點(準確來說,客戶端的項指向的是服務器的標籤,標籤又和現場數據點對應)。
    對於服務器來說,服務器都具有CLSID用來標識這個服務器,首先需要利用CLSID以及自定義的服務器名在本地註冊服務器(註冊服務器後註冊表也會有相應變化),然後是初始化服務器功能,以及啓動服務器(設置服務器狀態爲運行),服務器應當利用各種方式將現場數據讀取到OPC服務器中併爲每個數據點創建標籤,創建標籤時可以定義這個標籤是否可讀可寫,爲了不斷地提供數據,需要設計設計一個定時器讓服務器定時從現場採集數據進行更新,客戶端如果要對可寫的標籤進行寫入操作,需要在服務器程序中通過寫標籤回調函數實現,服務器運行時檢測到客戶端的寫標籤請求,會進入到回調函數中更新標籤的數據。

三、OPC標準官方文件部分變量說明

    OPC規範有多個協議,其中最基礎的是DA(數據訪問)規範,在頭文件opcda.h中包含了規範定義的變量,這些變量作爲OPC通訊的基礎,必須很好地瞭解才能實現OPC通訊程序的編寫。

1.OPCBROWSETYPE枚舉

在這裏插入圖片描述
    實際上,OPC服務器中的標籤並不是一個一個地依次排列的,而是由類似於MFC樹形控件一樣的樹形結構保存的,一個服務器作爲最基本的根節點,展開後既有葉子,也有樹枝,葉子對應了一個真正的標籤,樹枝則管理了多個葉子。將樹枝展開,可能會有下一層的樹枝,也可能有葉子存在,如果客戶端讀取到了一個有樹枝的葉子,它的對應的標籤全名應該是從服務器下屬第一層樹枝名字加一個“.”繼續每一層樹枝名字加一個.,直到最後加上葉子的名字,客戶端訪問服務器標籤,首先就是要想辦法獲取這個標籤全名。
    這個枚舉中OPC_BRANCH代表瀏覽樹枝,當前瀏覽位置下的某一項如果有孩子(葉子)那麼這一項就是一個樹枝。OPC_LEAF代表瀏覽葉子,當前瀏覽位置下的某一項如果沒有孩子(葉子)那麼這一項就是一個葉子。OPC_FLAT代表當前位置這一層下所有的名字,包括樹枝和葉子。

2.OPC讀寫標誌宏定義

在這裏插入圖片描述

    通過相應的函數訪問到服務器標籤後,會返回這個標籤的句柄,根據句柄可以對標籤進行各種操作,比如讀取標籤的值,標籤的值不光有其對應設備的真正的數值,還有各種附帶的屬性,例如OPC讀寫標誌宏,讀取標籤可以讀取到標籤的讀寫狀態,如果這個標籤只可讀,那麼讀寫標誌位返回OPC_READABLE表明只可讀,如果返回OPC_WRITEABLE表明只可寫,如果是OPC_READABLE+OPC_WRITEABLE則表明即可讀又可寫。

3.OPCSERVERSTATE枚舉

在這裏插入圖片描述
    這個枚舉包含了服務器各種狀態,通過相應函數獲取服務器狀態後,標誌服務器狀態的變量會有枚舉中的各種情況,依次分別標誌服務器狀態爲運行、失敗、未設置、掛起、測試。

4.tagOPCGROUPHEADER結構體

在這裏插入圖片描述
    這個結構體中dwItemCount保存了屬於這個組的項的數目,hClientGroup保存了客戶端創建組後返回的組句柄,對組的操作都要通過組句柄完成。

5.OPC項相關結構體

在這裏插入圖片描述
在這裏插入圖片描述
    這些結構體中hClient代表項的句柄,ftTimeStamp是項的時間戳,wQuality是項的品質,vDataValue是保存項對應標籤的真正的值。szItemID是項對應標籤的名字,bActive是項是否激活的標誌。

6.tagOPCSERVERSTATUS

在這裏插入圖片描述
    這個結構體保存了服務器各種狀態,ftStartTime是服務器啓動的時間,ftCurrentTime是連接到的服務器當前時間,ftLastUpdateTime是服務器上次刷新的時間,dwServerState對應了之前的服務器狀態枚舉,dwGroupCount是服務器包含組的計數,dwBandWidth是服務器死區,wMajorVersion是服務器支持的最大OPC標準版本,下一個是最小支持版本。

7.VARIANT變體類型

    Variant 是一種特殊的數據類型,除了定長String數據及用戶定義類型外,可以包含任何種類的數據。Variant 也可以包含Empty、Error、Nothing及Null等特殊值。可以用VarType函數或TypeName函數來決定如何處理 Variant 中的數據。其部分定義如下圖,最重要的是vt成員,該成員的取值表明這個數據屬於的真正類型,確定類型後,在對應數據類型的指針賦值即可。部分vt取值如下:

vt所取的值 說明
VT_EMPTY 指示未指定值
VT_NULL 指示空值(類似於 SQL 中的空值)
VT_I2 指示 short 整數
VT_I4 指示 long 整數
VT_R4 指示 float 值
VT_R8 指示 double 值
VT_BSTR 指示 BSTR 字符串
VT_BOOL 指示一個布爾值

    Variant還有很多包含的變量以及變量取值,詳細內容請參閱百度百科相關詞條。
在這裏插入圖片描述

四、OPC開發工具之WtOPCSvr開發OPC服務器

1.工具準備

    使用開發工具開發服務器,首先要將WtOPCSvr.dll,WtOPCSvr.lib這兩個運行庫複製到工程下,然後複製WTOPCsvrAPI.h和WtOPCsvrEXTapi.h到工程下,這兩個頭文件包含了開發工具中API函數的聲明,包含之後才能調用,還有需要將opc_ae.h和opcda.h包含到工程下,這兩個是OPC官方的頭文件,服務器和客戶端開發都需要包含這兩個頭文件。
    lib文件需要包含在工程中,我採用的是靜態組件的方式,如下圖所示添加工程目錄下的文件:
在這裏插入圖片描述
    要想使用OPC服務器功能,需要在cpp中include這四個頭文件。

2.開發服務器流程簡述

    對於服務器開發的具體函數如何使用請參見WTOPCServer使用手冊,這裏只做大體上的描述。使用WTopcserver需要輸入序列號註冊解除30分鐘時限,否則服務器30MIN後自動退出,然後首先需要註冊服務器,註冊時要提供服務器名字和其他參數,註冊完成後是初始化服務器,再後是啓動服務器,啓動服務器後服務器就開始了運行,但仍是一個空服務器,需要通過創建標籤來添加服務器的標籤,添加時要確定好從哪裏取數據放到標籤中,啓動服務器後還應當設置一個定時器,定時更新服務器數據。要實現服務器響應客戶端寫數據的請求,需要定義回調函數。

五、OPC開發工具之WTopcclient開發OPC客戶端

1.工具準備

    使用開發工具開發服務器,首先要將WTclient.dll,WTclient.lib這兩個運行庫複製到工程下,然後複製WTclientAPI.h和WtclientAPIex.h到工程下,這兩個頭文件包含了開發工具中API函數的聲明,包含之後才能調用,還有需要將opc_ae.h和opcda.h包含到工程下,這兩個是OPC官方的頭文件,服務器和客戶端開發都需要包含這兩個頭文件。
    添加lib文件到工程中和之前的類似。使用客戶端功能同樣要記得在cpp文件中包含四個頭文件。

2.開發客戶端流程簡述

    對於客戶端開發的具體函數如何使用請參見WTOPCclient使用手冊,這裏只做大體上的描述。OPC客戶端需要初始化DCOM才能正常使用客戶端功能,在程序結束時還要調用退出函數。客戶端連接服務器前首先要獲取本地/遠程計算機的服務器數目,根據數目逐個獲取服務器名字,在獲取服務器名字後才能連接。連接服務器時需要提供計算機名字,服務器名字。計算機名字爲空代表本地服務器,爲IP地址代表連接指定IP地址的遠程服務器,連接後會得到服務器句柄,對服務器進行操作時均需提供服務器句柄。
    連接服務器後首先要創建組,組可以管理多個項,像一個“文件夾”,創建組時需要提供組的名字(自己起)和刷新速率,死區,然後就可以返回組句柄,通過組句柄對組進行操作。添加組後就要添加項,由於每一項和服務器一個標籤對應,添加項前需要獲取服務器標籤。根據前面的介紹,服務器的標籤是以一種樹形的結構提供的,需要不斷移動瀏覽服務器的位置,讀取當前瀏覽位置下的標籤名。不斷移動瀏覽位置遍歷完整個服務器後,獲取到了所有的標籤名,可以選擇其中想要建立連接的標籤,對其添加項,添加項時需要提供服務器句柄,組句柄和項(標籤)的名字。添加完成,返回項的句柄,就可以進行讀寫操作了,在讀寫時提供對應的項句柄,讀取時存放讀取到值的變量,寫入時寫入值的變量,就可完成讀寫。
    進行完所有操作,結束對服務器的訪問,需要先將項全部刪除,然後刪除組,最後斷開服務器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章