📄 counterform.pas
字号:
unit CounterForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,Driver,event,EventThread;
type
TForm1 = class(TForm)
grpDeviceSelection: TGroupBox;
labDeviceName: TLabel;
btnDeviceSelect: TButton;
grpChannel: TGroupBox;
cmbChannel: TComboBox;
grpCntMode: TGroupBox;
cmbCntMode: TComboBox;
grpCntSrc: TGroupBox;
cmbCntSrc: TComboBox;
grpIniVal: TGroupBox;
txtIniVal: TEdit;
rdgCountEdg: TRadioGroup;
rdgCntDir: TRadioGroup;
rdgOPCrtl: TRadioGroup;
grpGateMode: TGroupBox;
grpGateSrc: TGroupBox;
cmbGateSrc: TComboBox;
rdgGatePl: TRadioGroup;
rdgTCInt: TRadioGroup;
grpOutputMode: TGroupBox;
cmbOutputMode: TComboBox;
stResult: TStaticText;
btnStart: TButton;
btnStop: TButton;
ReadTimer: TTimer;
MemoCTRead: TMemo;
procedure FormCreate(Sender: TObject);
procedure btnDeviceSelectClick(Sender: TObject);
procedure btnStartClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure ReadTimerTimer(Sender: TObject);
procedure cmbCntModeChange(Sender: TObject);
procedure rdgOPCrtlClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
lDeviceNum : Longint;
lDriverHandle : Longint;
szDescription : array[0..81] of Char;
ErrCde : LRESULT;
szErrMsg : array[0..80] of Char;
bRun : Boolean;
dwBoardID : DWORD; //Board ID
usMaxCntNum : Smallint; //Max Counter Number
DevFeatures : DEVFEATURES; // structure for device features
ptDevGetFeatures: PT_DeviceGetFeatures;
bGateEnable : Boolean;
usChannel : Smallint; // input port
usMode : Integer ; // counter mode
usCountSrc : Smallint ; // count source
usInitValue : Smallint ; // initial value
usOutputMode : Smallint ; // output mode
usCntEdge : Smallint ; // count edge
usCntDir : Smallint ; // count direction
usOutputEnable : Smallint ; // output enable
usGateSrc : Smallint ; // gate source
usGatePl : Smallint ; // gate polarity
ptEnableEvent : PT_EnableEvent;
ptCounterConfig : PT_CounterConfig;
ptCounterEventStart : PT_CounterEventStart;
EventThread : TEventThread;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
//1. Select device
If(DRV_SelectDevice(Handle, False, lDeviceNum, szDescription)=1) Then
Begin
Application.MessageBox('Can not Open Select Device Dialog', 'Error');
Exit;
End;
labDeviceName.Caption := szDescription;
//2. Open device
ErrCde := DRV_DeviceOpen(lDeviceNum, lDriverHandle);
if (ErrCde <> SUCCESS)Then
Begin
DRV_GetErrorMessage(ErrCde,@szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
Exit;
End;
//3. Get device features
ptDevGetFeatures.buffer := @DevFeatures;
ptDevGetFeatures.size := sizeof(DEVFEATURES);
ErrCde := DRV_DeviceGetFeatures(lDriverHandle, ptDevGetFeatures);
If (ErrCde <> SUCCESS)Then
Begin
DRV_GetErrorMessage(ErrCde, @szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
DRV_DeviceClose(lDriverHandle);
Exit;
End;
//4. Store some device specific parameters
dwBoardID := DevFeatures.dwBoardID;
usMaxCntNum := DevFeatures.usMaxTimerChl;
//5. Close device
ErrCde := DRV_DeviceClose(lDriverHandle);
if(ErrCde <> SUCCESS)Then
Begin
DRV_GetErrorMessage(ErrCde, @szErrMsg);
Application.MessageBox(szErrMsg, 'Driver Message');
Exit;
End;
//6. Init the UI
//Channel ComboBox
cmbChannel.Clear;
If(usMaxCntNum > 0)Then
Begin
for i:=0 to usMaxCntNum-1 do
begin
cmbChannel.Items.Add(IntToStr(i));
end;
end
else
begin
Application.MessageBox('Function Not Supported', 'Warning');
Exit
End;
//Counter Source ComboBox
cmbCntSrc.Clear;
cmbCntSrc.Items.Add('OUT N-1');
cmbCntSrc.Items.Add('CLK N');
cmbCntSrc.Items.Add('CLK N-1');
cmbCntSrc.Items.Add('FOUT 0');
cmbCntSrc.Items.Add('FOUT 1');
if (dwBoardID <> BD_PCM3780) then
begin
cmbCntSrc.Items.Add('FOUT 2');
cmbCntSrc.Items.Add('FOUT 3');
end;
cmbCntSrc.Items.Add('GATE N-1');
cmbChannel.Text := '0';
cmbChannel.ItemIndex := 0;
cmbCntMode.Text := 'A';
cmbCntMode.ItemIndex := 0;
cmbCntSrc.Text := 'CLK N';
cmbCntSrc.ItemIndex := 1;
cmbGateSrc.Text := 'GATE N';
cmbGateSrc.ItemIndex := 1;
cmbOutputMode.Text := 'ACTIVE HIGH PULSE';
cmbOutputMode.ItemIndex := 0;
rdgCountEdg.ItemIndex := 0;
rdgCntDir.ItemIndex := 0;
rdgOPCrtl.ItemIndex := 0;
rdgGatePl.ItemIndex := 0;
rdgTCInt.ItemIndex := 1;
txtIniVal.Text := '1';
grpGateMode.Enabled := False;
bRun := False;
end;
procedure TForm1.btnDeviceSelectClick(Sender: TObject);
begin
FormCreate(Sender);
end;
procedure TForm1.btnStartClick(Sender: TObject);
begin
//Device open
ErrCde := DRV_DeviceOpen(lDeviceNum, lDriverHandle);
bRun := True;
if (ErrCde <> SUCCESS)Then
Begin
DRV_GetErrorMessage(ErrCde,@szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
Exit;
End;
//Get Device feature
ptDevGetFeatures.buffer := @DevFeatures;
ptDevGetFeatures.size := sizeof(DEVFEATURES);
ErrCde := DRV_DeviceGetFeatures(lDriverHandle, ptDevGetFeatures);
If (ErrCde <> SUCCESS)Then
Begin
DRV_GetErrorMessage(ErrCde, @szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
DRV_DeviceClose(lDriverHandle);
Exit;
End;
If ( DevFeatures.usMaxTimerChl = 0)Then
Begin
Application.MessageBox('No Counter Channel','Driver Message');
DRV_DeviceClose(lDriverHandle);
Exit;
End;
//Start counter
//step 1: select count source
case (cmbCntSrc.ItemIndex)of
0: usCountSrc := PA_MODE_COUNT_SRC_OUT_N_M1;
1: usCountSrc := PA_MODE_COUNT_SRC_CLK_N;
2: usCountSrc := PA_MODE_COUNT_SRC_CLK_N_M1;
3: usCountSrc := PA_MODE_COUNT_SRC_FOUT_0;
4: usCountSrc := PA_MODE_COUNT_SRC_FOUT_1;
5: if (dwBoardID <> BD_PCM3780) then
usCountSrc := PA_MODE_COUNT_SRC_FOUT_2
else
usCountSrc := PA_MODE_COUNT_SRC_GATE_N_M1;
6: usCountSrc := PA_MODE_COUNT_SRC_FOUT_3;
7: usCountSrc := PA_MODE_COUNT_SRC_GATE_N_M1;
else usCountSrc := PA_MODE_COUNT_SRC_CLK_N;
end;
//step 2: select count mode
case(cmbCntMode.ItemIndex)of
0: usMode := MODE_A;
1: usMode := MODE_B;
2: usMode := MODE_C;
3: usMode := MODE_D;
4: usMode := MODE_E;
5: usMode := MODE_F;
6: usMode := MODE_G;
7: usMode := MODE_H;
8: usMode := MODE_I;
9: usMode := MODE_J;
10: usMode := MODE_K;
11: usMode := MODE_L;
12: usMode := MODE_O;
13: usMode := MODE_R;
14: usMode := MODE_U;
15: usMode := MODE_X;
else usMode := MODE_A;
end;
//step 3: select channel
usChannel := StrtoInt(cmbChannel.Text);
//step 4: select initial value
usInitValue := StrtoInt(txtIniVal.Text);
//step 5: select counting edge
if( rdgCountEdg.ItemIndex = 0)then
usCntEdge := PA_MODE_COUNT_RISE_EDGE
else
usCntEdge := PA_MODE_COUNT_FALL_EDGE;
//step 6: select counting direction
if(rdgCntDir.ItemIndex = 0)then
usCntDir := PA_MODE_COUNT_UP
else
usCntDir := PA_MODE_COUNT_DOWN;
//step 7 select output control
if( rdgOPCrtl.ItemIndex = 0)then
begin
usOutputEnable := PA_MODE_ENABLE_OUTPUT;
case (cmbOutputMode.ItemIndex)of
0: usOutputMode := PA_MODE_ACT_HIGH_TC_PULSE;
1: usOutputMode := PA_MODE_ACT_LOW_TC_PULSE;
2: usOutputMode := PA_MODE_TC_TOGGLE_FROM_LOW;
3: usOutputMode := PA_MODE_TC_TOGGLE_FROM_HIGH;
else
usOutputMode := PA_MODE_ACT_HIGH_TC_PULSE;
end;
end
else
begin
usOutputEnable := PA_MODE_DISABLE_OUTPUT;
usOutputMode := 0;
end;
//step 8 slect the Gate parameters
if(grpGateMode.Enabled = True)then
begin
bGateEnable := True;
case(cmbGateSrc.ItemIndex)of
0: usGateSrc := PA_MODE_GATE_SRC_OUT_N_M1;
1: usGateSrc := PA_MODE_GATE_SRC_GATE_N;
2: usGateSrc := PA_MODE_GATE_SRC_GATE_N_M1;
else
usGateSrc := PA_MODE_GATE_SRC_OUT_N_M1;
end;
if(rdgGatePl.ItemIndex=0)then
usGatePl := PA_MODE_GATE_POSITIVE
else
usGatePl := PA_MODE_GATE_NEGATIVE;
end
else
begin
usGateSrc := PA_MODE_GATE_SRC_GATE_NO;
usGatePl := 0;
bGateEnable := False;
end;
//start counter
ptCounterConfig.usCounter := usChannel;
ptCounterConfig.usInitValue := usInitValue;
ptCounterConfig.usCountMode := usMode;
ptCounterConfig.usCountDirect := usCntDir;
ptCounterConfig.usCountEdge := usCntEdge;
ptCounterConfig.usOutputEnable := usOutputEnable;
ptCounterConfig.usOutputMode := usOutputMode;
ptCounterConfig.usClkSrc := usCountSrc;
ptCounterConfig.usGateSrc := usGateSrc;
ptCounterConfig.usGatePolarity := usGatePl;
ErrCde := DRV_CounterConfig(lDriverHandle,ptCounterConfig);
if(ErrCde <> SUCCESS)then
begin
DRV_GetErrorMessage(ErrCde,@szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
DRV_DeviceClose(lDriverHandle);
Exit;
end;
ptCounterEventStart.counter := usChannel;
ErrCde := DRV_CounterEventStart(lDriverHandle,ptCounterEventStart);
if(ErrCde <> SUCCESS)then
begin
DRV_GetErrorMessage(ErrCde, @szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
DRV_DeviceClose(lDriverHandle);
Exit;
end;
//enable event
if( rdgTCInt.ItemIndex = 0)then
begin
ptEnableEvent.Enabled := 1;
ptEnableEvent.Count := 1;
case(usChannel)of
0: ptEnableEvent.EventType := ADS_EVT_TERMINATE_CNT0;
1: ptEnableEvent.EventType := ADS_EVT_TERMINATE_CNT1;
2: ptEnableEvent.EventType := ADS_EVT_TERMINATE_CNT2;
3: ptEnableEvent.EventType := ADS_EVT_TERMINATE_CNT3;
4: ptEnableEvent.EventType := ADS_EVT_TERMINATE_CNT4;
5: ptEnableEvent.EventType := ADS_EVT_TERMINATE_CNT5;
6: ptEnableEvent.EventType := ADS_EVT_TERMINATE_CNT6;
7: ptEnableEvent.EventType := ADS_EVT_TERMINATE_CNT7;
end;
ErrCde := DRV_EnableEvent(lDriverHandle,ptEnableEvent);
if(ErrCde <> SUCCESS)then
begin
DRV_GetErrorMessage(ErrCde,@szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
DRV_DeviceClose(lDriverHandle);
Exit;
end;
//start thread
EventThread := TEventThread.Create(lDriverHandle);
end;
ReadTimer.Enabled := True;
btnStart.Enabled := False;
grpChannel.Enabled := False;
grpCntMode.Enabled := False;
grpCntSrc.Enabled := False;
grpDeviceSelection.Enabled := False;
if(bGateEnable = True)then
begin
grpGateMode.Enabled := False;
end;
grpIniVal.Enabled := False;
rdgCntDir.Enabled := False;
rdgCountEdg.Enabled := False;
if(rdgOPCrtl.ItemIndex = 0)then
begin
cmbOutputMode.Enabled := False;
end;
rdgOPCrtl.Enabled := False;
rdgTCInt.Enabled := False;
btnStop.Enabled := True;
end;
procedure TForm1.btnStopClick(Sender: TObject);
begin
ReadTimer.Enabled := False;
if(rdgTCInt.ItemIndex = 0)then
begin
//stop thread
EventThread.Terminate;
EventThread.WaitFor;
//stop event
ptEnableEvent.Enabled := 0;
ptEnableEvent.Count := 1;
ErrCde := DRV_EnableEvent(lDriverHandle,ptEnableEvent);
if(ErrCde <> SUCCESS)then
begin
DRV_GetErrorMessage(ErrCde,@szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
end;
end;
//reset counter
ErrCde := DRV_CounterReset(lDriverHandle,usChannel);
if(ErrCde <> SUCCESS)then
begin
DRV_GetErrorMessage(ErrCde,@szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
end;
//close device
DRV_DeviceClose(lDriverHandle);
bRun := False;
btnStart.Enabled := True;
grpChannel.Enabled := True;
grpCntMode.Enabled := True;
grpCntSrc.Enabled := True;
grpDeviceSelection.Enabled := True;
if(bGateEnable = True)then
begin
grpGateMode.Enabled := True;
end;
grpIniVal.Enabled := True;
rdgCntDir.Enabled := True;
rdgCountEdg.Enabled := True;
if(rdgOPCrtl.ItemIndex = 0)then
begin
cmbOutputMode.Enabled := True;
end;
rdgOPCrtl.Enabled := True;
rdgTCInt.Enabled := True;
btnStop.Enabled := False;
end;
procedure TForm1.ReadTimerTimer(Sender: TObject);
var
ptCounterEventRead : PT_CounterEventRead;
gwOverflow : Smallint;
gdwReading : Longint;
begin
ptCounterEventRead.counter := usChannel;
ptCounterEventRead.overflow := @gwOverflow;
ptCounterEventRead.count := @gdwReading;
ErrCde := DRV_CounterEventRead(lDriverHandle,ptCounterEventRead);
if(ErrCde <> SUCCESS)then
begin
DRV_GetErrorMessage(ErrCde,@szErrMsg);
Application.MessageBox(szErrMsg,'Driver Message');
btnStopClick(Sender);
Exit;
end;
stResult.Caption := InttoStr(gdwReading);
end;
procedure TForm1.cmbCntModeChange(Sender: TObject);
begin
if((cmbCntMode.ItemIndex<>0) And (cmbCntMode.ItemIndex<>3) and (cmbCntMode.ItemIndex<>6) and (cmbCntMode.ItemIndex<>9))then
grpGateMode.Enabled := True
else
grpGateMode.Enabled := False;
end;
procedure TForm1.rdgOPCrtlClick(Sender: TObject);
begin
if(rdgOPCrtl.ItemIndex = 0)then
cmbOutputMode.Enabled := True
else
cmbOutputMode.Enabled := False;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if(bRun = True)then
begin
btnStopClick(Sender);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -