什么是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的接口定义如下:
[ object, dual,oleautomation, uuid (28E68F96-8D75-11d1-8DC3-3C302A000000), helpstring("OPC Group Object" ), pointer_default(unique) ] interface IOPCGroup : IDispatch { [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 ); 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。