【Python】OPC UA模拟服务器实现

目录

      • 服务器模拟
        • 1. 环境准备
        • 2. 服务器设置
        • 3. 服务器初始化
        • 4. 节点操作
        • 5. 读取CSV文件
        • 6. 运行服务器
      • 查看服务器
      • 客户端
      • 总结

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

服务器模拟

1. 环境准备

确保您的Python环境中已安装opcua库。如果未安装,请使用以下命令进行安装:

pip install opcua

导入python库

import argparse
import csv
import time
from typing import List
from opcua import Server, Node, ua
2. 服务器设置

首先,我们定义命令行参数来配置服务器地址、端口和数据源路径。

parser = argparse.ArgumentParser(description="OPCUA模拟服务器")# 添加参数
parser.add_argument("--ip", "-i", default="0.0.0.0", help="服务器地址")
parser.add_argument("--port", "-p", default=4840, type=int, help="服务器端口")
parser.add_argument("--source", "-s", default="opcua_data.csv", help="数据源路径")
parser.add_argument("--type", "-t", default="fanuc", help="模拟类型")
# 解析命令行参数
args = parser.parse_args()CSV_FILE = args.source
SERVER_URL = "opc.tcp://" + str(args.ip) + ":" + str(args.port)
SERVER_TYPE: str = args.type

参数:
在这里插入图片描述

3. 服务器初始化

接着,我们初始化OPC UA服务器,并设置命名空间。

# 创建服务器实例
server = Server()
# 设置服务器端口
server.set_endpoint(SERVER_URL)
# 创建一个命名空间
uri = "http://opcua.simulator.com"
idx = server.register_namespace(uri)
4. 节点操作

定义函数来处理节点信息,并添加或更新节点。

# 获取对象节点,它通常是根节点的第一个孩子
objects = server.get_objects_node()
node_cache_dict = {}def get_node_dict(node_info: str):pairs = node_info.split(";")if len(pairs) <= 1:return {"ns": idx, "s": node_info}data = {}for pair in pairs:key, value = pair.split("=")data[key] = valuereturn datadef add_node(parent: Node, node_name, value, node_dict: dict, node_type="obj"):node_path = node_dict.get("s")node_ns = node_dict.get("ns")node_id = node_dict.get("i")# 检查节点是否已经存在children: List[Node] = parent.get_children()for child in children:browse_name: ua.QualifiedName = child.get_browse_name()if browse_name.Name == node_name:return child  # 返回已存在的节点# 如果节点不存在,创建它if node_type == "var":if SERVER_TYPE.upper() == "FANUC":node_idx = f"ns={node_ns};i={node_id}" if node_id else idxelse:node_idx = f"ns={node_ns};s={node_path}"new_node = parent.add_variable(node_idx, node_name, str(value))else:new_node: Node = parent.add_object(idx, node_name)# new_node.set_writable()  # 设置变量为可写return new_nodedef set_node_value(node_info: str, value):node_dict = get_node_dict(node_info)node_path: str = node_dict.get("s")if node_path.startswith("/Server/"):returntry:last_node: Node = node_cache_dict.get(node_path)if last_node is None:# 递归查找或创建节点parent = objectsparts = node_path.split("/")for part in parts[:-1]:  # 遍历除了最后一个节点的所有节点if part == "":continueparent = add_node(parent, part, value, node_dict)  # 创建节点(如果不存在)# 设置或更新最后一个节点的值last_node_name = parts[-1]last_node = add_node(parent, last_node_name, value, node_dict, "var")node_cache_dict[node_path] = last_nodelast_node.set_value(str(value))except Exception as e:print(f"Error setting node value: {e}")
5. 读取CSV文件

使用csv模块读取CSV文件,并更新OPC UA节点的值。

csv.field_size_limit(500 * 1024 * 1024)try:with open(CSV_FILE, "r") as csvfile:csvreader = csv.reader(csvfile)header = next(csvreader)row = next(csvreader)for i in range(len(header)):set_node_value(header[i], row[i])  # 首次创建节点server.start()  # 启动服务器(先创建结构再启动server)print(f"Server started at {SERVER_URL}")# 每秒读取csv中的一行,更新节点值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() if server else None
6. 运行服务器

执行脚本,服务器将启动,并开始从CSV文件读取数据更新OPC UA节点。

python opcua_simulator.py --ip 0.0.0.0 --port 4840 --source opcua_data.csv

查看服务器

可以使用 UA Sample Client (下载链接)软件连接到创建的opcua服务器查看结构和数据。
在这里插入图片描述
数据监控:
请添加图片描述

客户端

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

总结

 本文介绍了如何使用Python和OPC UA库创建一个模拟服务器。通过读取CSV文件,服务器能够动态更新OPC UA节点的值,这对于开发和测试OPC UA客户端应用程序非常有用。您可以按照上述步骤进行实践,并根据具体需求调整代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单链表的基本操作实现:初始化、尾插法、头插法、输出单链表、求表长、按序号查找、按值查找、插入结点、删除结点。

1.参考学习博文&#xff08;写的相当好的文章&#xff09;&#xff1a; http://t.csdnimg.cn/AipNl 2.关于我的总结&#xff1a; 定义单链表&#xff1a; typedef struct LNode {Elemtype data;struct LNode* next; }LNode; data用来存放元素值&#xff0c;next用来指向后…

【算法】反转链表

本题来源---《反转链表》 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输…

医学图像三维重建与可视化系统 医学图像分割 区域增长

医学图像的三维重建与可视化&#xff0c;这是一个非常有趣且具有挑战性的课题&#xff01;在这样的项目中&#xff0c;可以探索不同的医学图像技术&#xff0c;比如MRI、CT扫描等&#xff0c;然后利用这些图像数据进行三维重建&#xff0c;并将其可视化以供医生或研究人员使用。…

C++中的继承与多态

一、继承&#xff1a; 1.什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象…

golang map总结

目录 概述 一、哈希表原理 哈希函数 哈希表和哈希函数的关系 哈希表的优势 哈希冲突 什么是哈希冲突 如何处理哈希冲突 链表法 开放寻址法 哈希表常见操作过程 存储数据 检索数据 删除数据 常用的哈希算法 哈希表的应用场景 二、golang map map的内部结构 h…

Docker Volume (存储卷)

什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上…

选课成绩管理系统

文章目录 员工管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;&#xff09; 员工管理系统 一、项目演示 课程管理系统 二、项目介绍 基于springbootvue的前后端分离选课成绩管理系统 该系统可做课程管理…

基础算法之二分算法

前言 本次博客&#xff0c;将要介绍二分算法的基本原理以及如何使用&#xff0c;深入浅出 二分可以针对整型以及浮点型接下来对其讲解希望对小白有所帮助吧 整型的二分法 一般要在一个数组中猜出一个数是否存在我们可以遍历一遍整个数组&#xff0c;判断是否存在&#xff0…

使用Windows11自带的WSL安装Ubuntu Linux系统教程

WSL介绍 WSL全称Windows Subsystem for Linux&#xff0c;它是Windows10带来的新特性&#xff0c;用于Windows系统上的Linux子系统。也就是说&#xff0c;可以在Windows系统中获取Linux系统&#xff0c;这个过程无需通过虚拟机&#xff0c;而是直连计算机硬件。 简而言之&#…

Linux--进程间的通信-命名管道

前文&#xff1a; Linux–进程间的通信-匿名管道 Linux–进程间的通信–进程池 命名管道的概念 命名管道是一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;运行不同进程之间进行可靠的、单向或双向的数据通信。 特点和作用&#xff1a; 跨平台性&#xff1a;在W…

ResNet最新变体!性能反超Transformer,模型准确率达98.42%

目前ResNet&#xff08;残差网络&#xff09;有两大主流创新思路&#xff1a;一是与其他技术或模型结合&#xff0c;比如前文讲到的ResNetTransformer&#xff1b;二是在原始设计的基础上进行改进。 尽管ResNet通过残差学习有效改善了深层网络的训练和性能&#xff0c;但同时它…

永磁同步电机无感FOC(扩展卡尔曼滤波EKF位置观测控制)

文章目录 1、前言2、扩展卡尔曼滤波器原理2.1 预测阶段&#xff08;时间更新阶段&#xff09;2.2 校正阶段&#xff08;状态更新阶段&#xff09; 3、永磁同步电机EKF的模型4、永磁同步电机EKF的无位置状态观测仿真4.1 核心模块&#xff08;在滑膜、龙伯格、磁链等观测器基础上…

三角洲期刊投稿发表论文

《三角洲》杂志是由国家新闻出版总署批准&#xff0c;南通市委宣传部主管&#xff0c;南通日报社、南通市文学艺术界联合会主办的正规文学类期刊。适用于发表高品质文学学术作品&#xff0c;科研机构的专家学者以及高等院校的师生等具有原创性的学术理论、工作实践、科研成果和…

openEuler-23.03下载

下载地址&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 下载版本&#xff1a;openEuler-23.03-x86_64-dvd.iso

H264标准协议基础3

参考博文 上一篇H264标准协议基础2 1.解码视频帧的poc计算 2.残差4x4 矩阵中的trailingones & numcoeff 2.1查表 trailingones 表达出尾部one(1,-1)系数的个数,按照zigzag扫描出(1,-1)个数,trailingones的最大为3; numcoeff 表达非零值系数的个数,最多为16个…

Linux shell 脚本基础与部署SpringCloud实战

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

供应链投毒预警 | 开源供应链投毒202403月报发布啦!(含投毒案例分析)

悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;能够第一时间捕获开源组件仓库中的恶意投毒攻击。在2024年3月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff0…

Flattened Butterfly 扁平蝶形拓扑

Flattened Butterfly 扁平蝶形拓扑 1. 传统蝶形网络 Butterfly Topology2. 扁平蝶形拓扑 Flattened Butterfly3.On-Chip Flattened Butterfly 扁平蝶形拓扑应用于片上网络 Flattened Butterfly 扁平蝶形拓扑 扁平蝶形拓扑是一种经济高效的拓扑&#xff0c;适用于高基数路由器…

OpenHarmony南向开发案例:【智能照相机】

样例简介 本Demo是基于Hi3516开发板&#xff0c;使用OpenHarmony3.0-LTS开发的应用。通过获取摄像头数据&#xff0c;实现预览拍照以及路视频等功能。并且通过后台AI服务识别唤醒词来进行语音控制拍照及录制视频。 应用运行效果图&#xff1a; 此为相机的预览界面。 样例原理…

OpenHarmony多媒体-ohos_videocompressor

介绍 videoCompressor是一款ohos高性能视频压缩器。 目前实现的能力&#xff1a; 支持视频压缩 使用本工程 有两种方式可以下载本工程&#xff1a; 开发者如果想要使用本工程,可以使用git命令 git clone https://gitee.com/openharmony-sig/ohos_videocompressor.git --…