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

目录

      • 准备工作
      • 服务器设置
      • 创建或获取节点
      • 设置节点值
      • 启动服务器
      • 查看服务器
      • 客户端
      • 总结

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

准备工作

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

pip install opcua

服务器设置

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

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,它将根据需要创建新的节点或返回已存在的节点。

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文件中的数据。

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}")

启动服务器

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

# 启动服务器
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节点值提供的服务器。这种方法在工业数据集成和监控应用中非常有用,因为它允许不同系统和设备之间进行标准化和安全的数据交换。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nature Geoscience | 近十年来北方森林和温带森林是全球主要的碳汇

2023年10月2日,法国巴黎萨克雷大学、波尔多大学与丹麦哥本哈根大学等多个单位的科研小组在国际知名学术期刊《Nature Geoscience》发表了一项题为“Global Increase in Biomass Carbon Stock Dominated by Growth of Northern Young Forests over Past Decade”的文…

论文笔记:NEFTune: Noisy Embeddings Improve Instruction Finetuning

iclr 2024 reviewer 评分 5666 1 论文思路 论文的原理很简单:在finetune过程的词向量中引入一些均匀分布的噪声即可明显地提升模型的表现 2 方法评估

动态规划-简单多状态dp问题2

文章目录 1. 买卖股票的最佳时机含冷冻期(309)2. 买卖股票的最佳时机含手续费(714)3. 买卖股票的最佳时机 III(123)4. 买卖股票的最佳时机 IV(188) 1. 买卖股票的最佳时机含冷冻期&a…

【ELK】ELK企业级日志分析系统

搜集日志;日志处理器;索引平台;提供视图化界面;客户端登录 日志收集者:负责监控微服务的日志,并记录 日志存储者:接收日志,写入 日志harbor:负责去连接多个日志收集者&am…

年龄与疾病c++

题目描述 某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照0-18岁、19-35岁、36-60岁、61以上(含61)四个年龄段统计的患病人数以及占总患病人数的比例。 输入 共2行,第一行为过…

2440栈的实现类型、b系列指令、汇编掉用c、c调用汇编、切换工作模式、初始化异常向量表、中断处理、

我要成为嵌入式高手之4月11日51ARM第六天!! ———————————————————————————— b指令 标签:表示这条指令的名称,可跳转至标签 b指令:相当于goto,可随意跳转 如:fini…

Vivado Design Suite中的增量实现和增量模式

Vivado Incremental(增量)是Xilinx FPGA设计工具中的一种功能,它允许对设计的一部分进行修改和重新编译,而不需要对整个设计进行重新编译。这种增量式的方法可以显著减少编译时间,特别是在进行小的修改或迭代开发时。 …

粒子群优化算法PSO与鹈鹕优化算法(POA)求解无人机三维路径规划(MATLAB代码)

一、无人机路径规划模型介绍 二、算法介绍 close all clear clc dbstop if all error warning (off) global model model CreateModel(); % 创建模型 FF1; [Xmin,Xmax,dim,fobj] fun_info(F);%获取函数信息 pop100;%种群大小(可以自己修改) maxgen100;%最大迭代次数(可以自己…

成功转行Python工程师,年薪30W+,经验总结都在这!

都说郎怕入错行,行业对职场人的影响不言而喻。我们身边有很多和自己起点差不多的人,读了差不多的高中,差不多的大学,但是有的人突然一飞冲天,大House、移民、海外置业、全球旅行成了最常见的话题,出入私立医…

LeetCode18: 四数之和

目录 题目: 题解: 代码: 题目: 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元…

【C++】STL学习之vector的使用

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 前言一、默认成员函数1.1 默认构造1.2 拷贝构造1.3 析构函数1.4 赋值重载 二、迭…

【STK】手把手教你利用STK进行导弹和反导仿真04 - STK/MMT模块04 导弹飞行工具应用案例

【STK】手把手教你利用STK进行导弹和反导仿真04 - STK/MMT模块04 导弹飞行工具应用案例 这个案例将把范围轮廓导出到STK,以此来分析如何放置发射点和落点位置,然后使用它们来定义MFT中的飞行导弹。最后将生成的轨迹导出到STK进行显示和分析。 (1)第一步启动STK并创建新场景。…

LeetCode-705. 设计哈希集合【设计 数组 哈希表 链表 哈希函数】

LeetCode-705. 设计哈希集合【设计 数组 哈希表 链表 哈希函数】 题目描述:解题思路一:超大数组解题思路二:拉链法解题思路三:定长拉链数组 题目描述: 不使用任何内建的哈希表库设计一个哈希集合(HashSet&…

算法设计与分析实验报告c++实现(最近点对问题、循环赛日程安排问题、排序问题、棋盘覆盖问题)

一、实验目的 1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握; 2.提高学生利用课堂所学知识解决实际问题的能力; 3.提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、 最…

leetCode刷题 27. 移除元素

目录 1.思路: 2.解题方法: 3.复杂度: 4.Code 题目: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须…

设备树的概念、设备树如何变成device、与driver的匹配

在平台总线驱动模型中资源和驱动已经从逻辑上和代码组织上进行了分离,但每次调整资源还是会涉及到内核,所以现在更加流行的是设备树方式。设备树的好处是通过独立于内核存在,这样如果设备上外设功能启用与否以及位置变动的话很多时候不用修改…

【论文速读】| 基于大语言模型的模糊测试技术

本次分享论文为:Large Language Models Based Fuzzing Techniques: A Survey 基本信息 原文作者:Linghan Huang, Peizhou Zhao, Huaming Chen, Lei Ma 作者单位:悉尼大学;东京大学;阿尔伯塔大学 关键词:…

8. Spring Boot 配置文件

源码地址:SpringBoot_demo 本篇文章内容源码位于上述地址的com/chenshu/springboot_demo/config包下 1. 配置文件是什么 上节说到,Spring Boot的项目分为三个部分:源代码目录、资源目录、单元测试目录。 而配置文件的位置就位于资源目录res…

Python-VBA函数之旅-delattr函数

目录 1、 delattr函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:https://blog.csdn.net/ygb_1024?spm1010.2135.3001.5421 delattr函数在Python中具有广泛的应用场景,主要用于动态地管理对象的属性。常用…

Python十大最佳实践:高效Python编程的十个关键方法

在当今的软件开发世界中,Python是一种极其重要且广泛使用的编程语言。以下是Python编程的十大最佳实践,这些实践将帮助你提升编程效率,优化代码质量,以及更好地应用Python的强大功能。 1.理解Pythonic的方式 “Pythonic”是指遵循…