Электронные технологии и метрологические системы Главная Форум Поиск Карта сайта Написать
ЗАО "Электронные технологии и метрологические системы"   
Тел./факс: +7(495)739-39-19 (многоканальный); E-mail: info@zetlab.ru   
Электронные технологии и метрологические системы ZETLab
 
 Главная 
 Продукция 
 Поддержка 
 Предприятие 
 Прайс лист 
 Контакты 
 Карта сайта 
ZETServer
Grid
Gramma
PlotterXYZ
Polar
Scale
ColScale
GreenScale
TextDisp
ExtEditBox
Kompas
Unit
ZADC
DSP
Примеры программирования


Online-консультанты
388828835 - Мария
627723417 - Никита
397652821 - Елена

Приглашаем на курсы обучения (29-31 мая 2012 года)

Форум

Скидка ВУЗам!

Доставка по всему миру!

Удалённое управление прибором.

Каталог продукции.

Запрос звонка

Наш телефон

Наш мобильный телефон

Наш факс


E:mail

Анализатор спектра a17-u8. Срок поставки 2 недели.









Главная / Продукция / Программное обеспечение / ZETLab Studio - средства разработки виртуальных приборов Версия для печати Версия для печати

Текст программы 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)






     
Главная | Продукция | Поддержка | Предприятие | Контакты | Карта сайта | Прайс-лист | Старый сайт | www.zetlab.ru | www.sigmausb.ru