⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aiunit.pas

📁 使用研华DAQ和Delphi实现研华数据采集卡的多种功能.包括数据输入输出。内含多个源码
💻 PAS
字号:
unit AIUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  OleCtrls, StdCtrls, DAQAILib_TLB, Buttons, ExtCtrls, Variants;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    cmdExit: TBitBtn;
    GroupBox8: TGroupBox;
    lstReading: TListBox;
    cmdAcquireStart: TButton;
    cmdAcquireStop: TButton;
    cmdStatus: TButton;
    txtStatus: TEdit;
    txtDeviceNum: TEdit;
    txtDeviceName: TEdit;
    cmdSelectDevice: TButton;
    GroupBox10: TGroupBox;
    Label5: TLabel;
    cmbStartChannel: TComboBox;
    Label6: TLabel;
    cmbNumChan: TComboBox;
    Label3: TLabel;
    cmbInputRange: TComboBox;
    chkOverAllGain: TCheckBox;
    cmdGainList: TButton;
    Label4: TLabel;
    cmbDataType: TComboBox;
    Label12: TLabel;
    cmbTransferMode: TComboBox;
    Label13: TLabel;
    cmbTrigSource: TComboBox;
    Label14: TLabel;
    cmbClockSource: TComboBox;
    Label15: TLabel;
    txtSampleRate: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    txtNumOfSample: TEdit;
    GroupBox6: TGroupBox;
    Label9: TLabel;
    chkFIFOEnabled: TCheckBox;
    txtFIFOSize: TEdit;
    chkEventEnabled: TCheckBox;
    chkCyclicMode: TCheckBox;
    ScanTimer: TTimer;
    cmdAutoGet: TButton;
    cmdStopAutoGet: TButton;
    GroupBox2: TGroupBox;
    Label11: TLabel;
    txtErrorCode: TEdit;
    txtErrorMessage: TEdit;
    Label10: TLabel;
    DAQAI1: TDAQAI;
    ErrorTimer: TTimer;
    procedure chkFIFOEnabledClick(Sender: TObject);
    procedure chkOverAllGainClick(Sender: TObject);
    procedure cmbDataTypeClick(Sender: TObject);
    procedure cmbTransferModeClick(Sender: TObject);
    procedure cmdAcquireStartClick(Sender: TObject);
    procedure cmdAcquireStopClick(Sender: TObject);
    procedure cmdGainListClick(Sender: TObject);
    procedure cmdSelectDeviceClick(Sender: TObject);
    procedure cmdStatusClick(Sender: TObject);
    procedure DAQAI1EventRaw(Sender: TObject; DataCount: Integer;
      Data: OleVariant);
    procedure DAQAI1EventReal(Sender: TObject; DataCount: Integer;
      Data: OleVariant);
    procedure DAQAI1Terminated(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure txtDeviceNumChange(Sender: TObject);
    procedure txtNumOfSampleChange(Sender: TObject);
    procedure txtSampleRateChange(Sender: TObject);
    procedure ScanTimerTimer(Sender: TObject);
    procedure chkCyclicModeClick(Sender: TObject);
    procedure chkEventEnabledClick(Sender: TObject);
    procedure cmdAutoGetClick(Sender: TObject);
    procedure cmdStopAutoGetClick(Sender: TObject);
    procedure cmbClockSourceChange(Sender: TObject);
    procedure cmbTrigSourceChange(Sender: TObject);
    procedure cmbStartChannelChange(Sender: TObject);
    procedure cmbNumChanChange(Sender: TObject);
    procedure ErrorTimerTimer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bRet : Boolean;

implementation

uses GainUnit;

{$R *.DFM}

procedure TForm1.chkFIFOEnabledClick(Sender: TObject);
begin
   if chkFIFOEnabled.State = cbChecked then
   begin
      txtFIFOSize.Enabled := True;
      DAQAI1.FIFOEnabled := True;
      txtFIFOSize.Text := IntToStr(DAQAI1.FIFOSize);
   end
   else
   begin
      txtFIFOSize.Enabled := False;
      DAQAI1.FIFOEnabled := False;
      txtFIFOSize.Text := '0';
   end;
end;

procedure TForm1.chkOverAllGainClick(Sender: TObject);
begin
   if chkOverAllGain.State = cbChecked then
   begin
      cmbInputRange.Enabled := True;
      cmdGainList.Enabled := False;
      DAQAI1.InputRangeMode := adOverallRange;
   end
   else
   begin
      cmbInputRange.Enabled := False;
      cmdGainList.Enabled := True;
      DAQAI1.InputRangeMode := adDifferentRange;
      {Set gain code list}
   end;
end;

procedure TForm1.cmbDataTypeClick(Sender: TObject);
begin
   DAQAI1.DataType := cmbDataType.ItemIndex;
end;

procedure TForm1.cmbTransferModeClick(Sender: TObject);
begin
   DAQAI1.TransferMode := cmbTransferMode.ItemIndex;
end;

procedure TForm1.cmdAcquireStartClick(Sender: TObject);
var
   i : integer;
begin
   lstReading.Clear;

   if DAQAI1.OpenDevice then
   begin
      ShowMessage(DAQAI1.ErrorMessage);
      Exit;
   end;

   if DAQAI1.InputRangeMode = adDifferentRange then
   begin
      gGainCodeList := VarArrayCreate([0, gNumOfChan -1], varSmallint);
      for i := 0 to gNumOfChan -1 do
         gGainCodeList[i] := gGainCodeSave[i];
      DAQAI1.InputRangeList := gGainCodeList;
   end
   else
   begin
      DAQAI1.OverallInputRange := cmbInputRange.ItemIndex;
      if DAQAI1.OverallInputRange < 0 then
      	 DAQAI1.OverallInputRange := 0;
   end;

   {Start getting data}
   bRet := DAQAI1.AcquireStart;
   if bRet then
   begin
      ShowMessage(DAQAI1.ErrorMessage);
      Exit;
   end;

   GroupBox10.Enabled := False;
   
   cmdAcquireStart.Enabled := False;
   cmdAcquireStop.Enabled := True;
   cmdExit.Enabled := False;
   cmdSelectDevice.Enabled := False;
   cmdAutoGet.Enabled := True;
   ErrorTimer.Enabled := True;
end;

procedure TForm1.cmdAcquireStopClick(Sender: TObject);
begin
   GroupBox10.Enabled := True;
   cmdAcquireStart.Enabled := True;
   cmdAcquireStop.Enabled := False;
   cmdExit.Enabled := True;
   cmdSelectDevice.Enabled := True;
   cmdAutoGet.Enabled := False;
   ErrorTimer.Enabled := False;

   {Stop get data}
   bRet := DAQAI1.AcquireStop;
   if bRet then
   begin
      ShowMessage(DAQAI1.ErrorMessage);
      Exit;
   end;

   {Close device}
   bRet := DAQAI1.CloseDevice;
   if bRet then
   begin
      ShowMessage(DAQAI1.ErrorMessage);
      Exit;
   end;
end;

procedure TForm1.cmdGainListClick(Sender: TObject);
begin
   frmGainList.Show;
end;

procedure TForm1.cmdSelectDeviceClick(Sender: TObject);
var
   i : Integer;
   j : Integer;
   strGain : WideString;
begin
   DAQAI1.SelectDevice;

   txtDeviceNum.Text := IntToStr(DAQAI1.DeviceNumber);
   txtDeviceName.Text := DAQAI1.DeviceName;
   
   cmbInputRange.Clear;
   cmbStartChannel.Clear;
   cmbNumChan.Clear;

   gNumOfInputRange := 0;
   gNumOfChan := 0;
   
   {Open device}
   if DAQAI1.OpenDevice then
   begin
      ShowMessage(DAQAI1.ErrorMessage);
      Exit;
   end;

   {Get input range list}
   SetLength(strGain, 30);
   bRet := DAQAI1.GetFirstInputRange(strGain);
   i := 0;
   while bRet = False do
   begin
      gInputRangeList[i] := strGain;
      cmbInputRange.Items.Add(gInputRangeList[i]);
      i := i + 1;
      bRet := DAQAI1.GetNextInputRange(strGain);
   end;
   
   If i <> 0 then
   begin
      cmbInputRange.ItemIndex := 0;
      gNumOfInputRange := i;
   end;

   {Get Max. channel number}
   if DAQAI1.MaxDifferentialChannel > DAQAI1.MaxSingleEndedChannel then
      i := DAQAI1.MaxDifferentialChannel
   else
      i := DAQAI1.MaxSingleEndedChannel;

   if i = 0 then
   begin
      ShowMessage('Function Not Supported');
      DAQAI1.CloseDevice;
      Exit;
   end;

   gNumOfChan := i;

   for j := 0 to i - 1 do
   begin
      cmbStartChannel.Items.Add (IntToStr(j));
      cmbNumChan.Items.Add (IntToStr(j + 1));
      gGainCodeSave[j] := 0;
   end;
   cmbStartChannel.ItemIndex := 0;
   cmbNumChan.ItemIndex := 0;
   DAQAI1.StartChannel := 0;
   DAQAI1.NumberOfChannels := 1;
   DAQAI1.CloseDevice;
end;

procedure TForm1.cmdStatusClick(Sender: TObject);
begin
   txtStatus.Text := IntToStr(DAQAI1.AcquireStatus);
end;

procedure TForm1.DAQAI1EventRaw(Sender: TObject; DataCount: Integer;
  Data: OleVariant);
var
   i : LongInt;
   j : LongInt;
begin
   lstReading.Clear;

   if DataCount > 10 then
      j := 10
   else
      j := DataCount;

   for i := 0 to j - 1 do {DataCount - 1}
      lstReading.Items.Add (IntToStr(Data[i]));
end;

procedure TForm1.DAQAI1EventReal(Sender: TObject; DataCount: Integer;
  Data: OleVariant);
var
   i : LongInt;
   j : LongInt;
begin
   lstReading.Clear;

   if DataCount > 10 then
      j := 10
   else
      j := DataCount;

   for i := 0 to j - 1 do {DataCount - 1}
      lstReading.Items.Add (FormatFloat('0.000000', Data[i]));
end;

procedure TForm1.DAQAI1Terminated(Sender: TObject);
var
   UserData : OleVariant;
   i : Integer;
begin
   ScanTimer.Enabled := False;
   ErrorTimer.Enabled := False;
   GroupBox10.Enabled := True;
   cmdAcquireStart.Enabled := True;
   cmdAcquireStop.Enabled := False;
   cmdExit.Enabled := True;
   cmdAutoGet.Enabled := False;
   cmdStopAutoGet.Enabled := False;
   cmdSelectDevice.Enabled := True;

   lstReading.Clear;
   
   if DAQAI1.DataType = adRaw then
   begin
      UserData := VarArrayCreate([0, 9], varSmallint);
      DAQAI1.GetBufferData(0, 10, UserData);
      for i := 0 to 9 do
      	 lstReading.Items.Add (IntToStr(UserData[i]));
   end
   else
   begin
      UserData := VarArrayCreate([0, 9], varSingle);
      DAQAI1.GetBufferData(0, 10, UserData);
      for i := 0 to 9 do
      	 lstReading.Items.Add (FormatFloat('0.000000', UserData[i]));
   end;
   
   {Stop get data}
   DAQAI1.AcquireStop;
   {Close device}
   DAQAI1.CloseDevice;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   {Select default device}
   cmdSelectDevice.Click();

   {Setting initial value}
   txtDeviceNum.Text := IntToStr(DAQAI1.DeviceNumber);
   txtDeviceName.Text := DAQAI1.DeviceName;
   cmbDataType.ItemIndex := DAQAI1.DataType;
   cmbStartChannel.ItemIndex := DAQAI1.StartChannel;
   cmbNumChan.ItemIndex := DAQAI1.NumberOfChannels - 1;
   cmbTransferMode.ItemIndex := DAQAI1.TransferMode;
   cmbClockSource.ItemIndex := DAQAI1.ClockSource;
   if DAQAI1.ExtTrigger then
      cmbTrigSource.ItemIndex := 1
   else
      cmbTrigSource.ItemIndex := 0;
   DAQAI1.SampleRate := 100;
   DAQAI1.NumberOfSamples := 100;
   lstReading.Clear;
end;

procedure TForm1.txtDeviceNumChange(Sender: TObject);
begin
   DAQAI1.DeviceNumber := StrToInt(txtDeviceNum.Text);
   txtDeviceName.Text := DAQAI1.DeviceName;
end;

procedure TForm1.txtNumOfSampleChange(Sender: TObject);
begin
   DAQAI1.NumberOfSamples := StrToInt(txtNumOfSample.Text);
end;

procedure TForm1.txtSampleRateChange(Sender: TObject);
begin
   DAQAI1.SampleRate := StrToInt(txtSampleRate.Text);
end;

procedure TForm1.ScanTimerTimer(Sender: TObject);
var
   UserData : OleVariant;
   i : Integer;
begin
   lstReading.Clear;
   
   if DAQAI1.DataType = adRaw then
   begin
      UserData := VarArrayCreate([0, 9], varSmallint);
      DAQAI1.GetBufferData(0, 10, UserData);
      for i := 0 to 9 do
      	 lstReading.Items.Add (IntToStr(UserData[i]));
   end
   else
   begin
      UserData := VarArrayCreate([0, 9], varSingle);
      DAQAI1.GetBufferData(0, 10, UserData);
      for i := 0 to 9 do
      	 lstReading.Items.Add (FormatFloat('0.000000', UserData[i]));
   end;
end;

procedure TForm1.chkCyclicModeClick(Sender: TObject);
begin
   if chkCyclicMode.State = cbChecked then
      DAQAI1.CyclicMode := True
   else
      DAQAI1.CyclicMode := False;
end;

procedure TForm1.chkEventEnabledClick(Sender: TObject);
begin
   if chkEventEnabled.State = cbChecked then
      DAQAI1.EventEnabled := True
   else
      DAQAI1.EventEnabled := False;
end;

procedure TForm1.cmdAutoGetClick(Sender: TObject);
begin
   ScanTimer.Enabled := True;
   cmdAcquireStop.Enabled := False;
   cmdAutoGet.Enabled := False;
   cmdStopAutoGet.Enabled := True;
end;

procedure TForm1.cmdStopAutoGetClick(Sender: TObject);
begin
   ScanTimer.Enabled := False;
   cmdAcquireStop.Enabled := True;
   cmdAutoGet.Enabled := True;
   cmdStopAutoGet.Enabled := False;
end;

procedure TForm1.cmbClockSourceChange(Sender: TObject);
begin
   DAQAI1.ClockSource := cmbClockSource.ItemIndex;
end;

procedure TForm1.cmbTrigSourceChange(Sender: TObject);
begin
   if cmbTrigSource.ItemIndex = 1 then
      DAQAI1.ExtTrigger := True;
end;

procedure TForm1.cmbStartChannelChange(Sender: TObject);
var
   i : integer;
   num : integer;
begin
   cmbNumChan.Clear;
   num := gNumOfChan - cmbStartChannel.ItemIndex;
   for i := 1 to num do
      cmbNumChan.Items.Add (IntToStr(i));
   cmbNumChan.ItemIndex := 0;
   DAQAI1.NumberOfChannels := 1;
   DAQAI1.StartChannel := cmbStartChannel.ItemIndex;
end;

procedure TForm1.cmbNumChanChange(Sender: TObject);
begin
   DAQAI1.NumberOfChannels := cmbNumChan.ItemIndex + 1;
end;

procedure TForm1.ErrorTimerTimer(Sender: TObject);
begin
   txtErrorCode.Text := IntToStr(DAQAI1.ErrorCode);
   txtErrorMessage.Text := DAQAI1.ErrorMessage;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   ScanTimer.Enabled := False;
   ErrorTimer.Enabled := False;
   DAQAI1.AcquireStop;
   DAQAI1.CloseDevice;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -