基于订阅机制的OPC通讯---OPC终结篇
一、前言
这篇文章将是OPC通讯的终结篇。
这篇文章奠定了OPC通讯从实验室走向现场、从小规模数据交互到大数据传输存储、从只能控制慢对象到实时控制的基础。
基于订阅机制的OPC客户端开发,可以实现代码量减少一半,但是,通讯速度速度增加约一百倍。
二、订阅机制
OPC本质上是一个客户端服务器模式,数据的传送首先由客户端发起,读取的方式有同步和异步。同步方式下,OPC客户端发出请求并进入等待,直到服务器端返回数据。这是我们非常熟悉的客户端服务器数据交互的一般方式。在这个方式下,每次读取数据大部分的时间都消耗在了等待上。当数据量十分巨大的时候,把所有数据点轮询一遍所用时间太长。因此这种方法适合于强制的读取某一个数据点。对于大数据来说就不太适合了。此时订阅模式就显得尤为重要了。
在订阅的方式下,OPC客户端首先告诉服务器,订阅了哪些数据,订阅完之后,客户端不再等待,而是去执行其他的任务。当服务器中发现这些订阅的数据点发生改变时,就会立即采用回调机制将数据传送到客户端,在这种方式下,客户端不需要对服务器进行轮询。
三、基于高级API的OPC客户端开发
3.1使用组件介绍
我们使用的是WTclient.dll这个快速开发工具,这个组件的使用使得OPC客户端开发周期大大减少,但是这个组件也有一些十分大的陷阱,这些陷阱在现场调试的过程中给我造成了无比大的伤害。首先,我们一般获取到的这个组件是美国一家开发公司免费提供的,但是,他在里面封装了一个定时器,这个定时器使得我们使用这个组件有时间限制,最多使用两个小时就会强制暂停服务。如果想不受限制的使用就只能购买他的序列码,900多美金。让我花钱,这怎么可能,然后我想尽方法,破解了它的定时器。哈哈哈。有需要的可以私信我。其次,阅读他的资料真是一件十分痛苦的事情,全英文,且晦涩,为了使用订阅模式,这个英文的资料读到我想吐,最后还是一半猜测一半想象,反正是终于实现了。
3.1实现同步读取的接口
从服务器读取数值,其实有很多种方法,这里给出三个基本方法,亲测有效
首先连接服务器,返回一个连接句柄,最后一个参数设为true
_declspec(dllexport) HANDLE WINAPI ConnectOPC(LPCSTR MachineName, LPCSTR ServerName, BOOL EnableDLLBuffering);
其次,添加组
_declspec(dllexport) HANDLE WINAPI AddOPCGroup (HANDLE hConnect, LPCSTR Name