OPC客户端读取Server数据

在以前的文章中,我提到过在BCB中使用IOCOMP组件作为OPC客户端读取OPCServer的数据,程序写完之后,运行了一段时间出现了错误,就是读取的数据和Server端的数据不一致,原因在哪里我研究了很长的时间。又不得不从头查找OPC到底是什么?至于什么是OPC只要百度一下,答案不在少数。当然我先说明,我自己不是工控专业的,从来也没有接触过这个行业,这次是因为公司的业务上的需求接触到了,我也不想照抄其他人的解释了,有需要知道的,最好查一下,找个专业点的解释,(暂时相信权威吧),不过国外的网站上的说明还是很值得看的。我说说自己的理解,许多工业上的运行设备,尤其是大型设备,人们通常需要控制这些设备,还有在设备上安装一些采集器、传感器查看设备是否正常运行等等。这个过程中就产生大量的数据,OPC就是对这些数据采取统一的存取规范,并逐步成为工业标准,在国外有专门的OPC基金会维护管理这个标准。目前我所能体会到的他的好处是:如果设备距离办公环境较远,有了OPC就可以在自己的计算机上查看设备运行数据,不必到设备的运行现场查看,叫做远程控制,当然这个远程控制的设置,包括线路的部署又足可以成为一门学科了,(好在我不用碰到,但愿我永远别碰到,想想都很浩大的工程).
       下面说到重点了,在远程控制的计算机中OPCServer已经运行了, 如何取得数据,就是OPC客户端的编写,鉴于我有过了失败的经历,我很仔细的搜索了 OPC客户端的读取数据方式,简单的分为同步读取、异步读取(订阅也算是异步的一种吧)两种。国内的关于这方面的论文,看了不少,真正有价值的很少,而且每个和每个都差不多,唯一的区别就是结合自己的OPCServer的不同,以及编程方法的不同来说明,操作性还是很强的,能看明白过程,还是有很多的细节问题不清楚。
其中我看了 http://wenku.baidu.com/view/84fbe465783e0912a2162ad6.html 里面的OPC数据访问客户端的研究与实现。
http://wenku.baidu.com/view/da2ff918a8114431b90dd823.html  基于Visual C#的OPC客户端实现。
http://hi.baidu.com/knowtohow/item/22aabe30f6391cb8623aff5e  以及这篇博客:下面是对博客的引用:
OPC的数据访问方法分别有同步访问、异步访问和订阅式数据采集方式三种
1 同步数据访问方式
OPC服务器把按照OPC应用程序的要求得到的数据访问结果作为方法的参数返回给OPC应用程序,OPC应用程序在结果被返回之前必须处于等待状态。
同步访问特点为:读取指定OPC标签对应的过程数据时,应用程序一直要等到读取完为止;写入指定OPC标签对应的过程数据时,应用程序一直等待写入完成为止。当客户数据较少而且同服务器交互的数据量比较少的时候可以采用这种方式,然而当网络堵塞或大量客户访问时,会造成系统的性能效率下降。
2 异步数据访问方式
OPC服务器接到OPC应用程序的要求后,几乎立即将方法返回。OPC应用程序随后可以进行其他处理。当OPC服务器完成数据访问时,OPC服务器转换角色充当成客户程序,而原来的客户程序此时可以看成是服务器。OPC服务器主动触发OPC应用程序的异步访问完成事件,将数据访问结果传送给OPC应用程序。OPC应用程序在其事件处理程序中接收从OPC服务器传来的数据。
其特点为:读取指定OPC标签对应的过程数据,应用程序发出读取要求后立即返回,读取完成时发生读取完成事件,OPC应用程序被调用;写入指定OPC标签对应的过程数据,应用程序发出写入要求后立即返回,写入完成时发出写入完成事件,OPC应用程序被调用。因此异步方式的效率更高,能够避免多客户大数据请求的阻塞,并可以最大限度地节省CPU和网络资源。
3 订阅式数据访问方式
并不需要OPC客户应用程序向OPC服务器提出要求,而是服务器周期性地扫描缓冲区的数据,如果发现数据变化超过一定的幅度时,则更新数据缓冲器,并自动通知OPC应用程序。这样OPC客户应用程序就可以自动接到OPC服务器送来的变化通知的订阅方式数据采集(Subscription)。订阅式数据采集方式实际上也属于异步读取方式的一种。采用订阅式数据采集方式的服务器按一定的更新周期(UpdateRate)更新数据缓冲器的数值时,如果发现数据有变化时,就会以数据变化事件(DataChange)通知OPC应用程序。OPC服务器支持不敏感带(DeadBand),而且OPC标签的数据类型是模拟量的情况,只有当前值与前次值的差的绝对值超过一定的限度时,才更新缓冲器数据并通知OPC应用程序。由此可以无视模拟值的微小变化,从而减轻OPC服务器和OPC应用程序的负荷。

其特点为:服务器用一定的周期检查过程数据,发现数字数据变化或者模拟数据的变化范围超过不敏感区后,立刻通知客户程序,传递相应信息。订阅式技术基于“客户-服务器-硬件设备”模型,在服务器中的内部建立预定数据的动态缓存,并且当数据变化时对动态缓存给予刷新,并向订阅了这些数据的客户端发送。这使得网络上的请求包数大大减少,并有效降低了对服务器的重复访问次数。在数据点很多的情况下,这种通信方式的优势更能凸现出来。

按照这个说明,之前我用IOCOMP中ILabel控件所实现的读取应该是同步的,但是我的数据量是比较大的,有300多个,这就构成了我的客户端数据和服务器数据的不同步,在我发送请求给OPCServer之后,客户端只有等到所有数据被返回才能读取数据,在数据量大时是不可取的,我还有疑问的是:OPCserver端在读取所有数据的时候,客户端是在等待的,我所使用的ILabel控件也是刚开始读取准确,后来错误,但是也有数据,是不是就明确的是这个原因,我不得而知,没有这方面的资料。也许我还没有找到。
所以我认为最好的方法是采用订阅的,这个论文
http://www.doc88.com/p-744822831530.html OPC+客户端订阅式数据采集的实现和研究
对于我来说有些启发。说的比较清楚,其实是我能看懂。 看来什么事情想在不太清楚的情况下就解决,是一定会出错的,除非运气。即使时间短也不能躲过。从新开始了。

你可能感兴趣的:(Java)