我想实现通过选择指定数据和时间段进行数据查询,最简单的就是ReportSetHistData2(1,1),但是弹出的屏幕进行数据时间的调整太麻烦,按钮太小点不到,也没法调整数据,现在是添加需要查询的数据,数据名称显示,删除添加的数据都实现了,开始时间和结束时间的时间戳也有了,点击查询之后会显示时间和数据名但是不显示查询的数据和时间,有可能是没有数据的缘故,但是ReportSetHistData2(1,1)就算查询不到数据也会显示查询时间,总而言之,能否通过手动编程代替原本的函数实现功能。



我想实现通过选择指定数据和时间段进行数据查询,最简单的就是ReportSetHistData2(1,1),但是弹出的屏幕进行数据时间的调整太麻烦,按钮太小点不到,也没法调整数据,现在是添加需要查询的数据,数据名称显示,删除添加的数据都实现了,开始时间和结束时间的时间戳也有了,点击查询之后会显示时间和数据名但是不显示查询的数据和时间,有可能是没有数据的缘故,但是ReportSetHistData2(1,1)就算查询不到数据也会显示查询时间,总而言之,能否通过手动编程代替原本的函数实现功能。



下午好🌅🌅🌅
本答案参考通义千问
在组态王(KingView)中,ReportSetHistData2(1,1) 是一个内置函数,用于打开历史数据查询界面,允许用户通过图形化界面选择数据点、时间范围等进行查询。然而,该函数的界面交互较为复杂,如你所述,按钮太小、操作不便,且无法直接控制其行为,比如手动设置时间戳或数据点。
ReportSetHistData2(1,1) 的功能;ReportSetHistData2(1,1) 的原因你可以使用 组态王的 GetHistoryDataEx 函数 来实现手动查询历史数据的功能。
GetHistoryDataExint GetHistoryDataEx(
int nDataType, // 数据类型(0=实时数据,1=历史数据)
char *sPointName, // 点名
long lStartTime, // 开始时间(时间戳)
long lEndTime, // 结束时间(时间戳)
int nInterval, // 时间间隔(秒)
int nMaxNum, // 最大返回记录数
int *nRetCount, // 返回记录数
char **pData // 返回数据内容
);
⚠️ 注意:
GetHistoryDataEx需要配合FreeHistoryDataEx释放内存。
// 声明变量
char *pHistoryData = NULL;
int nRetCount = 0;
long startTime = 1717027200; // 示例开始时间戳(2024-06-01 00:00:00)
long endTime = 1717030800; // 示例结束时间戳(2024-06-01 01:00:00)
char *pointName = "YourPointName"; // 替换为你的数据点名称
// 调用函数获取历史数据
int result = GetHistoryDataEx(1, pointName, startTime, endTime, 60, 100, &nRetCount, &pHistoryData);
if (result == 0 && nRetCount > 0) {
// 成功获取到数据,处理并显示
MessageBox("获取到" + nRetCount + "条历史数据!");
// 你可以将 pHistoryData 中的内容解析后显示在画面中
} else {
MessageBox("未找到历史数据或调用失败!");
}
// 释放内存
FreeHistoryDataEx(pHistoryData);
ReportSetHistData2(1,1) 对比)| 功能 | ReportSetHistData2(1,1) | 手动编程(GetHistoryDataEx) |
|------|--------------------------|-------------------------------|
| 显示查询界面 | ✅ | ❌ |
| 自定义时间戳 | ❌ | ✅ |
| 自定义数据点 | ❌ | ✅ |
| 数据展示 | ✅ | ✅(需自行解析) |
| 灵活性 | ❌ | ✅ |
获取用户输入的时间段(开始时间、结束时间)
TimeToLong() 函数将时间格式转为时间戳。获取用户选择的数据点列表
循环调用 GetHistoryDataEx 查询每个数据点的历史数据
将查询结果解析并展示在画面中
错误处理与提示
如果你使用的是 VBScript,也可以使用如下方式:
Dim startTime, endTime, pointName
startTime = TimeToLong("2024-06-01 00:00:00")
endTime = TimeToLong("2024-06-01 01:00:00")
pointName = "YourPointName"
Dim data
data = GetHistoryDataEx(1, pointName, startTime, endTime, 60, 100)
If Not IsEmpty(data) Then
MsgBox "获取到" & UBound(data) + 1 & "条历史数据!"
' 进一步处理数据...
Else
MsgBox "未找到历史数据!"
End If
| 项目 | 是否可行 |
|------|----------|
| 手动编程实现 ReportSetHistData2(1,1) 的功能 | ✅ 可行 |
| 无需界面操作 | ✅ |
| 支持自定义时间戳和数据点 | ✅ |
| 需要自己解析数据并展示 | ✅ |
| 更加灵活、可控 | ✅ |
如果你的目标是避免界面操作、提高效率,建议采用以下方式:
GetHistoryDataEx 函数进行手动查询;如有需要,我可以提供完整的示例工程或更详细的代码片段,包括如何将查询结果展示在画面中。欢迎继续提问!