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

📄 frmmain.pas

📁 usb4711A数据采集卡的AD转换通道程序
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      
  { Step 1: Device open }
  ErrCde := DRV_DeviceOpen(dwDeviceNum, DeviceHandle);
  If (ChkErr(ErrCde)) Then
    Exit;
  
  { Step 2: Get device features }
  ptDevGetFeatures.buffer := @lpDevFeatures;
  ErrCde := DRV_DeviceGetFeatures(DeviceHandle, ptDevGetFeatures);
  If (ChkErr(ErrCde)) Then
  begin
    DRV_DeviceClose(DeviceHandle);
    Exit;
  end;

  { Step 3: Allocate memory for driver }
  hBuf := GlobalAlloc(GPTR, sizeof(Single) * (gulConvNum + 1));
  if (hBuf = 0) then
  begin
    Application.MessageBox('Not enough memory for buffer', 'Error!!', MB_OK);
    DRV_DeviceClose(DeviceHandle);
    Exit;
  end;

  { Step 4: Allocate memory for Voltage data or Raw data }
   GlobalUnlock(hUserbuf);
  GlobalFree(hUserbuf);

  If (gbDataType) Then
  begin
     hUserbuf := GlobalAlloc(GPTR, sizeof(Single) * (gulConvNum + 1));
  end
  Else
  begin
     hUserbuf := GlobalAlloc(GPTR, sizeof(Word) * (gulConvNum + 1));
  end;
   ptFAITransfer.DataBuffer := Pointer(GlobalLock(hUserbuf));

  { prepare some informations to run }

  ptFAIIntStart.buffer := Pointer(GlobalLock(hbuf));

  { Step 5: Enable event feature }
  ptEnableEvent.EventType := ADS_EVT_INTERRUPT Or
                             ADS_EVT_BUFCHANGE Or
                             ADS_EVT_OVERRUN   Or
                             ADS_EVT_TERMINATED;
  ptEnableEvent.Enabled := Smallint(gbEvtFlag);
  If (gbFifoEnable And (gwFifoSize > 0)) Then
     ptEnableEvent.Count := gwFifoSize
  Else
     ptEnableEvent.Count := 1;
  ErrCde := DRV_EnableEvent(DeviceHandle, ptEnableEvent);
  If (ChkErr(ErrCde)) Then
  begin
    GlobalUnlock(hBuf);
    GlobalFree(hBuf);
    GlobalUnlock(hUserbuf);
    GlobalFree(hUserbuf);
    DRV_DeviceClose(DeviceHandle);
    Exit;
  end;

  ptFAIIntStart.TrigSrc := gwExtTrig;
  ptFAIIntStart.SampleRate := gdwPacerRate;
  ptFAIIntStart.chan := gwStartChl;
  ptFAIIntStart.gain := lpDevFeatures.glGainList[gwGainCode].usGainCde;
  ptFAIIntStart.Count := gulConvNum;
  ptFAIIntStart.Cyclic := Smallint(gbCyclicCount);
  If (gbFifoEnable And (gwFifoSize > 0)) Then
    ptFAIIntStart.IntrCount := gwFifoSize
  Else
    ptFAIIntStart.IntrCount := 1;

  ErrCde := DRV_FAIIntStart(DeviceHandle, ptFAIIntStart);
  If (ChkErr(ErrCde)) Then
  begin
    GlobalUnlock(hBuf);
    GlobalFree(hBuf);
    GlobalUnlock(hUserbuf);
    GlobalFree(hUserbuf);
    DRV_DeviceClose(DeviceHandle);
    Exit;
  end;
    frmCheck.btnExit.Caption := 'Terminate';
   ulIntCounter := 0;
   ulBfChgCounter := 0;
   if gbEvtFlag  then
   begin
     bThreadloop := true;
     chkThread :=CheckThread.Create(false);
   end;
   frmCheck.prgStatus.Max := gulConvNum;
   frmCheck.prgStatus.Position :=0;
   frmCheck.tmrCheck.Enabled := true;
   frmCheck.Show();


  { disable controls }
  cmdStop.Enabled := True;
  cmdRun.Enabled := False;
  cmdExit.Enabled := False;
  DeviceSelect.Enabled := False;
  cmbScanChl.Enabled := False;
  Cyclic.Enabled := False;
  Datafloat.Enabled := False;
  Inprange.Enabled := False;
  Internal.Enabled := False;
  External.Enabled := False;
  bRun := True;
  Enabled := False;

 end;

procedure TFrmADInt.cmdStopClick(Sender: TObject);
var
     dwExitCode : DWORD;
begin
  ErrCde := DRV_FAITerminate(DeviceHandle);
  If (ChkErr(ErrCde)) Then
  begin
    bThreadloop := false;
    chkThread.Terminate();
    DRV_DeviceClose(DeviceHandle);
    Exit;
  end;
  if(not Evtenable.Checked) then
  begin
    Terminate();
  end;
end;


procedure TFrmADInt.CheckEvent();
var
    usEventType : integer;
begin
    ulIntCounter := 0;
    ulBfChgCounter := 0;


    while( bThreadloop = true )   do
    begin
        ptCheckEvent.EventType := @usEventType;
        if ( gbCyclicCount  ) then
            ptCheckEvent.Milliseconds := INFINITE
        else
            ptCheckEvent.Milliseconds := (1000 * gulConvNum) div gdwPacerRate + 2000;;


        ErrCde := DRV_CheckEvent(DeviceHandle,ptCheckEvent);
        If (ChkErr(ErrCde)) Then
        begin
           cmdStopClick(nil);
           Exit;
        end;

        // Process interrupt event
        if ((usEventType and ADS_EVT_INTERRUPT)<>0 ) then
            ulIntCounter:=ulIntCounter+1;

        // Process buffer change event
        if ((usEventType and ADS_EVT_BUFCHANGE)<>0 )  then
            ulBfChgCounter:=ulBfChgCounter+1;

        // Process overrun event
        if ((usEventType and ADS_EVT_OVERRUN) <>0 ) then
            ulOverrunCounter:=ulOverrunCounter+1;

        frmCheck.txtInt.Text := IntToStr(ulIntCounter);
        frmCheck.txtBuffChange.Text := IntToStr(ulBfChgCounter);

        // Process terminate event
        if ((usEventType and ADS_EVT_TERMINATED) <>0 )  then
        begin
             bThreadloop := false;
            Terminate();
            Exit;
        end;
    end;


end;
procedure TFrmADInt.Terminate();
var
  i : Integer;
  tempStr : AnsiString;
  p        : Pointer;
begin

  { Step 1: Stop A/D conversion for high speed }
  chkThread.Terminate;

  frmCheck.tmrCheck.Enabled := false;
  frmCheck.btnExit.Caption := 'Waiting';
  Enabled := true;
  { Step 2: Get real voltage of Buffer from driver memory buffer }
  ptFAITransfer.Overrun := @gwOverrun;
  ptFAITransfer.Count := gulConvNum;
  ptFAITransfer.start := 0;                   { Start from buffer begging }
  ptFAITransfer.ActiveBuf := 0;               { Single buffer }
  ptFAITransfer.DataType := Smallint(gbDataType);
  ErrCde := DRV_FAITransfer(DeviceHandle, ptFAITransfer);
  If (ChkErr(ErrCde)) Then
  begin
    DRV_DeviceClose(DeviceHandle);
    Exit;
  end;

  { Step 3: Display data }

    p := ptFAITransfer.DataBuffer;

  For i := 0 To ptFAITransfer.Count - 1 do
  begin
    If (gbDataType) Then         { voltage data }
    begin
        tempStr := Format('Buff[%d] = %10.6f',[i+gwStartChl,single(p^)]);
       Longint(p) := Longint(p) + SizeOf(Single);
    end
    else
    begin
        tempStr := Format('Buff[%d] = ',[i+gwStartChl]);
        tempStr := tempStr + IntToHex( Word(p^), 3 );
        Longint(p) := Longint(p) + SizeOf(Word);
    end;
    Datalist.Items.Add(tempStr);
  end;

  { close device }
  DRV_DeviceClose(DeviceHandle);
  Sleep(0);
  GlobalUnlock(hBuf);
  GlobalFree(hBuf);
   cmdRun.Enabled := True;
  cmdStop.Enabled := False;
  cmdExit.Enabled := True;
  DeviceSelect.Enabled := True;
  cmbScanChl.Enabled := True;
  Cyclic.Enabled := True;
  Datafloat.Enabled := True;
  Inprange.Enabled := True;
  Internal.Enabled := True;
  External.Enabled := True;
  bRun := False;
  frmCheck.Close;

end;

procedure TFrmADInt.FormCreate(Sender: TObject);
begin
  gwGainCode := 0;
  gdwPacerRate := 1000;               { pacer rate }
  gulConvNum := 1000;                 { conversion number }
  gwStartChl := 0;                    { scan channels }
  gbDataType := True;                 { display type : FLOAT(1) }
  gbEvtFlag := True;                  { event enable(0) }
  gbFifoEnable := False;              { Fifo disable(0) }
  gwGainList := 0;                    { gain list flag }
  gwExtTrig := 0;                     { external or internal trigger }
  gwCyclicMode := 0;                  { cyclic or non-cyclic mode }
  gwBufferMode := 0;                  { buffer: single or double }
  gwIntrCount := 1;
  gbCyclicCount := False;             { number of cyclic count }
  gwActiveBuf := 0;                   { return by FAICheck }
  gwOverrun := 0;                     { return by FAICheck, FAITransfer }
  gwStopped := 0;                     { return by FAICheck }
  gulRetrieved := 0;                  { return by FAICheck }
  gwHalfReady := 0;                   { return by FAICheck }
  gwFifoSize := 0;
end;

procedure TFrmADInt.cmdExitClick(Sender: TObject);
begin
  GlobalUnlock(hUserbuf);
  GlobalFree(hUserbuf);

  Close();
end;

end.



⌨️ 快捷键说明

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