本小节主要介绍了OPC DA到OPC UA之间的关系,更多详细的信息参考OPC基金会官网。首先,我们使用 python-opcua 组件模拟构建一个Tank4C9的反应罐OPC UA服务器,然后,演示OPC UA的Objects是如何构建的。最后,展示opcua-client连接这个OPCUA服务器并订阅数据变化是如何的显示效果。下一节我们将用演示监控如何迁移到OPC UA数据通信协议。
前面章节我们采用OPC作为设备到上位的信息交互的协议,本章我们介绍跨平台的
OPC UA
。OPC作为早期的工业通信规范,是基于
COM/DCOM
的技术实现的,用于设备和软件之间交换数据,最初,
OPC
标准仅限于
Windows
操作系统。
OPC
是
OLE for Process Control
的缩写(中文意思:用于过程控制的
OLE
)。
OPC规范包括了
3
大部分:
OPC DA:
OPC
实时数据访问规范,定义了包括数据值,更新时间与数据品质信息的相关标准。前面实战2我们使用openOPC获取的
tag
位号值就属于
OPC DA
,通过
OPC DA
读取底层设备的状态、工业参数等位号的实时数据。
OPC HDA:
OPC
历史数据访问规范,定义了查询、分析历史数据和含有时标的数据的方法。
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规范时的目标:
功能对等性:所有
COM OPC Classic规范都映射到UA
平台独立性:从嵌入式微控制器到基于云的基础设施
安全性:信息加密、身份验证和审核
可扩展性:添加新功能而不影响现有应用程序的能力
综合信息建模:用于定义复杂信息
2.
OPC UA
相对于传统
OPC
的变化
功能对等性
OPC UA不仅支持传统OPC的所有功能,更支持更多新的功能:
发现:在本地
PC和/或网络上查找可用的OPC服务器
地址空间:所有数据都是分层表示的(例如文件和文件夹),允许
OPC客户端发现、利用简单和复杂的数据结构
按需:基于访问权限读取和写入数据
/信息
订阅:监视数据
/信息,并且当值变化超出客户端的设定时报告异常
事件:基于客户端的设定通知重要信息
方法:客户端可以基于在服务器上定义的方法来执行程序等
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
上最新的服务端代码再来看看效果。
在
C:\Python\Python36-32\Scripts\
下创建
examples
目录;
Copy opcua
源码下的
server-minimal.py
到
C:\Python\Python36-32\Scripts\examples
;
在
C:\Python\Python36-32
目录下运行命令,如下图:
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数据通信协议。