📄 frmmain.pas
字号:
{ 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 + -