1

我正在使用带有 Qt OPC Ua 和 Open62541 后端的 Qt 5.11.1 来创建 OPC 客户端应用程序。

是否可以使用 Qt OPC UA 模块请求历史数据?例如,在这两次之间获取此变量(节点)的值。

我的服务器应用程序具有此功能 (FreeOpcUa),因为我可以将变量设置为“历史记录”并查看以前存储的值。但是我看不到在客户端轻松访问这些数据的明显解决方案。

目前我正在考虑在我的服务器上为每个变量公开一个函数,该函数将接受开始和结束时间戳,并手动收集值并将它们格式化为字符串或某个对象以供客户端使用。

有人对更好的方法有任何想法或想法吗?我对 OPC-UA 或 Qt 并不太熟悉,所以可能只是缺少一些明显的东西。

4

2 回答 2

1

要使用 OPC UA 历史功能,您的 OPC UA 客户端和服务器都应支持 HistoryRead/HistoryWrite 服务。

我不知道您的服务器的功能状态,但对于您的客户端(Open62541),这些服务尚未完全正常运行。在此处从他们的 GitHub 检查 FEATURES 文档

显然,这些应该在下一个 0.4 版本中完全正常运行。

于 2018-09-17T06:35:33.470 回答
0

Freeopcua-Server 支持历史记录 ( https://python-opcua.readthedocs.io/en/latest/server.html )。

您必须启用每个节点的历史记录(即每个要历史记录的变量):

historize_node_data_change(node, period=datetime.timedelta(7), count=0)

开始对提供的节点进行历史记录

参数:

node:可以被历史化的节点或节点列表(变量/属性)

period:存储历史的时间增量;旧数据将从存储中删除

count:要存储在历史记录中的更改数

例如,如果要提供温度历史记录,则必须使用“server.historize_node_data_change(Temp, period=datetime.timedelta(7), count=0)”(在服务器启动后):

[Python]:

from opcua import Server
from random import randint
import datetime
import time

server = Server()

server.set_endpoint("opc.tcp://192.168.178.20:443")
addspace = server.register_namespace("OPCUA_BurkhardsTemperatureSensor")

node = server.get_objects_node()

Param = node.add_object(addspace, "Thermometer_1")

Temp = Param.add_variable(addspace, "Temperature", 0)
Temp.set_writable()

Time = Param.add_variable(addspace, "Time", 0)
Time.set_writable()

SerialNr = Param.add_variable(addspace, "SerialNr.", "2323784628346")

server.start()

server.historize_node_data_change(Temp, period=datetime.timedelta(7), count=0)

while True:
    Temperature = randint (10,50)
    TIME = datetime.datetime.now()
    
    print (Temperature,TIME)

    Temp.set_value(Temperature)
    Time.set_value(TIME)
    
    time.sleep (2)
于 2020-11-29T22:14:16.897 回答