前面章节我们采用OPC作为设备到上位的信息交互的协议,本章我们介绍跨平台的OPC UA。OPC作为早期的工业通信规范,是基于COM/DCOM的技术实现的,用于设备和软件之间交换数据,最初,OPC标准仅限于Windows操作系统。OPC是OLE for Process Control的缩写(中文意思:用于过程控制的OLE)。

OPC规范包括了3大部分:

  1. OPC DA:OPC实时数据访问规范,定义了包括数据值,更新时间与数据品质信息的相关标准。前面实战2我们使用openOPC获取的tag位号值就属于OPC DA,通过OPC DA读取底层设备的状态、工业参数等位号的实时数据。
  2. OPC HDA:OPC历史数据访问规范,定义了查询、分析历史数据和含有时标的数据的方法。
  3. OPC AE:OPC报警事件访问规范,定义了报警与时间类型的消息类信息,以及状态变化管理等相关标准。

由于基于COM/DCOM的技术有着不能跨平台的根本缺点,随着技术的发展,OPC基金会在2008年发布了新的规范:OPC UA (OPC Unified Architecture)OPC 统一框架。

1. OPC UA是什么

  2008年发布的OPC统一架构(UA)将各个OPC Classic规范的所有功能集成到一个可扩展的框架中,独立于平台并且面向服务。OPC UA规范不再是基于COM/DCOM技术,因此OPC UA不仅能在Windows平台上实现,更可以在Linux,以及其它的嵌入式平台中实现。

这种多层方法实现了最初设计UA规范时的目标:

  1. 功能对等性:所有COM OPC Classic规范都映射到UA
  2. 平台独立性:从嵌入式微控制器到基于云的基础设施
  3. 安全性:信息加密、身份验证和审核
  4. 可扩展性:添加新功能而不影响现有应用程序的能力
  5. 综合信息建模:用于定义复杂信息

2. OPC UA相对于传统OPC的变化

功能对等性

OPC UA不仅支持传统OPC的所有功能,更支持更多新的功能:

  1. 发现:在本地PC和/或网络上查找可用的OPC服务器
  2. 地址空间:所有数据都是分层表示的(例如文件和文件夹),允许OPC客户端发现、利用简单和复杂的数据结构
  3. 按需:基于访问权限读取和写入数据/信息
  4. 订阅:监视数据/信息,并且当值变化超出客户端的设定时报告异常
  5. 事件:基于客户端的设定通知重要信息
  6. 方法:客户端可以基于在服务器上定义的方法来执行程序等
  7. OPC UA产品和OPC Classic产品之间的集成可以通过COM/Proxy Wrappers轻松实现。

平台独立性

  鉴于市场上有各种各样的硬件平台和操作系统,平台独立性就显得至关重要。OPC UA包含但不限于以下平台及系统:

  硬件平台:传统PC硬件、云服务器、PLC、微控制器(ARM等)

  操作系统:Microsoft Windows、Apple OSX、Android或任何Linux发行版本等

  OPC UA为企业之间的互操作性提供必要的M2M、M2E及两者之间的基础架构。

安全性

  最大的变化是OPC UA可以通过任何单一端口(经管理员开放后)进行通信,这使得OPC通信不再会由于防火墙受到大量的限制,实现Internet 通讯。

综合信息建模

  OPC UA信息建模框架将数据转换为信息。通过完全面向对象的功能,即使是最复杂的多级结构也可以建模和扩展。数据类型和结构在配置文件中定义。 例如,现有的OPC Classic规范被建模为UA配置文件,也可以由其他组织扩展:

  更详细的内容请参阅OPC基金会官网:http://opcfoundation.cn/

3. 安装python-opcua组件

  pip安装:pip install opcua

  组件按照完毕后,我们可以在python环境执行uadiscover命令查看效果:

  由于运行电脑上没有运行的opcua服务端,命令没有发现任何opcua服务。下面通过运行opcua上最新的服务端代码再来看看效果。

  1. 在C:\Python\Python36-32\Scripts\下创建examples目录;
  2. Copy opcua源码下的server-minimal.py到C:\Python\Python36-32\Scripts\examples;
  3. 在C:\Python\Python36-32目录下运行命令,如下图:
  4. python C:\Python\Python36-32\Scripts\examples\server-minimal.py

  重新运行uadiscover命令,结果如下:

  现在连接到 OPCUA Sever 的模拟器提供的 OPC UA 服务了。

4. 创建一个4C9反应罐的OPCUA Server模拟器

4.1. 在Solution上添加一个Python Application Project  Tank4C9Svr

  打开Tank4C9Svr.py文件,修改Example里的server-minimal.py文件里代码,模拟4C9反应罐如下:

import sys
sys.path.insert(0, "..")
import time
import random from opcua import ua, Server if __name__ == "__main__": # setup our server
server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/") # setup our own namespace, not really necessary but should as spec
uri = "http://examples.freeopcua.github.io"
idx = server.register_namespace(uri) # get Objects node, this is where we should put our nodes
objects = server.get_objects_node() # populating our address space
myobj = objects.add_object(idx, "Tank4C9")
status = myobj.add_variable(idx, "Status", 0)
overheadFlow = myobj.add_variable(idx, "OverheadFlow", 0)
buttomsFlow = myobj.add_variable(idx, "ButtomsFlow", 0)
power = myobj.add_variable(idx, "Power", 0) #myVar.set_writable() # Set MyVariable to be writable by clients # starting!
server.start() try:
count = 0
while True:
time.sleep(5)
count = count + 1
print(count%4)
if count%4>0:
status.set_value(1)
else:
status.set_value(0) a= random.randint(100,500)
print("OverheadFlow:"+str(a))
overheadFlow.set_value(a)
buttomsFlow.set_value(random.randint(50,500))
power.set_value(random.randint(1000,5000))
finally:
#close connection, remove subcsriptions, etc
server.stop()

  我们把Tank4C9Svr设置成solution默认启动项目后,F5调试运行Tank4C9Svr,如下图:

5. opcua-client浏览4C9 opcua服务器

  安装:pip install opcua-client

  cmd窗口C:\Python\Python36-32\Scripts目录下执行opcua-client.exe命令,如下图:

  地址栏输入 opc.tcp://localhost:4840 点击连接按钮,就能看见我们构建的Tank4C9设备和对于的tag变量了,如下图:

  我们可以在变量上右键来订阅数据变化的读取最新的数据值。

6. 小结

  本小节主要介绍了OPC DA到OPC UA之间的关系,更多详细的信息参考OPC基金会官网。首先,我们使用 python-opcua 组件模拟构建一个Tank4C9的反应罐OPC UA服务器,然后,演示OPC UA的Objects是如何构建的。最后,展示opcua-client连接这个OPCUA服务器并订阅数据变化是如何的显示效果。下一节我们将用演示监控如何迁移到OPC UA数据通信协议。

python工业互联网监控项目实战4—python opcua的更多相关文章

  1. python工业互联网监控项目实战5—Collector到opcua服务

    本小节演示项目是如何从连接器到获取Tank4C9服务上的设备对象的值,并通过Connector服务的url返回给UI端请求的.另外,实际项目中考虑websocket中间可能因为网络通信等原因出现中断情 ...

  2. python工业互联网监控项目实战2—OPC

    OPC(OLE for Process Control)定义:指为了给工业控制系统应用程序之间的通信建立一个接口标准,在工业控制设备与控制软件之间建立统一的数据存取规范.它给工业控制领域提供了一种标准 ...

  3. Python工业互联网监控项目实战3—websocket to UI

    本小节继续演示如何在Django项目中采用早期websocket技术原型来实现把OPC服务端数据实时推送到UI端,让监控页面在另一种技术方式下,实时显示现场设备的工艺数据变化情况.本例我们仍然采用比较 ...

  4. Python爬虫开发与项目实战

    Python爬虫开发与项目实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1MFexF6S4No_FtC5U2GCKqQ 提取码:gtz1 复制这段内容后打开百度 ...

  5. H2O中的随机森林算法介绍及其项目实战(python实现)

    H2O中的随机森林算法介绍及其项目实战(python实现) 包的引入:from h2o.estimators.random_forest import H2ORandomForestEstimator ...

  6. Python爬虫开发与项目实战pdf电子书|网盘链接带提取码直接提取|

    Python爬虫开发与项目实战从基本的爬虫原理开始讲解,通过介绍Pthyon编程语言与HTML基础知识引领读者入门,之后根据当前风起云涌的云计算.大数据热潮,重点讲述了云计算的相关内容及其在爬虫中的应 ...

  7. python工业互联网应用实战2—从需求开始

    前言:随着国家工业2025战略的推进,工业互联网发展将会提速,将迎来一个新的发展时期,越来越多的企业开始逐步的把产线自动化,去年年底投产的小米亦庄的智能工厂就是一个热议的新闻.小米/华为智能工厂只能说 ...

  8. python工业互联网应用实战3—模型层构建

    本章开始我们正式进入到实战项目开发过程,如何从需求分析获得的实体数据转到模型设计中来,变成Django项目中得模型层.当然,第一步还是在VS2019 IDE环境重创建一个工程项目,本文我们把工程名称命 ...

  9. Python不能用于大型项目?关于Python的10大误解

     语言多元化是PayPal编程文化中一个重要的组成部分.在C++和Java长期流行的同时,更多的团队选择了Jva和Scala.同时,Braintree的收购也引入了一个久经世故的Ruby社区.Pyt ...

随机推荐

  1. 多伦多大学&NVIDIA最新成果:图像标注速度提升10倍!

    图像标注速度提升10倍! 这是多伦多大学与英伟达联合公布的一项最新研究:Curve-GCN的应用结果. Curve-GCN是一种高效交互式图像标注方法,其性能优于Polygon-RNN++.在自动模式 ...

  2. 使用webhooks进行代码的自动化部署

    AutoMaticDeployment---自动部署 项目简介 使用Github的webhooks进行代码的自动化部署 本项目是个人最近搞的一个小工具,自己最近在用hexo部署个人博客(地址:http ...

  3. POJ-3134-Power Calculus(迭代加深)

    题意:输入一个n,问x从1次方开始,到n次方 ,可以乘或除已经计算出来的数 ,最少需要执行多少步? 思路:迭代加深 ,深度从0开始 ,直到返回值为真. 在深搜过程中剪枝(深度的判断 ,当前最大值尽全力 ...

  4. Prism 源码解读6-事件聚合

    0 介绍 事件提供的是1对多的绑定,通过委托链实现对订阅者的调用,事件必须要通过发布者调用.同时事件订阅是强引用,事件订阅者的生命周期总是大于等于事件发布者.如果代码中事件很多就会充斥着各种事件的订阅 ...

  5. 安装 MySQL 过程记录

    最近安装 MySQL 时 遇到了许多问题,记录一下安装过程以及遇到的问题. 第一步:在官网上下载适合自己版本的 MySQL,我选择的是 Windows 64 位免安装版的:    官网地址:https ...

  6. Django-使用 include() 配置 URL

    如果项目非常庞大,应用非常多,应用的 URL 都写在根 urls.py 配置文件中的话,会显的非常杂乱,还会出现名称冲突之类的问题,这样对开发整个项目是非常不利的. 可以这样解决,把每个应用的 URL ...

  7. Python面向对象之异常处理

    1:什么是异常 异常就是在我们的程序在运行过程中由于某种错误而引发Python抛出的错误: 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序 ...

  8. implements Serializable

    implements Serializable 1. 序列化和反序列化 序列化: 把对象转换为字节序列的过程称为对象的序列化. 反序列化: 把字节序列恢复为对象的过程称为对象的反序列化. 在Java和 ...

  9. 1021 Deepest Root (25 分)

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  10. mysql物理结构

    MySQL是通过文件系统对数据和索引进行存储的. MySQL从物理结构上可以分为日志文件和数据索引文件. MySQL在Linux中的数据索引文件和日志文件都在/var/lib/mysql目录下. 日志 ...