1. 程式人生 > >OPC與OPC UA

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。