如何获取OPC UA服务器带日期及正确时区的时间戳?
OPC UA 获取带时区时间戳的解决方案
为什么直接打印DataValue()没有时间戳
你直接实例化opcua.ua.DataValue()得到的是一个空的本地对象,没有从OPC UA服务器读取任何实际数据,所以输出里的Value为Null,也没有时间戳数据,这是正常现象。要获取带时间戳的信息,必须从服务器读取节点的完整数据。
获取带时间戳的数据(替代get_values方法)
client.get_values(nodes)方法仅返回节点的纯值,不会附带时间戳、状态码等元数据。要获取包含时间戳的完整数据,需使用client.get_data_values(nodes)方法,它会返回DataValue对象列表,每个对象包含以下关键属性:
Value.Value:节点的实际值SourceTimestamp:数据产生时的服务器源时间戳(UTC时区)ServerTimestamp:服务器接收到该数据的时间戳(UTC时区)
示例代码
# 获取包含时间戳的完整数据 data_values = self.client.get_data_values(nodes) for dv in data_values: print(f"节点值: {dv.Value.Value}") print(f"源时间戳(UTC): {dv.SourceTimestamp}") print(f"服务器时间戳(UTC): {dv.ServerTimestamp}")
时间戳转换为指定时区
OPC UA服务器返回的时间戳默认是UTC时区,如需转换为本地时区或指定时区,可使用Python内置的时区处理工具:
Python 3.9+ 推荐使用zoneinfo
from zoneinfo import ZoneInfo # 转换为北京时间(Asia/Shanghai) local_tz = ZoneInfo("Asia/Shanghai") local_source_time = dv.SourceTimestamp.astimezone(local_tz) print(f"本地时区源时间戳: {local_source_time}")
兼容旧版本Python 使用pytz
import pytz local_tz = pytz.timezone("Asia/Shanghai") # 先给UTC时间戳添加时区信息,再转换到目标时区 local_source_time = dv.SourceTimestamp.replace(tzinfo=pytz.utc).astimezone(local_tz) print(f"本地时区源时间戳: {local_source_time}")
注意事项
请确保OPC UA服务器配置为返回时间戳,部分服务器可能默认关闭该功能,需检查服务器的相关设置。
内容的提问来源于stack exchange,提问作者dinolover
相关产品推荐
相关产品推荐

