Текст программы Test_Zadc на Delphi 2007 |
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Zadc_int, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Timer1: TTimer;
procedure Form1OnCreate(Sender: TObject);
procedure Form1OnCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure OpenDevice;
procedure CloseDevice;
procedure ProcessDevice;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
MAX_TYPE_DSP = 30; // Максимальное поддерживаемое кол-во типов устройств
var
// Глобальные переменные
typeDevice: Longint; // Тип устройства
numberDSP: Longint; // Порядковый номер устройства
deviceOpened: Boolean = False; // Устройство открыто
deviceError: Boolean = False; // Ошибка устройства
deviceStarted: Boolean = False; // Устройство проинициализировано и запущено
numChannelsADC: Longint; // Кол-во включенных каналов АЦП
numWordsADC: Longint; // Кол-во слов (по два байта) в одном отсчете АЦП
sizeBufferADC: Longint; // Размер буфера драйвера в словах
amplifyADC: array [0..1] of Double; // Коэф. усиления по первым двум каналам
resolutionADC: array [0..1] of Double; // Вес младшего разряда АЦП
pBuffer: Pointer; // Указатель на начало буфера драйвера
pBuffer16ADC: ^Smallint; // Указатель на начало буфера драйвера для АЦП с разрядностью не более 16 бит
pBuffer32ADC: ^Longint; // Указатель на начало буфера драйвера для АЦП с разрядностью более 16 бит
pointerADC: Longint; // Указатель на текущий элемент заполнения буфера драйвера
pointerADC_old: Longint; // Предыдущее значение указателя заполнения буфера драйвера
sampleADC: array [0..1] of Longint; // Мгновенное текущее значение отсчета АЦП (оцифрованное значение)
volt: array [0..1] of Double; // Мгновенное текущее значение напряжение на входах АЦП (в вольтах)
procedure TForm1.Form1OnCreate(Sender: TObject);
begin
OpenDevice();
end;
procedure TForm1.Form1OnCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CloseDevice();
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if deviceError <> FALSE then
begin
Form1.Close();
end
else
begin
ProcessDevice();
end;
end;
procedure TForm1.OpenDevice();
var
Err: Longint; // Код ошибки
enable: Longint; // Поддерживается / не поддерживается
Serial: Longint; // Серийный номер
i: Longint;
begin
numberDSP := 0; // Здесь задан первый порядковый номер устройства
typeDevice := 0;
deviceOpened := FALSE;
deviceError := FALSE;
deviceStarted := FALSE;
pBuffer := nil;
pBuffer16ADC := nil;
pBuffer32ADC := nil;
pointerADC := 0;
pointerADC_old := 0;
// Цикл подключения к первому поддерживаемому устройству
for i := 0 to MAX_TYPE_DSP - 1 do
begin
// подключиться к драйверу (обязательно)
Err := ZOpen(i, numberDSP);
if Err = 0 then
begin
// Проверить поддерживается ли АЦП
Err := ZGetEnableADC(i, numberDSP, enable);
if (Err = 0) and (enable <> 0) then
break
else
ZClose(i, numberDSP);
end;
end;
typeDevice := i;
if typeDevice >= MAX_TYPE_DSP then
begin
MessageDlg('Поддерживаемое устройство не найдено!',
mtInformation, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
deviceOpened := TRUE;
Err := ZGetSerialNumberDSP(typeDevice, numberDSP, Serial);
if Err = 0 then
Form1.Caption := 'Test_Zadc для устройства № ' + IntToStr(Serial);
// опросить кол-во каналов АЦП
Err := ZGetQuantityChannelADC(typeDevice, numberDSP, numChannelsADC);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZGetQuantityChannelADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
// включить первый канал АЦП
Err := ZSetInputADC(typeDevice, numberDSP, 0, 1);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZSetInputADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
if numChannelsADC > 1 then
begin
// включить второй канал АЦП
Err := ZSetInputADC(typeDevice, numberDSP, 1, 1);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZSetInputADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
end;
// опросить коэф. усиления по первому каналу АЦП
Err := ZGetAmplifyADC(typeDevice, numberDSP, 0, amplifyADC[0]);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZGetAmplifyADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
if numChannelsADC > 1 then
begin
// опросить коэф. усиления по второму каналу АЦП
Err := ZGetAmplifyADC(typeDevice, numberDSP, 1, amplifyADC[1]);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZGetAmplifyADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
end;
// опросить вес младшего разряда АЦП первого канала
Err := ZGetDigitalResolChanADC(typeDevice, numberDSP, 0, resolutionADC[0]);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZGetDigitalResolChanADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
if numChannelsADC > 1 then
begin
// опросить вес младшего разряда АЦП второго канала
Err := ZGetDigitalResolChanADC(typeDevice, numberDSP, 1, &resolutionADC[1]);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZGetDigitalResolChanADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
end;
// опросить кол-во включенных каналов АЦП
Err := ZGetNumberInputADC(typeDevice, numberDSP, &numChannelsADC);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZGetNumberInputADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
// опросить кол-во слов в одном отсчете АЦП
Err := ZGetWordsADC(typeDevice, numberDSP, &numWordsADC);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZGetWordsADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
// Проверка переменных, чтобы избежать деления на 0
if (numWordsADC = 0) or (amplifyADC[0] = 0) or
((numChannelsADC > 1) and (amplifyADC[1] = 0)) then
begin
MessageDlg('Ошибочные значения параметров АЦП!',
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
// Запросить буфер АЦП
Err := ZGetBufferADC(typeDevice, numberDSP, pBuffer, sizeBufferADC);
if Err <> 0 then
begin
MessageDlg('Ошибка в ZGetNumberInputADC(), Error = ' + IntToHex(Err, 2),
mtError, [mbOK], 0);
deviceError := TRUE;
Exit;
end;
pBuffer16ADC := pBuffer;
pBuffer32ADC := pBuffer;
// останов АЦП
ZStopADC(typeDevice, numberDSP);
// запуск АЦП
ZStartADC(typeDevice, numberDSP);
deviceStarted := TRUE;
end;
procedure TForm1.CloseDevice();
begin
deviceStarted := FALSE;
if deviceOpened = FALSE then
Exit;
// Останов АЦП
ZStopADC(typeDevice, numberDSP);
// Освободить буфер АЦП
if pBuffer <> nil then
ZRemBufferADC(typeDevice, numberDSP, pBuffer);
// Отключиться от драйвера (обязательно)
ZClose(typeDevice, numberDSP);
pBuffer := nil;
end;
procedure TForm1.ProcessDevice();
var
Err: Longint; // Код ошибки
begin
// Если устройство еще не стартовали и переменные не проинициализированны, то выйти
if deviceStarted = FALSE then
Exit;
// Запросить текущее значение указателя
Err := ZGetPointerADC(typeDevice, numberDSP, pointerADC);
if Err <> 0 then
begin
deviceError := TRUE;
Exit;
end;
// Если новые данные в буфер не поступили, то выйти из процедуры
if pointerADC = pointerADC_old then
Exit;
// Обновить предыдущее значение указателя
pointerADC_old := pointerADC;
// перейти на отсчет первого включенного канала последнего кадра АЦП
if pointerADC - numWordsADC * numChannelsADC < 0 then
begin
pointerADC := sizeBufferADC + pointerADC - numWordsADC * numChannelsADC;
end
else
pointerADC := pointerADC - numWordsADC * numChannelsADC;
// вычислить из целого значения отсчета АЦП вещественное значение отсчета (в Вольтах)
sampleADC[0] := 0;
if numWordsADC = 1 then
begin
pBuffer16ADC := pBuffer;
Inc(pBuffer16ADC, pointerADC);
CopyMemory(@sampleADC[0], pBuffer16ADC, 2);
end
else
begin
pBuffer32ADC := pBuffer;
Inc(pBuffer32ADC, (pointerADC div numWordsADC));
CopyMemory(@sampleADC[0], pBuffer32ADC, 4);
end;
volt[0] := resolutionADC[0] * (sampleADC[0] / amplifyADC[0]);
// отобразить мгновенное значение напряжения для первого канала
Form1.Edit1.Text := FloatToStrF(volt[0], ffFixed, 8, 6);
// если включено более одного канала АЦП, то сделать то же самое для второго канала
if numChannelsADC > 1 then
begin
// перейти на следующий отсчет АЦП
pointerADC := pointerADC + numWordsADC;
// если вышли за границу буфера, то перейти в начало
if pointerADC >= sizeBufferADC then
pointerADC := pointerADC - sizeBufferADC;
sampleADC[1] := 0;
if numWordsADC = 1 then
begin
pBuffer16ADC := pBuffer;
Inc(pBuffer16ADC, pointerADC);
CopyMemory(@sampleADC[1], pBuffer16ADC, 2);
end
else
begin
pBuffer32ADC := pBuffer;
Inc(pBuffer32ADC, (pointerADC div numWordsADC));
CopyMemory(@sampleADC[1], pBuffer32ADC, 4);
end;
volt[1] := resolutionADC[1] * (sampleADC[1] / amplifyADC[1]);
// отобразить мгновенное значение напряжения для второго канала
Form1.Edit2.Text := FloatToStrF(volt[1], ffFixed, 8, 6);
end;
end;
end.
Скачать пример
В любой части настоящего сайта могут иметься неточности и технические ошибки. В содержание могут периодически вноситься изменения и/или поправки.
Россия, Москва, Зеленоград, проезд 4922 (Озерная аллея), дом 4 стр. 5. Схема проезда.
Тел./Факс: +7(495)739-39-19 (многоканальный); E-mail: info@zetlab.ru, sale@zetlab.ru.
GPS координаты: долгота 37°13′14.57″E (37.220713) широта 55°59′1.3″N (55.983695)
|