【Python】OPC UA 连接并读取节点值

2024-04-09 17:20
文章标签 python 读取 连接 节点 ua opc

本文主要是介绍【Python】OPC UA 连接并读取节点值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下是一个使用Python编写的OPC UA客户端程序,该程序会连接到OPC UA服务器,读取指定节点的值,并将这些值定期保存到CSV文件中。该程序还会读取一个XML文件来获取节点列表,并在发生错误时记录错误日志。
首先,我们需要导入所需的库:

import os
import csv
import time
import xml.etree.ElementTree as ET
from datetime import datetime
from opcua import Client
import logging

接下来,我们设置日志记录器,以便在发生错误时记录错误日志:

logger = logging.getLogger()
fh = logging.FileHandler("error.log", encoding="utf-8", mode="a")
formatter = logging.Formatter("%(asctime)s - %(name)s-%(levelname)s %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.setLevel(logging.WARNING)

然后,我们读取XML文件(文件下载)以获取节点列表:

tree = ET.parse('customer.xml')
root = tree.getroot()
node_list=[]
def find_titles(element:ET.Element ):if element.get('nodeClass') == 'Variable':title = element.get('Title')if title is not None:node_list.append(title)# 递归遍历所有子节点for child in element.getchildren():find_titles(child)
find_titles(root)

接下来,我们检查CSV文件是否存在,如果存在,则将其重命名:

filename = 'opcua_data.csv'
if os.path.exists(filename):modification_time = os.path.getmtime(filename)modification_time_str = datetime.fromtimestamp(modification_time).strftime('%Y%m%d%H%M%S')new_filename = f"{filename}_{modification_time_str}"os.rename(filename, new_filename)

现在,我们设置OPC UA客户端并连接到服务器:

client = Client("opc.tcp://192.168.168.182:4840")
client.set_user("OpcUaClient")
client.set_password("OpcUaClient")

接下来,我们打开CSV文件并准备写入数据:

with open(filename, mode='w', newline='') as csvfile:writer = csv.DictWriter(csvfile, fieldnames=node_list)writer.writeheader()node_dist = {}try:client.connect()while True:for title in node_list:try:value = client.get_node("ns=2;s=" + title).get_value()if isinstance(value, str):value.replace('\n', '\\n')node_dist[title] = valueexcept Exception as e:logger.warning(f"Failed to get value for node '{title}': {e}")continuewriter.writerow(node_dist)  # 写入到CSV的新一行csvfile.flush()  # 确保数据被写入文件time.sleep(1)  # 等待1秒finally:client.disconnect()

这个程序将不断运行,每秒从OPC UA服务器读取一次数据,并将其保存到CSV文件中。如果发生错误,错误将被记录到日志文件中。

这篇关于【Python】OPC UA 连接并读取节点值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888765

相关文章

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

chart 完成拓扑图单节点拖拽不影响其他节点位置

就是做这种的功能,箭头原本是可以动态重复移动的,但不知道哪里问题导致没箭头了,然后补了个edgeSymbol: ['','arrow'], 字段,才增加了箭头。 拖拽某个节点,只有关联到的线条会跟着变动其他的节点位置不变。 参考 https://gallery.echartsjs.com/editor.html?c=x8Fgri22P9 https://echarts.baidu.com/exa

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

python 喷泉码

因为要完成毕业设计,毕业设计做的是数据分发与传输的东西。在网络中数据容易丢失,所以我用fountain code做所发送数据包的数据恢复。fountain code属于有限域编码的一部分,有很广泛的应用。 我们日常生活中使用的二维码,就用到foutain code做数据恢复。你遮住二维码的四分之一,用手机的相机也照样能识别。你遮住的四分之一就相当于丢失的数据包。 为了实现并理解foutain

python 点滴学

1 python 里面tuple是无法改变的 tuple = (1,),计算tuple里面只有一个元素,也要加上逗号 2  1 毕业论文改 2 leetcode第一题做出来