Отображение кривой высокочастотных данных в режиме реального времени через базу данных, возможно ли это?

Проект мониторинга, 16 датчиков, частота дискретизации 50 Гц, принята база данных оракула с простой структурой: время записи + данные датчика.

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 для чтения базы данных, отображая кривые в реальном времени.

Требования: 20 мс отображение данных, сдвиг кривой влево, отсутствие паузы при отображении.

Теперь два способа чтения базы данных:

  1. Регулярное обновление

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

Проблема в том, что интервал в 1 секунду, читаются последние 1 секунды данные в базе данных (около 50 данных), кривая имеет паузу (сдвиг влево каждую 1 секунду); передается на обновление 20 мс, считывает последние данные и вставляет после кривой, много раз считывая одни и те же данные, потому что время запроса к базе данных составляет 100 мс или около того (выберите верхнюю часть), что приводит к большому количеству прямых кривых, не соответствует реальная тенденция изменения.

  1. Использование потока, в частности, потока для чтения базы данных, выберите время начала, иногда бывают паузы, причины анализа: время чтения данных обычно составляет 20 мс, а иногда и 300 мс, поскольку в базу данных часто вставляются и удалить, в то время как память операционной системы также изменяется в режиме реального времени, повлияет на скорость чтения. И чем больше время, тем сильнее кривая задержки.

Является ли высокочастотный дисплей данных, через базу данных, чтобы прочитать путь не представляется возможным? Возможно только через API устройства прямого чтения?

Спасибо!


person skyspeed    schedule 01.03.2017    source источник
comment
вам действительно нужно улучшить свои навыки допроса. Это ужасно читать. Если вы не являетесь носителем английского языка, не стесняйтесь использовать изображения, чтобы помочь донести свою точку зрения.   -  person Jacky Cheng    schedule 01.03.2017


Ответы (1)


Вы спрашиваете, как обновить диаграмму быстрее, чем вы можете запросить базу данных без паузы. Я не технический гуру, но я знаю "обманку", которая может быть вам полезна. Вместо того, чтобы показывать текущие значения на графике, покажите значения секундной давности, в основном буферизируя.

Итак, идея состоит в том, что у вас есть поток, который считывает данные каждые 500 мс и сохраняет прочитанные данные в памяти. Затем у вас есть еще один поток для обновления диаграммы, который берет один набор результатов из памяти каждые 20 мс и рисует его. Это сделает график плавным и без пауз, а кривая данных будет точной. Единственным недостатком является то, что диаграмма показывает не «живые» данные, а отложенную версию данных 500 мс назад.

вот что я имел в виду:

0 сек - датчик включается, на графике нет изображения

0,5 сек - 25 наборов данных в БД, запрос БД (выберите 1~25), на графике нет изображения

1 сек - 50 наборов данных в БД, запрос БД (выберите 26~50), начинает отображать результат 1~25 на диаграмме в течение следующих 500 мс.

1,5 с - 75 данных в БД, запрос БД (выберите 51~75), начинает отображать результат 26~50 на диаграмме в течение следующих 500 мс.

person Jacky Cheng    schedule 01.03.2017