OPC服务访问方式+Python操作OPC读写数据,解决OPC服务不稳定的Bug(附安装包)

1 篇文章 0 订阅

运行环境:
python2.7+window server2008或2012+keep server
注意pywin32是否安装

一、opc服务访问方式

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

多个客户端单次请求的数据量不超过服务所能承受的负荷时,服务会正常运行,但是会阻塞,同时请求的效率会下降。具体的并发量没找到参考。

二、环境安装及使用
1、安装OpenOPC

下载 OpenOPC-1.3.1.win32-py2.7.exe 并安装
(管网下载链接:https://sourceforge.net/projects/openopc/files/)
( 百度云下载链接链接:https://pan.baidu.com/s/1JH7SwdbDl7EE1VVGnKrNug 提取码:v88c )

2、安装python包。
pip install Pywin32 
pip install Pyro
3、将OpenOPC安装目录下src文件夹下的OpenOPC.py复制到python安装目录下的Lib\site-packages目录下
4、修改环境变量:OPC_MODE = open
5、连接opc服务器
import OpenOPC							# 导入包
opc = OpenOPC.open_client('localhost)	# 生成OpenOPC实例(Open mode)
print opc.servers()						# 显示可连接的opc服务器
opc.connect('Matrikon.OPC.Simulation', 'localhost')
6、读取opc服务器数据
# 下方列表为opc服务下点表
taglist=['Channel_4.Device_6.Word_1','Channel_4.Device_6.Word_2',
	 'Channel_2.Device_3.Tag_1','Channel_2.Device_3.Tag_2',
         'Channel_2.Device_3.Tag_3','Channel_4.Device_5.Tag_1',
         'Channel_3.Device_4.Word_1','Channel_3.Device_4.Word_2',]
# 读取一系列数据
opc_datas = opc.read(taglist)
datas = [i[1] for i in opc_data]
# 读取一个点
opc_data = opc.read(taglist[0])
data = opc_data[1]
7、写入opc服务器
# 写入一个点
# 方式1
opc.write( ('Triangle Waves.Real8', 100.0) )
# 方式2
opc['Triangle Waves.Real8'] = 100.0

# 写入多个点
opc.write( [('Triangle Waves.Real4', 10.0), ('Random.String', 20.0)] )
8、其他
# 列出可获取的opc目录
>>> opc.list()
['Simulation Items', 'Configured Aliases']

>>> opc.list('Simulation Items')
['Bucket Brigade', 'Random', 'Read Error', 'Saw-toothed Waves', 'Square Waves', 'Triangle Waves', 'Write Error', 'Write Only']

# 模糊查询
>>> opc.list('Simulation Items.Random.*Real*')
['Random.ArrayOfReal8', 'Random.Real4', 'Random.Real8']

# opc服务器信息
>>> opc.info()
[('Host', 'localhost'), ('Server', 'Matrikon.OPC.Simulation'), ('State', 'Running'), ('Version', '1.1 (Build 307)'), ('Browser', 'Hierarchical'), ('Start Time', '06/24/07 13:50:54'), ('Current Time', '06/24/07 18:30:11'), ('Vendor', 'Matrikon Consulting Inc (780) 448-1010 http://www.matrikon.com')]

# 关闭opc连接,如果不关闭连接,会导致连接数满,无法进行新的连接,一般10min会自动释放。
opc.close()

PS:
我在爬取opc服务数据时,遇到个bug,就是爬取很不稳定,经过一段时间的观察,才定位到是低版本的keepserver本身有这个问题,当我升级到KeepServerEx 6,终于解决了不稳定的问题。
在这里插入图片描述

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈建华呦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值