0

监控项目,16个sensor,采样频率50hz,采用oracle数据库,结构简单:record_time + sensor_data。

Create Table real_data(
    record_time timestamp(3),
    ac_1 Float,
    ac_2 Float,
    ac_3 Float,
    ac_4 Float,
    ac_5 Float,
    ac_6 Float,
    ac_7 Float,
    ac_8 Float,
    ac_9 Float,
    ac_10 Float,
    ac_11 Float,
    ac_12 Float,
    ac_13 Float,
    ac_14 Float,
    ac_15 Float,
    ac_16 Float
    )
    Tablespace data_test;

我使用 livecharts wpf 控件读取数据库,显示实时曲线。

要求:20ms显示一个数据,曲线左移,无显示停顿。

现在有两种读取数据库的方法:

  1. 定期刷新

    Timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(1000) };

问题是1秒的间隔,读取数据库中最新的1秒数据(约50条数据),曲线有停顿(每1秒左移一次);转为20ms刷新,读取最新数据并插入曲线后,多次读取相同数据,因为数据库查询时间在100ms左右(选择top),导致曲线直线很多,不符合实际变化趋势。

  1. 线程的使用,具体是一个线程读取数据库,选择启动时间,偶尔会有停顿,原因分析:读取数据的时间一般是20ms,偶尔300ms,因为数据库有频繁的insert而删除,同时操作系统内存也是实时变化的,会影响读取速度。而且时间越长,曲线延迟越严重。

是否高频数据显示,通过数据库读取的方式不可行?只通过直接读取设备API可行吗?

谢谢!

4

1 回答 1

2

您在问,如何在不暂停的情况下比查询数据库更快地刷新图表。我不是技术大师,但我知道可能对您有用的“作弊”。不是在图表上显示当前值,而是显示一秒钟前的值,基本上是缓冲。

所以想法是你有一个线程每500ms读取一次数据,并将读取的数据存储到内存中。然后你有另一个图表更新线程,它每 20 毫秒从内存中获取一个结果集并绘制它。这将使图表看起来平滑且没有停顿,数据曲线也将准确。唯一的缺点是图表没有显示“实时”数据,而是 500 毫秒前数据的延迟版本。

这就是我的意思:

0 秒 - 传感器开始,图表上没有视觉效果

0.5 sec - DB 中的 25 个数据集,查询 DB(选择 1~25),图表上没有可视化

1 sec - DB 中的 50 个数据集,查询 DB(选择 26~50),在接下来的 500 毫秒内开始在图表上显示结果 1~25。

1.5 sec - DB 中的 75 个数据集,查询 DB(选择 51~75),在接下来的 500 毫秒内开始在图表上显示结果 26~50。

于 2017-03-01T09:51:40.763 回答