2017-03-01 61 views
0

監測項目採用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可行?

謝謝!

+0

你真的需要提高你的提問技巧。閱讀是可怕的。如果您不是以英語爲母語的人,請隨意使用圖片來幫助您瞭解您的觀點。 –

回答

2

您在問,如何刷新圖表比查詢數據庫更快,而不會暫停。我不是技術專家,但我知道一個可能對你有用的「欺騙」。而不是顯示圖表上的當前值,顯示從第二個以前的值,基本上緩衝。

所以這個想法是,你有一個線程每隔500ms讀取一次數據,並將讀取的數據存儲到內存中。然後你有另一個線程更新圖表,每20ms從內存中獲取一個結果集並繪製它。這將使圖表看起來很平穩,沒有停頓,數據曲線也是準確的。唯一的缺點是圖表不顯示「實時」數據,而是500毫秒前的數據的延遲版本。

這是我的意思是:

0秒 - 傳感器開始,沒有視覺上圖表

0.5秒 - 25個數據在DB中設置,查詢DB(選擇1〜25),沒有視覺上圖表

1秒 - 在數據庫中設置50個數據,查詢數據庫(選擇26〜50),在下一個500ms開始在圖表上顯示結果1〜25。

1.5秒 - 在數據庫中設置75個數據庫,查詢數據庫(選擇51〜75),在下一個500ms內開始在圖表上顯示結果26〜50。

+0

一個好主意!謝謝你的幫助!我會嘗試。 – skyspeed