Простой плагин на Delphi

 

1. Назначение

Плагин осуществляет понижение частоты модуля АЦП в два раза.
  • Работа как в реальном масштабе времени, так и в режиме просмотра файла.
  • При понижении частоты новые отсчеты вычисляются как арифметическое среднее двух отсчетов.

2. Исходный текст плагина

// 03.05.2010г. //автор Delphi-кода Максим Асташев unit Plugin; interface uses lgraph2; // подключим модуль с объявлениями структур var Curr_PluginDataInfoStr:PluginDataInfoStr; // структура с параметрами АЦП FirstFlag:integer; // признак первых данных LastPoints:array[0..31] of double; // массив для хранения последнего кадра { Назначение - при помощи этой функции LGraph2 узнает название плагина (которое появится в настройках оборудования), версию плагина и требуемые плагину параметры } procedure PluginInfo(p_info:PPluginInfoStr); stdcall; { Функция сообщает плагину о текущих настройках оборудования, настроенного в LGraph, а также получает от плагина параметры рассчетных каналов (если они есть) } procedure PluginDataInfo(d_info:PPluginDataInfoStr); stdcall; { Настройка визуальных элементов. При помощи этой функции плагин может создать в окне ЛГрафа визуальные элементы типа графиков или мультиметрных окошек. } procedure PluginVisualSetting(main_visual_settings: PPluginVisualMainStr; p_visual:PPluginVisualStr); stdcall; // Основная функция обмена данными между плагином и ЛГраф2 во время ввода данных или во время просмотра файлов procedure PluginDataExchange(data_str:PPluginDataStr); stdcall; // Функция сообщает плагину, что начался сбор данных. Необязательная функция (в плагине может отсутствовать). procedure PluginStartInput(data_str:PPluginDataStr); stdcall; //Функция сообщает плагину, что закончился сбор данных. Необязательная функция (в плагине может отсутствовать). procedure PluginStopInput(data_str:PPluginDataStr); stdcall; implementation uses SysUtils; // главная функция обработки данных от АЦП procedure PluginDataExchange(data_str:PPluginDataStr); stdcall; var I, J,DATA_N, Index:Integer; begin DATA_N:=data_Str^.n*Curr_PluginDataInfoStr.adc_nch; // сколько всего отсчетов будем обрабатывать if(FirstFlag = 1) then // для первых данных скопируем первый кадр begin FirstFlag:=0; For I:=0 to Curr_PluginDataInfoStr.adc_nch-1 do LastPoints[I]:=data_Str^.data_to_plugin^[I]; end; // обработка массива с пришедшими данными (для вычисления первого кадра используем последний кадр от предыдущего вызова LastPoints) For I:=0 to Curr_PluginDataInfoStr.adc_nch-1 do For J:=0 to (data_Str^.n div 2)-1 do if(J <> 0) then data_Str^.data_from_plugin^[J*Curr_PluginDataInfoStr.adc_nch+I]:=(data_Str^.data_to_plugin^[(J*2)* Curr_PluginDataInfoStr.adc_nch+I]+data_Str^.data_to_plugin^[(J*2-1)*Curr_PluginDataInfoStr.adc_nch+I])/2 else data_Str^.data_from_plugin^[J*Curr_PluginDataInfoStr.adc_nch+I]:=(data_Str^.data_to_plugin^[I]+LastPoints[I])/2; data_Str^.n_from_plugin:=data_Str^.n div 2; // число сгенерированных кадров равно половине поступивших // запоминм последний кадр в LastPoints Index:=DATA_N-Curr_PluginDataInfoStr.adc_nch; For I:=0 to Curr_PluginDataInfoStr.adc_nch-1 do LastPoints[I]:=data_Str^.data_to_plugin^[I+Index]; end; // информационная функция procedure PluginInfo(p_info:PPluginInfoStr); stdcall; var I, J:Integer; S:String; begin p_info^.name:='Resampler'; // название плагина p_info^.comment:='Change sampling rate'; // комментарий p_info^.version:=65536; // версия плагина p_info^.lgraph_version:=$220; p_info^.max_nch:=16; p_info^.min_nch:=1; for i:=0 to 31 do // сформируем названия каналов begin S:='In_Ch'+IntToStr(I); for J:=1 to length(S) do p_info^.channel_names[i,j-1]:=S[j]; end; end; // функция получения параметров модуля АЦП (вызывается перед запуском сбора данных) procedure PluginDataInfo(d_info:PPluginDataInfoStr); stdcall; var I, J:Integer; S:String; begin d_info^.input_kadrs_min:=10; d_info^.input_kadrs_max:=Max_Points; d_info^.no_omit_old_data :=1; // через плагин пойдут все данные d_info^.plugin_nch :=d_info^.adc_nch; d_info^.plugin_channel_rate :=d_info^.rate[0]/2; // частоту делим пополам d_info^.max_points_from_plugin:=d_info^.input_kadrs_max div 2; for i:=0 to 31 do // названия выходных каналов плагина begin S:='Out_Ch'+IntToStr(I); for J:=1 to length(S) do d_info^.plugin_channel_names[i,j-1]:=S[j]; end; Curr_PluginDataInfoStr:=d_info^; // запомним параметры АЦП end; procedure PluginVisualSetting(main_visual_settings: PPluginVisualMainStr; p_visual:PPluginVisualStr); stdcall; begin {} end; procedure PluginStartInput(data_str:PPluginDataStr); stdcall; begin FirstFlag:=1; // установим признак первых данных end; procedure PluginStopInput(data_str:PPluginDataStr); stdcall; begin {} end; end.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск

L-CARD в проектах