本文章为原创,转载请注明出处
登陆地址,账号:test/123456
sdk地址
前言
为了应对标准化和跨平台的趋势,为了更好的推广OPC,OPC基金会近些年在之前OPC成功应用的基础上推出了一个新的OPC标准-OPC UA。OPC UA接口协议包含了之前的 A&E, DA,OPC XML DA or HDA,只使用一个地址空间就能访问之前所有的对象,而且不受WINDOWS平台限制,因为它是从传输层Scoket以上来定义的,这点后面会提到,导致了灵活性和安全性比之前的OPC都提升了。
驱动目的
· 老版本OPC工业程序在工业场景下实现自动化工作。迭代更替的今天,原使用的32位的OPC已逐渐被淘汰,但针对工业场景中有客户使用OPC进行工业场景自动化工作。所以在此,中台使用驱动与OPC UA 进行数据对接及自动化配置。
使用前提
工业场景下,opc ua是自动化使用过程,当然在使用场景下,中台和opc ua server 端进行对接。本文使用的是python3.7,依赖包是opcua
代码说明
1- 代码示例
#!coding:utf8
import json
import sys
sys.path.append("..")
from opcua import Client, ua
from driver import *
import time
class OPCua():
def __init__(self, _driver_instance):
self.driver_instance = _driver_instance
def datachange_notification(self, node, val, data):
print("Python: New data change event", val)
class TemplateDriver(IOTOSDriverI):
#1、通信初始化
def InitComm(self,attrs):
self.setPauseCollect(False)
self.setCollectingOneCircle(False)
self.online(True)
self.apartment = OPCua(self)
#这里将设备参数写上连接的server地址,这里硬件商或客户应知道opc ua的server地址
self.client = Client('{}'.format(self.sysAttrs['config']['param']['opcua']), timeout=10)
self.client.connect()
#2、采集引擎回调,可也可以开启,也可以直接注释掉(对于主动上报,不存在遍历采集的情况)
def Collecting(self, dataId):
try:
cfgtmp = self.data2attrs[dataId]['config']
# 过滤掉非采集的点,存在采集的node,则在param中的node写上ns;s或者其他参数
if cfgtmp["param"] == "" :
return ()
# 过滤采集点
if 'disabled' in cfgtmp['param'] and cfgtmp['param']['disabled'] == True:
return ()
else:
self.warn(self.name(dataId))
#读取采集点配置参数,这里可将采集点的时间周期缩短
node = cfgtmp['param']['node']
print(node)
#这里的ns是需要去opc ua 查看并填写内容的
dataId_num = self.client.get_node('{}={};{}={}'.format(cfgtmp['param']['nodeid_name'],cfgtmp['param']['nodeid'],cfgtmp['param']['node_name'],cfgtmp['param']['node']))
handler = self.apartment
sub = self.client.create_subscription(500, handler)
sub.subscribe_data_change(dataId_num)
ret_nu = dataId_num.get_value()
return (ret_nu,)
except Exception as e:
print(e)
#3、控制
#广播事件回调,其他操作访问
def Event_customBroadcast(self, fromUuid, type, data):
'''*************************************************
TODO
**************************************************'''
return json.dumps({'code':0, 'msg':'', 'data':''})
# 4、查询
# 查询事件回调,数据点查询访问
def Event_getData(self, dataId, condition):
'''*************************************************
TODO
**************************************************'''
return json.dumps({'code':0, 'msg':'', 'data':''})
# 5、控制事件回调,数据点控制访问
def Event_setData(self, dataId, value):
'''*************************************************
TODO
**************************************************'''
return json.dumps({'code':0, 'msg':'', 'data':''})
# 6、本地事件回调,数据点操作访问
def Event_syncPubMsg(self, point, value):
'''*************************************************
TODO
**************************************************'''
return json.dumps({'code':0, 'msg':'', 'data':''})
2- 模块说明
· Init
Init 函数负责中台与opc ua 服务器 进行连接
#1、通信初始化
def InitComm(self,attrs):
self.setPauseCollect(False)
self.setCollectingOneCircle(False)
self.online(True)
self.apartment = OPCua(self)
#这里将设备参数写上连接的server地址,这里硬件商或客户应知道opc ua的server地址
self.client = Client('{}'.format(self.sysAttrs['config']['param']['opcua']), timeout=10)
self.client.connect()
· Collecting
Collecting负责中台的循环数据点采集,通过中台的dataId 进行依次往复循环,
#2、采集引擎回调,可也可以开启,也可以直接注释掉(对于主动上报,不存在遍历采集的情况)
def Collecting(self, dataId):
try:
cfgtmp = self.data2attrs[dataId]['config']
# 过滤掉非采集的点,存在采集的node,则在param中的node写上ns;s或者其他参数
if cfgtmp["param"] == "" :
return ()
# 过滤采集点
if 'disabled' in cfgtmp['param'] and cfgtmp['param']['disabled'] == True:
return ()
else:
self.warn(self.name(dataId))
#读取采集点配置参数,这里可将采集点的时间周期缩短
node = cfgtmp['param']['node']
print(node)
#这里的ns是需要去opc ua 查看并填写内容的
dataId_num = self.client.get_node('{}={};{}={}'.format(cfgtmp['param']['nodeid_name'],cfgtmp['param']['nodeid'],cfgtmp['param']['node_name'],cfgtmp['param']['node']))
handler = self.apartment
sub = self.client.create_subscription(500, handler)
sub.subscribe_data_change(dataId_num)
ret_nu = dataId_num.get_value()
return (ret_nu,)
except Exception as e:
print(e)
3-中台配置模块
· 中台设备实例模块配置
· 数据点模块高级配置
注意,在这里的node节点可以在opc ua 的服务器上看见,截图如下,而这里都是一一对应的,就可以上传数据了