网抑云大师 2026-04-24 14:41 采纳率: 0%
浏览 4

组态王,手动编程是否能实现ReportSetHistData2(1,1)的功能

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

img

img

img

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2026-04-24 14:42
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在组态王(KingView)中,ReportSetHistData2(1,1) 是一个内置函数,用于打开历史数据查询界面,允许用户通过图形化界面选择数据点、时间范围等进行查询。然而,该函数的界面交互较为复杂,如你所述,按钮太小、操作不便,且无法直接控制其行为,比如手动设置时间戳或数据点。


    问题总结:

    • 你想通过手动编程的方式实现 ReportSetHistData2(1,1) 的功能;
    • 你已经实现了添加/删除数据点、获取时间戳等功能;
    • 但点击“查询”后,没有显示实际的历史数据
    • 你希望完全用脚本代码代替原函数,实现自定义的数据查询逻辑。

    ✅ 解决方案

    一、不能直接替代 ReportSetHistData2(1,1) 的原因

    1. 该函数是系统级函数,依赖于组态王内部的数据库和历史数据接口。
    2. 它本身不支持直接传入时间戳或数据名进行查询,而是通过界面交互来完成。
    3. 如果只是想避免界面操作,可以考虑使用其他 API 或方法

    二、推荐解决方案(手动编程实现类似功能)

    你可以使用 组态王的 GetHistoryDataEx 函数 来实现手动查询历史数据的功能。

    🔹 1. 获取历史数据的函数:GetHistoryDataEx

    int GetHistoryDataEx(
        int nDataType,          // 数据类型(0=实时数据,1=历史数据)
        char *sPointName,       // 点名
        long lStartTime,        // 开始时间(时间戳)
        long lEndTime,          // 结束时间(时间戳)
        int nInterval,          // 时间间隔(秒)
        int nMaxNum,            // 最大返回记录数
        int *nRetCount,         // 返回记录数
        char **pData           // 返回数据内容
    );
    

    ⚠️ 注意:GetHistoryDataEx 需要配合 FreeHistoryDataEx 释放内存。


    🔹 2. 示例代码(C语言)

    // 声明变量
    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);
    

    🔹 3. 功能对比(与 ReportSetHistData2(1,1) 对比)

    | 功能 | ReportSetHistData2(1,1) | 手动编程(GetHistoryDataEx) | |------|--------------------------|-------------------------------| | 显示查询界面 | ✅ | ❌ | | 自定义时间戳 | ❌ | ✅ | | 自定义数据点 | ❌ | ✅ | | 数据展示 | ✅ | ✅(需自行解析) | | 灵活性 | ❌ | ✅ |


    🔹 4. 实现步骤(详细流程)

    1. 获取用户输入的时间段(开始时间、结束时间)

      • 使用组态王的 TimeToLong() 函数将时间格式转为时间戳。
    2. 获取用户选择的数据点列表

      • 可以通过全局变量、数组等方式存储已选数据点。
    3. 循环调用 GetHistoryDataEx 查询每个数据点的历史数据

      • 每个数据点单独查询,保存结果。
    4. 将查询结果解析并展示在画面中

      • 可以使用文本框、表格控件等展示时间与值。
    5. 错误处理与提示

      • 若无数据或调用失败,应给出明确提示。

    🔹 5. 示例代码(C# 或 VBScript?)

    如果你使用的是 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) 的功能 | ✅ 可行 | | 无需界面操作 | ✅ | | 支持自定义时间戳和数据点 | ✅ | | 需要自己解析数据并展示 | ✅ | | 更加灵活、可控 | ✅ |


    ✅ 推荐做法

    如果你的目标是避免界面操作、提高效率,建议采用以下方式:

    1. 使用 GetHistoryDataEx 函数进行手动查询;
    2. 结合组态王的变量管理、脚本机制,实现数据点选择、时间输入;
    3. 将查询结果动态展示在画面中(如表格、图表)。

    如有需要,我可以提供完整的示例工程或更详细的代码片段,包括如何将查询结果展示在画面中。欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 4月24日