📄 mainform.pas
字号:
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Driver, Thread ,Math;
type
TfrmMain = class(TForm)
Label2: TLabel;
GroupBox9: TGroupBox;
Label1: TLabel;
Label3: TLabel;
editScanNum: TEdit;
cmbChannel: TComboBox;
butStart: TButton;
butStop: TButton;
lstDevice: TListBox;
butExit: TButton;
GroupBox2: TGroupBox;
radRawData: TRadioButton;
radVoltage: TRadioButton;
GroupBox3: TGroupBox;
radClockInternal: TRadioButton;
radClockExternal0: TRadioButton;
radClockExternal1: TRadioButton;
GroupBox1: TGroupBox;
Label8: TLabel;
Label7: TLabel;
Label13: TLabel;
Label17: TLabel;
radPacer: TRadioButton;
radPost: TRadioButton;
radDelay: TRadioButton;
radAbout: TRadioButton;
editDelayCount: TEdit;
GroupBox4: TGroupBox;
Label9: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
radDigital: TRadioButton;
radAI0: TRadioButton;
radAI1: TRadioButton;
radAI3: TRadioButton;
radAI2: TRadioButton;
editTrigVolt: TEdit;
GroupBox5: TGroupBox;
radCyclic: TRadioButton;
radNonCyclic: TRadioButton;
GroupBox6: TGroupBox;
radRising: TRadioButton;
radFalling: TRadioButton;
GroupBox7: TGroupBox;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
chkBufferChange: TCheckBox;
chkTerminate: TCheckBox;
chkOverrun: TCheckBox;
editOverrunTime: TEdit;
chkInterrupt: TCheckBox;
edtEventCount: TEdit;
GroupBox8: TGroupBox;
radOverall: TRadioButton;
radGainList: TRadioButton;
cmbGain: TComboBox;
butGainList: TButton;
GroupBox10: TGroupBox;
Label4: TLabel;
Label6: TLabel;
Label21: TLabel;
Label22: TLabel;
editPacerRate: TEdit;
GroupBox11: TGroupBox;
Label5: TLabel;
editCount: TEdit;
GroupBox12: TGroupBox;
radInternal: TRadioButton;
radExternal: TRadioButton;
Label24: TLabel;
Label23: TLabel;
procedure FormCreate(Sender: TObject);
procedure lstDeviceClick(Sender: TObject);
procedure butStartClick(Sender: TObject);
procedure radGainListClick(Sender: TObject);
procedure radOverallClick(Sender: TObject);
procedure butGainListClick(Sender: TObject);
procedure radPacerClick(Sender: TObject);
procedure radPostClick(Sender: TObject);
procedure CheckEvent();
procedure InterruptEvent();
procedure BufChangeEvent();
procedure OverrunEvent();
procedure TerminateEvent();
procedure butStopClick(Sender: TObject);
procedure radCyclicClick(Sender: TObject);
procedure radNonCyclicClick(Sender: TObject);
procedure radRawDataClick(Sender: TObject);
procedure radVoltageClick(Sender: TObject);
procedure radClockInternalClick(Sender: TObject);
procedure radClockExternal0Click(Sender: TObject);
procedure radClockExternal1Click(Sender: TObject);
procedure radInternalClick(Sender: TObject);
procedure radExternalClick(Sender: TObject);
procedure radRisingClick(Sender: TObject);
procedure radFallingClick(Sender: TObject);
procedure radDigitalClick(Sender: TObject);
procedure radAI0Click(Sender: TObject);
procedure radAI1Click(Sender: TObject);
procedure radAI2Click(Sender: TObject);
procedure radAI3Click(Sender: TObject);
procedure radDelayClick(Sender: TObject);
procedure radAboutClick(Sender: TObject);
procedure butExitClick(Sender: TObject);
procedure cmbGainChange(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
chkThread : CheckThread;
public
{ Public declarations }
Function DoesErr(var lErrCode: LongInt): integer;
Function PhyChanToLogChan(DevCfg:Driver.DEVCONFIG_AI;PhyChan:smallint): smallint;
end;
var
frmMain: TfrmMain;
DevFeature : DEVFEATURES; // structure for device features
ptDevFeatures : PT_DeviceGetFeatures;
DevConfig_AI : Driver.DEVCONFIG_AI;
ptAIGetConfig : PT_AIGetConfig;
ptFAIDmaExStart : PT_FAIDmaExStart; // FAIIntStart table
ptFAITransfer : PT_FAITransfer; // FAITransfer table
ptFAICheck : PT_FAICheck; // FAICheck table
ptEnableEvent : PT_EnableEvent; // Enable event
ptCheckEvent : PT_CheckEvent; // Check event
hUserBuf : HGLOBAL;//Pointer;
hDisplayBuf : HGLOBAL;
gdwPacerRate : Longint = 250000; // pacer rate
gulConvNum : Longint = 200000;//40960; // conversion number
gwStartChl : Smallint = 0;
gwChlNum : Smallint = 1; // scan channels
gwDataType : Smallint = 1; // display type : FLOAT(1)
gwEvtFlag : Smallint = 1; // event enable(0)
gwActualBufSize : Longint = 0; // actual allocate buffer size
gwFifoEnable : Smallint = 0; // Fifo disable(0)
gwGainList : Smallint = 0; // gain list flag
gdwStartPt : Longint = 0;
gdwStopPt : Longint = 99; // display points
gwExtTrig : Smallint = 0; // external or internal trigger
gwClockSrc : Smallint = 0; // Clock source
gwTrigEdge : Smallint = 0; // Trigger edge
gwSRCType : Smallint = 0; // Source type
gwTrigVol : single = 0.0; // Trigger voltage
gwCyclicMode : Smallint = 1; // cyclic or non-cyclic mode
gwTrigMode : Smallint = 0; // Trigger Mode
gwIntrCount : Smallint = 1;
gwCyclicCount : Longint = 1; // number of cyclic count
gwActiveBuf : Smallint = 0; // return by FAICheck
gwOverrun : Smallint = 0; // return by FAICheck, FAITransfer
gwStopped : Smallint = 0; // return by FAICheck
gulRetrieved : Longint = 0; // return by FAICheck
gwHalfReady : Smallint = 0; // return by FAICheck
gwDelayCnt : Longint = 2;
bThreadloop : Boolean = true;
gwDevice : Smallint = 0;
gwSubDevice : Smallint = 0; // Device index
gnNumOfDevices : Smallint;
gnNumOfSubdevices: Smallint; // number of installed devices
szErrMsg : string; // Use for MESSAGEBOX function
szBuffer : string; // Temperatory buffer
ErrCde : Longint; // Return error code
DeviceList : array[0..99] of PT_DEVLIST;
SubDeviceList : array[0..99] of PT_DEVLIST;
DriverHandle : Longint = 0; // driver handle
fVoltageArray : array[0..64] of single;
gwGainCde : array[0..64] of Smallint;
ReorderGainCode : array[0..64] of Smallint;
gwMaxLogChanNum : Smallint;
gwGain : array[0..64] of Smallint ;
usStartChan, usChanNum : Smallint;
gulIntCounter : Longint = 0;
gulBfChgCounter : Longint = 0;
gulOverrunCounter : Longint = 0;
gulOverrunTime : Longint = 10000;
gulEventCount : Longint = 1;
szCounter : string;
MAX_DEVICES : Longint = 99;
bBufferChange : Boolean = true;
bInterrupt : Boolean = true;
bOverrun : Boolean = true;
bTerminate : Boolean = true;
Function GetMaxLogChanNum(DevCfg:Driver.DEVCONFIG_AI;DevFeature:Driver.DEVFEATURES): smallint;
implementation
uses DislpayForm,GainListForm;
{$R *.dfm}
{*************************************************************
* Function: Handle the error code. If the input error code > 0,
* it means some error apperent. This function can
* show the error message to a message box and stop
* this application.
* Input: The error code.
* return: none
************************************************************* }
Function TfrmMain.DoesErr(var lErrCode: LongInt): integer;
var
szErrMsg : string[100];
pszErrMsg : PChar;
begin
{Check the pressed error code}
If (lErrCode <> 0) Then
begin
pszErrMsg := @szErrMsg;
DRV_GetErrorMessage(lErrCode, pszErrMsg);
Application.MessageBox(pszErrMsg, 'Error!!', MB_OK);
DoesErr := 1;
end
else
DoesErr := 0;
end;
Function TfrmMain.PhyChanToLogChan(DevCfg:Driver.DEVCONFIG_AI;PhyChan:smallint): smallint;
var
i :smallint;
FunResult:smallint;
begin
if(DevCfg.ulChanConfig = 1) then
begin
PhyChanToLogChan := PhyChan;
Exit;
end;
FunResult := 0;
i := 0;
while (i <=Min(PhyChan,31)) do
begin
if ((DevCfg.ulChanConfig and (1 shl i))<>0) then i:= i+1;
FunResult := FunResult + 1;
i := i+1;
end;
if(phychan >= 32) then
begin
i := 32;
while i<=phychan do
begin
if((DevCfg.ulChanConfigEx[0] and (1 shl (i-32)))<>0) then i := i+1;
FunResult := FunResult + 1;
i := i+1;
end;
end;
PhyChanToLogChan := FunResult -1;
end;
Function GetMaxLogChanNum(DevCfg:Driver.DEVCONFIG_AI;DevFeature:Driver.DEVFEATURES): smallint;
var
i :smallint;
FunResult : smallint;
begin
if(DevCfg.ulChanConfig = 1) then
begin
GetMaxLogChanNum := DevFeature.usMaxAIDiffChl;
Exit;
end;
FunResult := 0;
i := 0;
while (i < DevFeature.usMaxAISiglChl) do
begin
if(i <32) then
begin
if ((DevCfg.ulChanConfig and (1 shl i))<>0) then i:= i+1;
end
else
if ((DevCfg.ulChanConfigEx[0] and (1 shl (i-32)))<>0) then i:= i+1;
FunResult := FunResult + 1;
i := i+1;
end;
GetMaxLogChanNum := FunResult ;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
var
nOutEntries : Smallint;
i : integer;
begin
ErrCde := DRV_DeviceGetNumOfList(gnNumOfDevices);
if( DoesErr(ErrCde) = 1 ) then
Exit;
if (gnNumOfDevices > MAX_DEVICES ) then
gnNumOfDevices := MAX_DEVICES;
// Add type of PC Laboratory Card
ErrCde := DRV_DeviceGetList(DeviceList[0],gnNumOfDevices, nOutEntries);
if( DoesErr(ErrCde) = 1 ) then
Exit;
// Here MaxEntries = nOutEntries
for i := 0 to gnNumOfDevices-1 do
lstDevice.Items.Add( DeviceList[i].szDeviceName );
for i:=0 to 63 do
gwGain[i]:=0;
lstDevice.ItemIndex := gwDevice;
lstDeviceClick(Sender);
butStop.Enabled := False;
end;
procedure TfrmMain.lstDeviceClick(Sender: TObject);
var
i : Smallint;
begin
cmbGain.Clear();
gwDevice := lstDevice.ItemIndex;
ErrCde := DRV_DeviceOpen(DeviceList[gwDevice].dwDeviceNum, DriverHandle);
if( DoesErr(ErrCde) = 1 ) then
Exit;
// get device features
ptDevFeatures.buffer := @DevFeature;
ptDevFeatures.size := SizeOf(DEVFEATURES);
ErrCde := DRV_DeviceGetFeatures(DriverHandle, ptDevFeatures);
if DoesErr(ErrCde) = 1 then
begin
DRV_DeviceClose(DriverHandle);
Exit;
end;
// get AI configuration
ptAIGetConfig.size := SizeOf(DEVCONFIG_AI);
ptAIGetConfig.buffer := @DevConfig_AI;
ErrCde := DRV_AIGetConfig(DriverHandle, ptAIGetConfig);
if DoesErr(ErrCde) = 1 then
begin
DRV_DeviceClose(DriverHandle);
butStart.Enabled := false;
Exit;
end;
// initialize Input Range List Combobox with device features
if (DevFeature.usNumGain <> 0) then
begin
for i := 0 to DevFeature.usNumGain-1 do
cmbGain.Items.Add(DevFeature.glGainList[i].szGainStr);
cmbGain.ItemIndex := 0;
end;
// Initialize Start Channel
cmbChannel.Clear();
for i := 0 to DevFeature.usMaxAISiglChl-1 do
begin
cmbChannel.Items.Add(InttoStr(i));
end;
cmbChannel.ItemIndex := 0;
gwMaxLogChanNum := GetMaxLogChanNum(DevConfig_AI,DevFeature);
butStart.Enabled := true;
// close device
DRV_DeviceClose(DriverHandle);
end;
procedure TfrmMain.butStartClick(Sender: TObject);
var
//temp : integer;
i : integer;
LogChan : integer;
begin
gwTrigVol := StrToInt(editTrigVolt.Text);
gwDelayCnt := StrToInt(editDelayCount.Text);
gdwPacerRate := StrToInt(editPacerRate.Text);
gulConvNum := StrToInt(editCount.Text);
gwStartChl := cmbChannel.ItemIndex;
gwChlNum := StrToInt(editScanNum.Text);
if(radInternal.Checked) then
gwExtTrig := 0
else
gwExtTrig :=1;
for i:=0 to 63 do
gwGainCde[i]:= DevFeature.glGainList[gwGain[i]].usGainCde;
LogChan := frmMain.PhyChanToLogChan(DevConfig_AI,gwStartChl);
for i:=0 to Min(gwChlNum-1,gwMaxLogChanNum-1) do
begin
ReorderGainCode[i] := gwGainCde[(LogChan + i) Mod gwMaxLogChanNum];
end;
ErrCde := DRV_DeviceOpen(DeviceList[gwDevice].dwDeviceNum,
DriverHandle);
if DoesErr(ErrCde) = 1 then
begin
DRV_DeviceClose(DriverHandle);
Exit;
end;
// allocate memory
hUserBuf :=GlobalAlloc(GPTR, SizeOf(single) *gulConvNum);
if (hUserBuf = 0 ) then
begin
DRV_DeviceClose(DriverHandle);
Exit;
end;
// allocate memory
hDisplayBuf :=GlobalAlloc(GPTR, SizeOf(single) * gulConvNum);
if (hDisplayBuf = 0) then
begin
DRV_DeviceClose(DriverHandle);
Exit;
end ;
ptFAITransfer.DataBuffer := Pointer(GlobalLock(hDisplayBuf));
// enable event
ptEnableEvent.EventType := 0;
if( chkBufferChange.Checked ) then
ptEnableEvent.EventType :=ptEnableEvent.EventType or ADS_EVT_BUFCHANGE;
if( chkTerminate.Checked ) then
ptEnableEvent.EventType := ptEnableEvent.EventType or ADS_EVT_TERMINATED;
if( chkOverrun.Checked ) then
ptEnableEvent.EventType := ptEnableEvent.EventType or ADS_EVT_OVERRUN;
if( chkInterrupt.Checked ) then
ptEnableEvent.EventType:= ptEnableEvent.EventType or ADS_EVT_INTERRUPT;
ptEnableEvent.Enabled := 1;
ptEnableEvent.Count := StrToInt(edtEventCount.Text) * 2048;
ErrCde := DRV_EnableEvent(DriverHandle,ptEnableEvent);
if DoesErr(ErrCde) = 1 then
begin
GlobalFree(HGLOBAL(hUserBuf));
GlobalFree(HGLOBAL(hDisplayBuf));
DRV_DeviceClose(DriverHandle);
Exit;
end;
ptFAIDmaExStart.TrigSrc := gwExtTrig;
ptFAIDmaExStart.TrigMode := gwTrigMode;
ptFAIDmaExStart.ClockSrc := gwClockSrc;
ptFAIDmaExStart.TrigEdge := gwTrigEdge;
ptFAIDmaExStart.SRCType := gwSRCType;
ptFAIDmaExStart.CyclicMode := gwCyclicMode;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -