C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Построение 32 графиков в реальном времени
Slader
Отправлено: 05.01.2005, 20:50


Ученик-кочегар

Группа: Участник
Сообщений: 27



Вопрос, видимо, прежде всего к Геогргию. Насколько я понимаю он работал с похожей задачей.

Требуется считать из кольцевого буфера данные и вывести их на экран в виде отдельных графиков. Максимум графиков 32. Частота — до 100кГц на каждый график. Далее желательно с этими графиками работать уже в режиме оффлайн. Я так думаю, что записывать данные надо в отдельный файл по прерыванию при переполнении буфера. А как лучше строить?
Насколько я понял из просмотренных обсуждений, TChart не годится в корне...
У кого есть какие соображения, как реализовать подобную штуку?
Георгий
Отправлено: 06.01.2005, 01:11


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



у меня времена куда скромнее были — а у тебя 100kHz * 32 канала = 300 нс на точку-такое не точто глаз не заметит, но и люминофор не успеет вспыхнуть.

если считать, что один замер это 4байта то получается поток = 100kHz*32*4=12мб/с

цифра вполне реальная-многие бытовые жесткие диски способны работать с не худшей средней скоростью.

думаю делать надо так:

хранение:
1. данные из буфера железки переписывать в кольцевой буффер в ОЗУ размером порядка 10-20 мегабайт без преобразования формата. А то если преобразовать в double то поток будет 24мб/с что HDD может не выдержать.
2. открыть файл для асинхронной записи (overlapped) среди параметров функции CreateFile есть некоторые которые ускоряют последовательный блочный доступ к файлу (последовательныя запись блоками по 512 байт якобы очень быстро работает)
3. на часть буффера натравливать функцию записи в файл (размер части буфера придётся подогнать под кратную 512 байтам) в режиме overlapped

быстрая визуализация:
100кГц в реальном масштабе времени никто не увидит, поэтому данные можно загрубить:
на неком интервале (например 50мс) по каждому каналу выполнить поиск min, max и среднего т.е. вместо 170 000 точек оставляем три и рисуем это дело на TChart или вообще на TBitmap выводимой на TPaintBox — на нём даже проще будет.
получится за 1 сек интервал будет 3(точки)*32(каналы)*20(в сек)*1(сек) = 2000 точек с чем чарт и темболее PaintBox прикрасно справится.
и обслуживающий персонал будет иметь примерно тоже самое, что они бы видели на аналоговом осцилографе.

полная визуализация:
тут ничего изобрести не удастся но и спешить никуда не надо — грузим всё это в TChart порциями по 0,5-1,0 секунде и получаем тормоза — 100 млн точек всетаки

скорее всего таие объёмы информации никому не нужны, поэтому быть может имеет смысл выяснить у заказчика какой анализ этих данных он будет выполнять и на визуализацию гнать уже результат анализа

в результате получается следующее:
1. отдельный поток выполняет перекачку буфера железки в ОЗУ
2. основной поток, как только заполнится часть буфера в ОЗУ (например половина) вызывает функцию асинхронной записи в файл и выполняет быструю визуализацию. так же этот поток отвечает за перерисовку окон и т.п.
3. отдельная программа выполняет полную визуализацию — грузит файл в память, загружает маленькими кусочками в TChart и выполняет остальные "хотелки" заказчика связанные с обработкой результатов замеров.

PS. конечно быструю визуализацию можно гнать через directX или openGL, но на мой взгляд это никаких особых преимуществ перед TPaintBox не имеет и ломать голову над этим яб не стал.
PPS. не забывайте, что MSWindow не является ОС жесткого реального времени (если быть точным то она даже на мягкое РВ не претендует), так что если 1000 раз выша программа успеет прочитать+визуализировать+записать то это не означает что на 1001 раз всё пройдёт стольже гладко.
в связи с этим пожно попробовать ВСЕ данные сеанса замеров хранить в ОЗУ — наверняка система будет работать не 24часа в сутки и сессии замеров врядти будут превышать 20-30 секунд т.е. это ~400MB ОЗУ что есть на всех современных машинах. и уже после выполнения замеров выполнять запись на диск и прочие медленные операции.


Отредактировано Георгий — 06/01/2005, 02:32

Вернуться в Вопросы программирования в C++Builder