工業自動化中資料交換的新標準 - OPC

来源:互联网 发布:淘宝怎样进闲鱼 编辑:程序博客网 时间:2024/05/16 18:36
原文: http://www.adlinktech.com/big5/solution/tech_forum.php?file=measure/20031019.htm


工業自動化中資料交換的新標準 - OPC
文 / 凌華科技    倪浩然 凌華科技量測產品事業部產品經理 
隨著計算器技術的進步,電腦在工業自動化系統中扮演日益重要的角色。舉例來說,以往在自動化機台中需透過硬體控制面板或人機介面所提供的功能,現今漸漸被使用電腦+圖控軟體這樣的方式所取代。此外,由於計算器強大的運算能力、彈性的編程方式,以及網路存取的支援,使得一個同時具有底層的設備管理 (Field Management)、中層的程式管理 (Process Management),以及上層的營運管理 (Business Management) 的整合化工業自動化系統得以實現。


但是,即便現今的計算器擁有強大的運算能力及彈性,這樣的系統仍然是極為複雜的。我們來思考一下系統中的每一層需要哪些功能:


設備管理 (Field Management):在這一層中,系統管理各式各樣硬體設備,這些設備可能連接到不同的 field bus,並使用不同的通訊協定,例如 CAN、DeviceNet、ProfiBus、RS-422/485、HSL 等。所以在設備管理層,系統必須有能力與許多不同的硬體設備溝通。
程式管理 (Process Management):程式管理控制系統中每一項硬體設備動作的順序,從硬體 I/O 點的輸入值取得,到內部的控制程式邏輯運算,最後再對硬體 I/O 點進行數值的更新。
營運管理 (Business Management):上層的營運管理負責將工廠的生產流程與企業資源管理整合在一起。比方說,透過網路的連結,企業內部的 ERP 系統可以得之工廠內生產批次批量的資訊。這樣高度整合的系統有助於企業決策及效能的提升。
高度整合的系統可以帶來極佳的效能,相對地,在技術上也帶來極大的挑戰。這樣系統會涉及極為大量的資料交換,比方說,程式管理軟體需要使用不同通訊協定與不同的硬體溝通,同時再利用另外的協定與資料格式將這些程式產生的資料提供給上層的營運管理軟體。可以想見的,要開發一套軟體能夠同時支援這麼多種的通訊協定與資料格式將是一件曠日費時的工作。為瞭解決軟體發展上的困難,我們需要一套通用的資料交換的標準,能夠讓軟體開發人員用相同的程式碼存取各種不同層級的資料,無須了解硬體或網路實作的細節。


OPC 便是在這樣的概念下誕生的新標準。


   What Is OPC?
OPC 是 OLE for Process Control 的縮寫,它利用微軟的 COM/DCOM 技術來提供一套統一的資料交換介面。根據 OPC Specification 的定義,OPC is "a standard mechanism for communicating to numerous data sources, either devices on the factory floor, or a database in a control room."。


在介紹 OPC 所定義的介面之前,我們先來看看COM 是什麼? COM (Component Object Model) 是微軟提出的一套軟體元件的模型。你可以把每一個 COM 的元件看作是一個提供特殊功能的獨立模組。透過組合不同的 COM 元件,程式開發者可以大幅強化應用程式的功能並縮短開發時間。事實上,微軟的 Windows 作業系統內部也大量使用了 COM 技術。


一個 COM 元件透過稱之為介面 (Interface) 的機制提供各式各樣的功能,像下圖中的 COM 元件提供 A 到 H 的介面,每一個介面包含許多的方法 (Method) 提供特定的功能。在使用 COM 元件時,首先建立 COM 元件的 instance,然後找到適當的介面,便可以叫用 (invoke) 其中的方法執行特定的功能。此外,COM提供了對網路存取的支援,應用程式無須修改,便可以跨網路存取遠端的物件。






OPC 是一個可執行的 COM 元件,它定義了一套介面提供資料交換之用。任何一個實作了這些介面的元件稱之為一個 OPC Server,而透過這些介面與 OPC Server交換的程式,稱之為 OPC Client。下圖是 OPC Server/Client關係示意:






 OPC Server
在對 OPC 有了初步的了解後,我們現在來看看一個 OPC Server 是如何產生的,我們拿凌華科技的 NuDAM OPC Server 作為例子。






上圖是 NuDAM OPC Server 的架構。從圖中我們可以看到,一個 OPC Server 中有兩個主要的部分,其一是所有 OPC 介面的實作,另外的一個部份則負責透過電腦的 COM port 存取 NuDAM 模組產生的資料。


一般而言,所有的 OPC Server 都包含這兩個部份:通訊模組與 OPC 介面的實作。針對不同的硬體,通訊模組需要不同的程式,比方說,NuDAM OPC Server 支援的硬體為 NuDAM,程式必須控制電腦中的 COM port,並且使用 NuDAM 標準的命令格式送出指令字串。如果支援的硬體是一個使用 Modbus TCP 協定的裝置,OPC Server 就必須使用 Socket 傳送 Modbus 的命令字串。我們建議在撰寫通訊模組時,盡量以物件導向的概念編寫程式,這樣可以為您的 OPC Server 提供最大硬體支援的彈性。


接下來我們看看 OPC Server 中另一個重要的部份 - OPC Interface。這個部份跟前面提到的通訊模組有個很大的不同之處,通訊模組必須針對不同硬體撰寫不同的程式碼,但是不管您使用什麼樣的硬體,OPC Interface 永遠是一樣的。也正因為如此,用戶的應用程式可以透過完全相同的程式碼透過 OPC Server 存取不同的硬體。一個 OPC Server 中應該包含下列三種物件:


OPC Item
OPC Group
OPC Server
OPC Item 是資料交換的基本單位。它可以對應到一個實際的 I/O 點,或者是暫存器或記憶體的值。所有的 Item 都必須定義在 OPC Server 的組態設定中。舉例來說,一個 NuDAM OPC Server 連接一個NuDAM-6018 (8 通道 AI) 模組,您可以定義八個 OPC Item,分別對應到 6018 的 AI0 ~ AI7。每一個 OPC Item 都具有像是 Value、Quality 或 TimeStamp 等等的屬性,透過讀取或寫入這些屬性值,我們可以存取到對應的 I/O 點的狀態。


OPC Group 則是一群 OPC Item 的集合,同時它必須提供一組介面的實作用來管理其中的 OPC Item。下圖是 OPC Group 應該提供的介面,其中:






IOPCItemMgt 提供管理/新增/刪除 Group 內的 Item 的功能
IOPCGroupStateMgt 提供 Group 內部的資訊
IOPCSyncIO 提供同步讀取/寫入 Item 值的功能
IOPCAsyncIO2提供非同步讀取/寫入 Item 值的功能
IConnectionPointContainer 管理 OPC Client 端的回呼 (callback) 介面
OPC Server 是最上層的物件,它提供一套管理 Group 的介面,用戶端可以透過它所提供的介面新增/刪除 Server 中的 Group,並取得 OPC Server 本身的資訊。OPC Server 所提供的介面如下:






IOPCCommon 提供 OPC server 內部資訊
IOPCServer 管理 OPC group
IOPCBrowseServerAddressSpace提供瀏覽 OPC server 內部定義 Item 的功能
IConnectionPointContainer 管理 Client 端的回呼 (callback) 介面
IOPCItemProperties 提供 Item 的屬性及組態資訊
介面的實作會涉及許多 C++ 語言的程式技巧以及 COM 的知識,所以對一般人而言可能不是那麼容易。市面上有一些工具軟體可以幫助用戶開發 OPC Server 的介面,不過在使用這些工具之前,我建議您還是應該先涉獵一些關於 C++ 與 COM 的知識,可以讓您開發的過程更加順利。


 OPC Client
OPC Server 的開發需要比較深入的技術,不過很幸運地,這是一個開放的標準,所以有許多的廠商提供形形色色的 OPC Server,支援各式各樣的硬體裝置。您可以在 google 上輸入 OPC 進行搜尋,找到你需要的 OPC Server。


在這一節中,我們將說明如何撰寫一個 OPC 的 Client。一個 OPC Client 可以連接到一個本地或遠端的 OPC Server,並取得其中 I/O 點的資料。接下來我們將用 VC++ 的程式碼說明 OPC Clinet 連接到 OPC Server 的流程:


綜觀SSCNET技術,我們可以整理出它帶給運動控制使用者下列的好處:


1. 啟動 OPC Server


CLSID clsid;
HRESULT hr;
IOPCServer *pIServer;
hr=CLSIDFromProgID(T2COLE("ADLINK.NuDAMOPC.2"), &clsid);
// 透過 OPC Server 的 ProgID (ADLINK.NuDAMOPC.2) 得到 CLSID


hr=CoCreateInstance(clsid, NULL, CLSCTX__SERVER, IID_IOPCServer, (void **)&pIServer);
// 利用 CoCreateInstance 這個 API 啟動本機或遠端的 NuDAM OPC Server,並取得 IOPCServer 介面


2. 在 OPC Server 中加入一個新的 OPC Group


hr=pIServer->AddGroup(T2W((LPCTSTR) GroupName), bActive, UpdateRate, ClientHandle, &timeBias, &deadband, 0x0404, serverHANDLE, &revisedRate, IID_IOPCItemMgt, (LPUNKNOWN *)&pItemMgt);
// 取得 IOPCServer 介面之後,叫用介面中的 AddGroup 方法新增一個 OPC Group。這個方法需要的參數包含 Group 名稱、Group 資料更新時間、Client 與 Server 的 handle 等等。新增 Group 後會取得 IOPCItemMgt 介面。


3. 將 OPC Server 中已定義好的 OPC Item 加入剛剛新增的 Group 中


OPCITEMDEF ItemDef[10];
OPCITEMRESULT *result;
HRESULT *error;


//get item information and fill ItemDef[]
hr=pItemMgt->AddItems(10, ItemDef, &result, &error);
// 透過 IOPCItemMgt 介面中的 AddItems 方法,將 10 個 Item 加入這個 Group 中。


4. 讀取或寫入 Item 的值


IOPCSyncIO *pISyncIO;
OPCHANDLE *serverHandle;
OPCITEMSTATE *itemState;


hr=pItemMgt->QueryInterface(IID_IOPCSyncIO, (void **)&pISyncIO);
// 由剛剛的 IOPCItemMgt 介面取得 IOPCSyncIO 介面,這個介面提供同步讀寫 OPC Item 的功能。
hr=pISyncIO->Read(OPC_DS_DEVICE, 10, serverHandle, &itemState, &result);
// 透過 IOPCSyncIO 介面的 Read 方法,讀取 Group 中的 10 個 Item 的值。


您可以看到,寫一個 OPC Client 要簡單的多了。而且,您可以用相同的 Client 程式連接到任何的 OPC Server。透過 OPC 這個標準,在不同平台、不同硬體裝置之間的資料交換,將會變得簡單而統一。


 結語
OPC 的誕生,是結合硬體與軟體技術進步的成果。OPC 提供了一套資料交換的通用標準,藉由這個標準,軟體開發人員不需要再擔心硬體上的細節,專注在資料交換後的處理上,提升應用軟體的開發效率。此外,由於硬體裝置的細節被隱藏在 OPC Server 之中,在更換硬體時,僅需更換對應的 OPC Server,應用程式的其他部分完全無須修改,這為系統中的硬體配置帶來極大的彈性。再加上 COM/DCOM 技術本身帶來的遠端存取能力,我們相信,OPC 將會是未來資料交換的主流標準。