参考:
- https://www.opc-router.com/what-is-opc-ua/#:~:text=In this context%2C the meaning of UA in,COM%2FDCOM to purely binary TCP%2FIP or alternatively SOAP.
- https://github.com/OPCFoundation/UA-.NETStandard
一. OPC介绍
OPC(OLE for Process Control)协议是一种用于工业自动化领域的数据交换标准,旨在解决不同设备和应用软件之间的互操作性问题。OPC协议由OPC基金会(OPC Foundation)开发和维护,最早在1996年推出。
OPC协议的主要特点
- 互操作性: 通过提供统一的接口,OPC协议允许不同厂商的硬件设备和软件应用能够互相通讯和数据交换。
- 标准化: OPC协议基于微软的OLE/COM技术(OLE for Process Control),后续版本也支持.NET和Web服务,确保了跨平台的兼容性。
- 扩展性: OPC标准不断发展,从最初的OPC DA(Data Access)扩展到OPC HDA(Historical Data Access)、OPC A&E(Alarms & Events)、OPC UA(Unified Architecture)等多个子标准。
OPC协议的主要版本
- OPC DA(Data Access): 最早的OPC标准,用于实时数据的访问和交换,主要应用于获取传感器数据、控制设备状态等。
- OPC HDA(Historical Data Access): 提供历史数据的访问,适用于需要长期数据存储和分析的应用场景。
- OPC A&E(Alarms & Events): 用于报警和事件管理,支持事件的订阅、过滤和处理。
- OPC UA(Unified Architecture): 统一架构,支持跨平台和更高层次的安全性,提供更灵活和强大的数据建模和传输功能。OPC UA不再依赖微软的COM/DCOM技术,而是基于独立于平台的协议栈,如TCP/IP、HTTP和WebSocket。
应用领域
OPC协议广泛应用于制造业、能源、化工、交通等各个工业领域,主要用于:
- 监控和数据采集(SCADA系统)
- 分布式控制系统(DCS)
- 工业物联网(IIoT)
- 企业资源计划(ERP)和制造执行系统(MES)的数据集成
通过OPC协议,企业可以实现不同系统之间的数据共享和集成,提高生产效率和数据利用率。
OPC Server & Client
在OPC(OLE for Process Control)协议中,服务端和客户端的角色和功能是明确区分的。了解这两者的职责和交互方式是掌握OPC技术的关键。
OPC服务端(OPC Server)
功能
- 数据采集:OPC服务端连接到各种工业设备(如PLC、DCS、传感器等),采集实时数据。
- 数据管理:服务端负责管理和提供访问数据的接口,包括实时数据、历史数据、报警和事件等。
- 数据处理:处理来自客户端的请求,如读写操作、订阅数据变化等。
- 协议转换:将设备专用协议转换为OPC标准协议,提供统一的数据访问接口。
主要职责
- 数据源连接:与底层设备进行通讯并采集数据。
- 数据存储:管理数据的存储和检索,包括实时数据和历史数据。
- 数据发布:向客户端提供数据访问和订阅服务。
OPC客户端(OPC Client)
功能
- 数据访问:连接到一个或多个OPC服务端,读取实时数据或历史数据。
- 数据写入:向OPC服务端发送数据写入请求,控制设备或改变设备状态。
- 事件处理:订阅和处理来自OPC服务端的报警和事件信息。
- 数据显示和分析:将从服务端获取的数据进行处理、显示和分析,用于用户界面或进一步的应用。
主要职责
- 数据读取:从服务端读取实时数据、历史数据或事件数据。
- 数据写入:向服务端发送写入请求,修改设备状态或参数。
- 数据订阅:订阅特定数据项的变化,实时获取更新的数据。
- 数据处理:对获取的数据进行处理和分析,用于监控、控制或其他应用。
客户端与服务端的交互
- 连接建立:客户端通过网络连接到服务端,建立通讯通道。
- 数据请求:
- 读取请求:客户端向服务端发送数据读取请求,服务端返回相应的数据。
- 写入请求:客户端向服务端发送数据写入请求,服务端执行写入操作并返回结果。
- 订阅/取消订阅:客户端可以订阅特定数据项的变化,服务端在数据变化时通知客户端。
- 事件通知:服务端可以主动向客户端发送报警和事件通知,客户端接收并处理这些通知。
- 断开连接:通讯结束后,客户端与服务端断开连接。
二. OPCUA介绍
OPC UA(OPC Unified Architecture)是OPC基金会推出的新一代工业自动化通信标准,旨在解决传统OPC标准(如OPC DA、HDA、A&E)中的局限性,并提供更强大的功能和更广泛的适用性。OPC UA不仅支持传统的Windows平台,还支持跨平台运行,包括Linux、macOS和嵌入式系统。
OPC UA的主要特点
-
跨平台支持:OPC UA不再依赖于微软的COM/DCOM技术,而是基于平台无关的通信协议(如TCP/IP、HTTP和WebSocket),使其能够在各种操作系统和硬件平台上运行。
-
安全性:内置了全面的安全机制,包括用户认证、授权、加密和数据完整性检查,确保数据传输的安全性和可靠性。
-
可扩展性:支持复杂的数据建模和对象管理,可以适应多种工业应用场景。OPC UA允许用户定义自定义的数据类型和对象模型,以满足特定的应用需求。
-
统一架构:整合了OPC DA、HDA和A&E的功能,提供统一的数据访问接口,简化了系统集成和开发。
-
灵活的通信方式:支持多种通信模式,包括客户端/服务器模式和发布/订阅模式,适应不同的应用需求。
OPC UA的架构
OPC UA的架构可以分为以下几个层次:
-
传输层:定义了各种通信协议(如TCP/IP、HTTP、MQTT)和传输方式,确保数据可以在不同网络环境中可靠传输。
-
安全层:提供认证、授权、加密和数据完整性检查等安全功能,保护数据免受未授权访问和篡改。
-
服务层:定义了各种服务接口,如会话管理、浏览、读写、订阅等,用于客户端和服务端之间的交互。
-
信息模型层:支持复杂的数据建模和对象管理,可以定义层次化的对象、属性、方法和事件,使数据表示更加直观和结构化。
OPC UA的关键功能
-
会话管理:客户端与服务端之间建立和管理会话,支持长时间连接和状态保持。
-
浏览服务:允许客户端浏览服务端的地址空间,发现可用的节点和数据项。
-
读写服务:支持读取和写入服务端的数据,适用于实时数据访问和控制。
-
订阅和监控服务:客户端可以订阅特定的数据项,服务端在数据变化时主动通知客户端,适用于实时数据监控和报警处理。
-
历史数据访问:支持访问服务端存储的历史数据,适用于数据分析和报表生成。
-
方法调用:支持在服务端执行预定义的方法,适用于远程控制和操作。
三. OPCUA的应用
OPCUA的信息模型
OPC UA 信息模型是节点的网络(Network of Node),或者称为结构化图(Graph),由节点(Node)和引用(Reference)组成,这种结构图称之为 OPC UA 的地址空间。地址空间以标准形式表示对象——地址空间中的模型元素被称为节点,对象及其组件在地址空间中表示为节点的集合,节点由属性描述并由引用相连接。OPC UA 建模其实就是建立节点以及节点间的引用。
对象模型
OPC UA 使用了对象作为过程系统表示数据和活动的基础。对象包含了变量,事件和方法,它们通过引用来互相连接。
节点模型
- 属性(Attribute)用于描述节点,不同的节点类有不同的属性(属性集合)。节点类的定义中包括属性的定义,因此地址空间中不包括属性。
- 引用(Reference)表示节点之间的关系。引用被定义为引用类型节点的实例,存在于地址空间中。
引用模型
包含引用的节点为源节点,被引用的节点称目标节点。引用的目标节点可以与源节点在同一个地址空间,也可以在另一个 OPC 服务器的地址空间,甚至是目标节点可以不存在。
节点类型
在 OPC UA 中,最重要的节点类别是对象,变量和方法。
- 对象节点,对象节点用于构成地址空间,不包含数据,使用变量为对象公开数值,对象节点可用于分组管理对象,变量或方法(变量和方法总属于一个对象)。
- 变量节点,变量节点代表一个值,值的数据类型取决于变量,客户端可以对值进行读写和订阅。
- 方法节点,方法节点代表服务器中一个有客户端调用并返回结果的方法,输入参数和输出结果以变量的形式作为方法节点的组成部分,客户端指定输入参数,调用后获得输出结果。
OPC UA 协议的工作原理
硬件供应商支持 OPC UA 的方式有两种:在设备中嵌入 OPC UA 服务器,或在 PC 上提供软件,通过专用协议获取数据,并通过 OPC UA 将其公开给其他平台。一些中端和高端 PLC(如西门子 S71200/1500) 集成了 OPC UA 服务器,同时西门子还提供 WINCC 等软件,通过 OPC/OPC UA 间接向第三方提供来自其他设备的数据。
数据通过 OPC UA 服务器公开后,可使用 OPC UA 协议规定的两种访问模式——请求/响应模式和发布/订阅模式进行访问。首先,客户端必须与服务器建立连接,连接建立后会在客户端和服务器之间创建一个会话通道。
在请求/响应模式下,客户端应用程序可以通过会话通道向服务器请求一些标准服务,如:从节点读取原始数据、向节点写入数据、调用远程方法等。
在发布/订阅模式下,每个客户端可以创建任意数量的服务器订阅,当服务器的节点数据发生变化时,通知消息会立即推送到客户端。
一般来说,终端用户不必关注上述过程。他们只需要关心 OPC UA 服务器地址、用户登录策略、通信安全策略以及数据的访问地址。
OPC UA的编程
要实现一个简单的OPC UA编程实例,通常你会使用一个OPC UA客户端库和一个服务器库。在这个示例中,我们将使用Python编程语言和python-opcua
库来实现一个基本的OPC UA客户端和服务器。
安装库
首先,需要安装python-opcua
库:
pip install opcua
创建OPC UA服务器
以下是一个简单的OPC UA服务器示例,它创建了一个服务器并添加了一个简单的变量节点:
from opcua import ua, Server
import time
# 创建服务器对象
server = Server()
# 设置服务器端点(URL)
server.set_endpoint("opc.tcp://localhost:4840/freeopcua/server/")
# 添加命名空间
uri = "http://examples.freeopcua.github.io"
idx = server.register_namespace(uri)
# 获取服务器对象节点
objects = server.get_objects_node()
# 在对象节点下添加一个新的对象
myobj = objects.add_object(idx, "MyObject")
# 添加变量到对象中
myvar = myobj.add_variable(idx, "MyVariable", 6.7)
# 设置变量为可写
myvar.set_writable()
# 启动服务器
server.start()
try:
print("OPC UA 服务器已启动")
while True:
# 更新变量值
time.sleep(1)
new_value = myvar.get_value() + 0.1
myvar.set_value(new_value)
except KeyboardInterrupt:
print("关闭服务器")
server.stop()
这个示例创建了一个OPC UA服务器,在端点opc.tcp://localhost:4840/freeopcua/server/
上运行,并添加了一个命名空间和一个简单的变量节点。
创建OPC UA客户端
以下是一个简单的OPC UA客户端示例,它连接到上述服务器并读取变量的值:
from opcua import Client
# 连接到服务器
client = Client("opc.tcp://localhost:4840/freeopcua/server/")
try:
client.connect()
# 获取对象节点
root = client.get_root_node()
print("Root node is: ", root)
# 找到我们之前创建的变量节点
obj = root.get_child(["0:Objects", "2:MyObject"])
var = obj.get_child("2:MyVariable")
# 读取变量值
while True:
value = var.get_value()
print("Variable value: ", value)
time.sleep(1)
finally:
client.disconnect()
这个客户端连接到服务器,并循环读取变量MyVariable
的值并打印出来。