【Python】使用OPC UA创建数据服务器

目录

在工业自动化和物联网(IoT)领域,OPC UA(开放平台通信统一架构)已经成为一种广泛采用的数据交换标准。它提供了一种安全、可靠且独立于平台的方式来访问实时数据。在本文中,我们将探讨如何使用Python和OPC UA库来创建一个高效的数据服务器,该服务器能够从CSV文件读取数据,并允许OPC UA客户端访问这些数据。

准备工作

首先,确保你已经安装了opcua库。如果没有安装,可以使用pip进行安装:

bash 复制代码
pip install opcua

服务器设置

我们将创建一个简单的OPC UA服务器,它将从CSV示例文件(下载)中读取数据,并将这些数据作为OPC UA节点上的变量公开。

python 复制代码
from opcua import Server, ua, uamethod
CSV_FILE = "opcua_data.csv"
SERVER_URL = "opc.tcp://0.0.0.0:4840/"
# 创建服务器实例
server = Server()
# 设置服务器端口
server.set_endpoint(SERVER_URL)
# 创建一个命名空间
uri = "http://opcua.simulator.com"
idx = server.register_namespace(uri)
# 获取对象节点,它通常是根节点的第一个孩子
objects = server.get_objects_node()
node_dict = {}

创建或获取节点

为了管理服务器中的节点,我们定义了一个帮助函数get_or_create_node,它将根据需要创建新的节点或返回已存在的节点。

python 复制代码
def get_or_create_node(parent, node_name, value):
    children = parent.get_children()
    for child in children:
        if child.get_browse_name().Name == node_name:
            return child  # 返回已存在的节点
    # 如果节点不存在,创建它
    return parent.add_variable(idx, node_name, ua.Variant(value, ua.VariantType.String))

设置节点值

我们还需要一个函数来更新节点的值。这个函数将确保节点的值是最新的,并且反映了CSV文件中的数据。

python 复制代码
def set_node_value(node_path, value):
    try:
        if node_path.startswith("/Server/"):
            return
        if node_path not in node_dict:
            parent = objects
            parts = node_path.split("/")
            for part in parts[:-1]:
                if part == "":
                    continue
                parent = get_or_create_node(parent, part, value)
            last_node_name = parts[-1]
            node_dict[node_path] = get_or_create_node(parent, last_node_name, value)
        node_dict[node_path].set_value(ua.Variant(value, ua.VariantType.String))
    except Exception as e:
        print(f"Error setting node value: {e}")

启动服务器

最后,我们将启动服务器,并让它在一个无限循环中不断更新节点的值。

python 复制代码
# 启动服务器
try:
    server.start()
    # 启动服务器
    print("Server started at opc.tcp://0.0.0.0:4840/")
    # 每秒读取csv中的一行,更新节点值
    with open(CSV_FILE, "r") as csvfile:
        csvreader = csv.reader(csvfile)
        header = next(csvreader)
        while True:
            try:
                row = next(csvreader)
                for i in range(len(header)):
                    set_node_value(header[i], row[i])
                time.sleep(1)
            except StopIteration:
                csvfile.seek(0)  # 回到文件开头
                next(csvreader)  # 跳过表头
finally:
    server.stop()

查看服务器

可以使用 UA Sample Client (下载链接)软件连接到创建的opcua服务器查看结构和数据。

数据监控:

客户端

【Python】OPC UA 服务器与客户端的实现

总结

通过使用Python和OPC UA库,我们创建了一个能够从CSV文件读取数据并将其作为OPC UA节点值提供的服务器。这种方法在工业数据集成和监控应用中非常有用,因为它允许不同系统和设备之间进行标准化和安全的数据交换。

相关推荐
FreakStudio1 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
丶21361 小时前
【CUDA】【PyTorch】安装 PyTorch 与 CUDA 11.7 的详细步骤
人工智能·pytorch·python
_.Switch2 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一个闪现必杀技2 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
小鹿( ﹡ˆoˆ﹡ )2 小时前
探索IP协议的神秘面纱:Python中的网络通信
python·tcp/ip·php
卷心菜小温3 小时前
【BUG】P-tuningv2微调ChatGLM2-6B时所踩的坑
python·深度学习·语言模型·nlp·bug
韩楚风3 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学3 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
唐家小妹3 小时前
介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
python·pyqt
Pythonliu73 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器