通过数据库显示高频数据实时曲线,这是可行的



监视项目,16个传感器,采样频率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左右(选择顶部),导致很多直线曲线,不符合变化的实际趋势。

  1. 使用线程,特别是线程来读取数据库,选择启动时间,偶尔会暂停分析的原因:读取数据的时间通常为20ms,偶尔是300ms,因为那里的数据库经常进行插入和删除,而操作系统内存也是实时更改,将影响阅读速度。而且时间越长,曲线延迟就越严重。

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

谢谢!

您要问的,如何更快地刷新图表,而不是暂停数据库。我不是技术专家,但我知道一个"作弊"可能对您有用。而不是在图表上显示当前值,而是显示一秒前的值,基本上是缓冲。

因此,想法是您有一个线程,每500ms读取数据,然后将读取数据存储到内存中。然后,您将有另一个用于图表更新的线程,该线程每20ms每20ms从内存中进行一个结果集并绘制它。这将使图表看起来平稳且没有暂停,数据曲线也将是准确的。唯一的回报是,该图表没有显示"实时"数据,而是500ms以前的数据的延迟版本。

这就是我的意思:

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

0.5秒-25个数据集中的数据集,查询db(选择1〜25),图表上没有视觉

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

1.5秒-75个数据集中的数据集,查询db(选择51〜75),开始在下一个500ms上在图表上显示结果26〜50。

相关内容

  • 没有找到相关文章

最新更新