IOTOS物联中台OPC UA驱动开发实例


登陆地址,账号: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 的服务器上看见,截图如下,而这里都是一一对应的,就可以上传数据了

在这里插入图片描述

      4-运行脚本结果示意

在这里插入图片描述

      5-中台数据截图

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IOTOS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值