OPC與OPC UA
什麼是OPC協議?
為了便於自動化行業不同廠家的裝置和應用程式能相互交換資料,定義了一個統一的介面函式,就是OPC協議規範。有了OPC就可以使用統一的方式去訪問不同裝置廠商的產品資料。
OPC基金會前前後後規定了不同的介面定義,如下:
• OPC DA (Data Access, exchange of real-time values)
• OPC A&E (Alarms & Events, exchange of alarms and events)
• OPC HDA (Historical Data Access, exchange of historical values)
• OPC XML DA (XML-based exchange of real-time values)
以上所有的介面定義,我們現在都統稱為OPC。OPC是基於WINDOWS COM/DOM介面技術來規定的。
比如我們可以瞭解下OPCGroup的介面定義如下:
//********************************************************* // IOPCGroup Interface [ object, dual,oleautomation, uuid(28E68F96-8D75-11d1-8DC3-3C302A000000), helpstring("OPC Group Object"), pointer_default(unique) ] interface IOPCGroup : IDispatch { // Properties [propget,helpstring("Returns the parent OPCServer")] HRESULT Parent([out, retval] IOPCAutoServer ** ppParent ); [propget] HRESULT Name([out, retval] BSTR * Name ); [propput] HRESULT Name([in] BSTR Name ); [propget,helpstring("True if this group is public")] HRESULT IsPublic([out, retval] VARIANT_BOOL * IsPublic ); [propget,helpstring("True if this group is active")] HRESULT IsActive([out, retval] VARIANT_BOOL * IsActive ); [propput] HRESULT IsActive([in] VARIANT_BOOL IsActive ); [propget,helpstring("True if this group will get asynchronous data updates")] HRESULT IsSubscribed([out, retval] VARIANT_BOOL * IsSubscribed ); [propput] HRESULT IsSubscribed([in] VARIANT_BOOL IsSubscribed ); [propget] HRESULT ClientHandle([out, retval] LONG * ClientHandle ); [propput] HRESULT ClientHandle([in] LONG ClientHandle ); [propget] HRESULT ServerHandle([out, retval] LONG * ServerHandle ); [propget] HRESULT LocaleID([out, retval] LONG * LocaleID ); [propput] HRESULT LocaleID([in] LONG LocaleID ); [propget] HRESULT TimeBias([out, retval] LONG * TimeBias ); [propput] HRESULT TimeBias([in] LONG TimeBias ); [propget] HRESULT DeadBand([out, retval] FLOAT * DeadBand ); [propput] HRESULT DeadBand([in] FLOAT DeadBand ); [propget,helpstring("Rate data can be returned to an application (in mSec)")] HRESULT UpdateRate([out, retval] LONG * UpdateRate ); [propput] HRESULT UpdateRate([in] LONG UpdateRate ); [id(0),propget,helpstring("Returns the OPCItems collection")] HRESULT OPCItems([out, retval] OPCItems ** ppItems ); // Methods HRESULT SyncRead( [in] SHORT Source, [in] LONG NumItems, [in] SAFEARRAY(LONG) * ServerHandles, [out] SAFEARRAY(VARIANT) * Values, [out] SAFEARRAY(LONG) * Errors, [out,optional] VARIANT * Qualities, [out,optional] VARIANT * TimeStamps); HRESULT SyncWrite( [in] LONG NumItems, [in] SAFEARRAY(LONG) * ServerHandles, [in] SAFEARRAY(VARIANT) * Values, [out] SAFEARRAY(LONG) * Errors); HRESULT AsyncRead( [in] LONG NumItems, [in] SAFEARRAY(LONG) * ServerHandles, [out] SAFEARRAY(LONG) * Errors, [in] LONG TransactionID, [out] LONG * CancelID); HRESULT AsyncWrite( [in] LONG NumItems, [in] SAFEARRAY(LONG) * ServerHandles, [in] SAFEARRAY(VARIANT) * Values, [out] SAFEARRAY(LONG) * Errors, [in] LONG TransactionID, [out] LONG * CancelID); HRESULT AsyncRefresh( [in] SHORT Source, [in] LONG TransactionID, [out] LONG * CancelID); HRESULT AsyncCancel( [in] LONG CancelID); };
什麼是OPC UA?
為了應對標準化和跨平臺的趨勢,為了更好的推廣OPC,OPC基金會近些年在之前OPC成功應用的基礎上推出了一個新的OPC標準-OPC UA。OPC UA介面協議包含了之前的 A&E, DA,OPC XML DA or HDA,只使用一個地址空間就能訪問之前所有的物件,而且不受WINDOWS平臺限制,因為它是從傳輸層Scoket以上來定義的,這點後面會提到,導致了靈活性和安全性比之前的OPC都提升了。
OPC UA的優勢:
1.一個通用介面集成了之前所有OPC的特性和資訊,A&E, DA,OPC XML DA or HDA
2.更加開放,平臺無關性,WINDOWS,LINUX都能相容
3.擴充套件了物件型別,支援更復雜的資料型別比如變數,方法和事件
4.在協議和應用層集成了安全功能,更加安全
5.易於配置和使用
核心的區別是因為OPC和OPC UA協議使用的TCP層不一樣,如下:
OPC是基於DOM/COM上,應用層最頂層;OPC UA是基於TCP IP scoket 傳輸層.
其他一些區別:
OPC雖然通過配置COM/DOM來提供資料加密和簽名功能,配置防火牆,使用者許可權來讓資料訪問變得更加安全,但是會增加額外的工作量,尤其是對非IT的工程師來說;對於OPC UA,資料加密和簽名,防火牆等都是預設的功能。比如基於DOM的OPC使用的動態埠分配,埠不固定,讓防火牆難以確定,而OPC UA的埠都是唯一的,比如SINUMERIK 840D是PORT 4840,SIMATIC S7是PORT 4845。DOM/COM也可以生成不同級別的事件日誌,但日誌內容不夠詳細,只會提供“誰連線上伺服器”這種,而對於OPC UA來說都是預設的功能,生成的日誌內容更全面。
後面會放上OPC UA的DEMO。