📄 mainform.pas
字号:
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Driver, Thread, event, paras;
type
TfrmMain = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
txtDeviceName: TEdit;
cmdSelectDevice: TButton;
chkFDiPatternMatch: TCheckBox;
chkTimer: TCheckBox;
chkStatusChange: TCheckBox;
txtPatternMatchEvent: TEdit;
txtCounterEvent: TEdit;
txtStatusChangeEvent: TEdit;
txtPatternMatchValue: TEdit;
txtCounterValue: TEdit;
txtChangeStatusChannel: TEdit;
grpDiInterrupt: TGroupBox;
GroupBox1: TGroupBox;
lstDiSignalCondition7: TListBox;
lstDiSignalCondition6: TListBox;
lstDiSignalCondition5: TListBox;
lstDiSignalCondition4: TListBox;
lstDiSignalCondition3: TListBox;
lstDiSignalCondition2: TListBox;
lstDiSignalCondition1: TListBox;
lstDiSignalCondition0: TListBox;
ListBox9: TListBox;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
chkDiInterrupt0: TCheckBox;
chkDiInterrupt1: TCheckBox;
chkDiInterrupt2: TCheckBox;
chkDiInterrupt3: TCheckBox;
chkDiInterrupt4: TCheckBox;
chkDiInterrupt5: TCheckBox;
chkDiInterrupt6: TCheckBox;
chkDiInterrupt7: TCheckBox;
txtDiInterrupt1: TEdit;
txtDiInterrupt2: TEdit;
txtDiInterrupt3: TEdit;
txtDiInterrupt0: TEdit;
txtDiInterrupt4: TEdit;
txtDiInterrupt5: TEdit;
txtDiInterrupt6: TEdit;
txtDiInterrupt7: TEdit;
cmdStart: TButton;
cmdStop: TButton;
cmdExit: TButton;
procedure cmdSelectDeviceClick(Sender: TObject);
procedure cmdStartClick(Sender: TObject);
procedure cmdStopClick(Sender: TObject);
procedure EnableControls(bEnabled : boolean );
procedure cmdExitClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure chkDiInterrupt0Click(Sender: TObject);
procedure chkDiInterrupt1Click(Sender: TObject);
procedure chkDiInterrupt2Click(Sender: TObject);
procedure chkDiInterrupt3Click(Sender: TObject);
procedure chkDiInterrupt4Click(Sender: TObject);
procedure chkDiInterrupt5Click(Sender: TObject);
procedure chkDiInterrupt6Click(Sender: TObject);
procedure chkDiInterrupt7Click(Sender: TObject);
procedure chkFDiPatternMatchClick(Sender: TObject);
procedure chkTimerClick(Sender: TObject);
procedure chkStatusChangeClick(Sender: TObject);
procedure txtPatternMatchValueChange(Sender: TObject);
procedure txtPatternMatchValueKeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure lstDiSignalCondition7Click(Sender: TObject);
procedure lstDiSignalCondition6Click(Sender: TObject);
procedure lstDiSignalCondition5Click(Sender: TObject);
procedure lstDiSignalCondition4Click(Sender: TObject);
procedure lstDiSignalCondition3Click(Sender: TObject);
procedure lstDiSignalCondition2Click(Sender: TObject);
procedure lstDiSignalCondition1Click(Sender: TObject);
procedure lstDiSignalCondition0Click(Sender: TObject);
procedure txtCounterValueChange(Sender: TObject);
procedure txtChangeStatusChannelChange(Sender: TObject);
procedure CheckEvent();
private
{ Private declarations }
public
{ Public declarations }
lstDiSignalCondition : array[0..8] of TListBox;
chkDiInterrupt : array[0..8] of TCheckBox;
txtDiInterrupt : array[0..8] of TEdit;
m_DeviceHandle : LongInt;
m_DeviceNum : integer;
bThreadloop : Boolean;
m_ErrCde : LongInt; // Return error code
m_CounterValue : array[0..3] of DWORD;
m_MatchValue : DWORD;
m_DITriggerMode : LongInt;
szErrMsg : Array[0..80] of char;
m_StatusChannel : DWORD;
m_DI0Count : DWORD;
m_DI1Count : DWORD;
m_DI2Count : DWORD;
m_DI3Count : DWORD;
m_DI4Count : DWORD;
m_DI5Count : DWORD;
m_DI6Count : DWORD;
m_DI7Count : DWORD;
m_MatchCount : DWORD;
m_StatusCount : DWORD;
m_TimerCount : DWORD;
m_BoardID : DWORD;
Thread : TCheckThread;
ptEnableEvent : PT_EnableEvent; // Enable event
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
Function DoesErr(var lErrCode: LongInt): integer;
var
szErrMsg : string[100];
pszErrMsg : PChar;
iRet : integer;
begin
{Check the pressed error code}
If (lErrCode <> 0) Then
begin
pszErrMsg := @szErrMsg;
DRV_GetErrorMessage(lErrCode, pszErrMsg);
iRet := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK);
DoesErr := 1;
end
else
DoesErr := 0;
end;
procedure TfrmMain.cmdSelectDeviceClick(Sender: TObject);
var
DeviceName : Array[0..100] of char ;
dwCount : Longint;
ExitCode : DWORD;
i : integer;
begin
bThreadloop:=false;
// TODO: Add your control notification handler code here
if ( m_DeviceHandle<> 0 ) then
begin
if( Assigned(Thread)) then
begin
GetExitCodeThread(Thread.Handle,ExitCode);
if(ExitCode=STILL_ACTIVE) then
TerminateThread(Thread.Handle,ExitCode);
end;
DRV_DeviceClose( m_DeviceHandle );
end;
DRV_SelectDevice( Handle, FALSE, m_DeviceNum, DeviceName );
txtDeviceName.Text:=DeviceName;
m_ErrCde := DRV_DeviceOpen( m_DeviceNum, m_DeviceHandle);
if( DoesErr(m_ErrCde) = 1 ) then
Exit;
dwCount := sizeof(DWORD);
//Get the Di status change channel
m_ErrCde := DRV_DeviceGetProperty(m_DeviceHandle, CFG_BoardID, @m_BoardID, dwCount);
if(BD_PCI1755 = m_BoardID) or (BD_MIC3755 = m_BoardID) then
EnableControls(true)
else
begin
EnableControls(false);
exit;
end;
//Get the Di status change channel
m_ErrCde := DRV_DeviceGetProperty(m_DeviceHandle, CFG_IrqDiChangeStatusChannel, @m_StatusChannel, dwCount);
txtChangeStatusChannel.Text := IntToStr(m_StatusChannel);
//Get the Pattern match value
m_ErrCde := DRV_DeviceGetProperty(m_DeviceHandle, CFG_DiPatternMatchValue, @m_MatchValue, dwCount);
txtPatternMatchValue.Text := IntToHex(m_MatchValue,4);
//Get the Di channel trigger mode
m_ErrCde := DRV_DeviceGetProperty(m_DeviceHandle, CFG_IrqDiTriggerSignals, @m_DITriggerMode, dwCount);
//Get the counter2 value
dwCount := sizeof(m_CounterValue);
m_ErrCde := DRV_DeviceGetProperty(m_DeviceHandle, CFG_CounterCountValue, @(m_CounterValue[0]), dwCount);
txtCounterValue.Text := IntToStr(m_CounterValue[2]);
if( DoesErr(m_ErrCde) = 1 ) then
Exit;
for i:=0 to 7 do
lstDiSignalCondition[i].ItemIndex :=(m_DITriggerMode shl i and 1);
end;
procedure TfrmMain.cmdStartClick(Sender: TObject);
var
i: integer;
begin
txtCounterEvent.Text := '0';
txtPatternMatchEvent.Text := '0';
txtStatusChangeEvent.Text := '0';
for i := 0 to 7 do
txtDiInterrupt[i].Text := '0';
m_DI0Count := 0;
m_DI1Count := 0;
m_DI2Count := 0;
m_DI3Count := 0;
m_DI4Count := 0;
m_DI5Count := 0;
m_DI6Count := 0;
m_DI7Count := 0;
m_MatchCount := 0;
m_StatusCount := 0;
m_TimerCount := 0;
//
// Create thread to check events
//
bThreadloop:=true;
Thread := TCheckThread.Create(false);
// User controls setting
//
cmdStop.Enabled := true;
cmdExit.Enabled := false;
cmdStart.Enabled := false;
cmdSelectDevice.Enabled := false;
end;
procedure TfrmMain.cmdStopClick(Sender: TObject);
var
ExitCode : DWORD;
begin
bThreadloop:=false;
if( Assigned(Thread)) then
begin
Thread.Terminate();
GetExitCodeThread(Thread.Handle,ExitCode);
if(ExitCode = STILL_ACTIVE) then
TerminateThread(Thread.Handle,ExitCode);
end;
cmdStop.Enabled := false;
cmdExit.Enabled := true;
cmdStart.Enabled := true;
cmdSelectDevice.Enabled := true;
end;
procedure TfrmMain.EnableControls(bEnabled : boolean );
var
i : integer;
begin
chkTimer.Enabled := bEnabled;
txtCounterEvent.Enabled := bEnabled;
txtCounterValue.Enabled := bEnabled;
// Pattern match interrupt event controls enable or disable
chkFDiPatternMatch.Enabled := bEnabled;
txtPatternMatchEvent.Enabled := bEnabled;
txtPatternMatchValue.Enabled := bEnabled;
// Status change interrupt event controls enable or disable
chkStatusChange.Enabled := bEnabled;
txtStatusChangeEvent.Enabled := bEnabled;
txtChangeStatusChannel.Enabled := bEnabled;
// Auxiliary DI interrupt event controls enable or disable
for i := 0 to 7 do
begin
lstDiSignalCondition[i].Enabled := bEnabled;
chkDiInterrupt[i].Enabled := bEnabled;
txtDiInterrupt[i].Enabled := bEnabled;
end;
// Execution controls enable and disable
cmdStart.Enabled := bEnabled;
cmdStop.Enabled := False;
end;
procedure TfrmMain.cmdExitClick(Sender: TObject);
begin
Close();
end;
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
ExitCode : DWORD;
begin
bThreadloop:=false;
if( Assigned(Thread)) then
begin
Thread.Terminate();
GetExitCodeThread(Thread.Handle,ExitCode);
if(ExitCode = STILL_ACTIVE) then
TerminateThread(Thread.Handle,ExitCode);
end;
cmdStop.Enabled := false;
end;
procedure TfrmMain.chkDiInterrupt0Click(Sender: TObject);
begin
ptEnableEvent.Enabled := Smallint(chkDiInterrupt0.Checked );
ptEnableEvent.EventType := ADS_EVT_INTERRUPT_DI0;
ptEnableEvent.Count := 1;
DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);
end;
procedure TfrmMain.chkDiInterrupt1Click(Sender: TObject);
begin
ptEnableEvent.Enabled := Smallint(chkDiInterrupt1.Checked );
ptEnableEvent.EventType := ADS_EVT_INTERRUPT_DI1;
ptEnableEvent.Count := 1;
DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);
end;
procedure TfrmMain.chkDiInterrupt2Click(Sender: TObject);
begin
ptEnableEvent.Enabled := Smallint(chkDiInterrupt2.Checked );
ptEnableEvent.EventType := ADS_EVT_INTERRUPT_DI2;
ptEnableEvent.Count := 1;
DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);
end;
procedure TfrmMain.chkDiInterrupt3Click(Sender: TObject);
begin
ptEnableEvent.Enabled := Smallint(chkDiInterrupt3.Checked );
ptEnableEvent.EventType := ADS_EVT_INTERRUPT_DI3;
ptEnableEvent.Count := 1;
DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);
end;
procedure TfrmMain.chkDiInterrupt4Click(Sender: TObject);
begin
ptEnableEvent.Enabled := Smallint(chkDiInterrupt4.Checked );
ptEnableEvent.EventType := ADS_EVT_INTERRUPT_DI4;
ptEnableEvent.Count := 1;
DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);
end;
procedure TfrmMain.chkDiInterrupt5Click(Sender: TObject);
begin
ptEnableEvent.Enabled := Smallint(chkDiInterrupt5.Checked );
ptEnableEvent.EventType := ADS_EVT_INTERRUPT_DI5;
ptEnableEvent.Count := 1;
DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);
end;
procedure TfrmMain.chkDiInterrupt6Click(Sender: TObject);
begin
ptEnableEvent.Enabled := Smallint(chkDiInterrupt6.Checked );
ptEnableEvent.EventType := ADS_EVT_INTERRUPT_DI6;
ptEnableEvent.Count := 1;
DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);
end;
procedure TfrmMain.chkDiInterrupt7Click(Sender: TObject);
begin
ptEnableEvent.Enabled := Smallint(chkDiInterrupt7.Checked );
ptEnableEvent.EventType := ADS_EVT_INTERRUPT_DI7;
ptEnableEvent.Count := 1;
DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);
end;
procedure TfrmMain.chkFDiPatternMatchClick(Sender: TObject);
var
dwDioFdioDirection, dwDiPacerSource : DWORD;
begin
//
// Before setting CFG_IrqDiChangeStatusChannel, the user must set CFG_DioFdioDirection
// and CFG_DiPacerSource.
// CFG_DioFdioDirection can be set 32-bit DI, 16-bit DIO or 8-bit DIO, depending
// on the channel which the user want to monitor.
// NOTE: 32-bit DO is not support.
// If the user doesn't choose a pacer clock, 10MHz internal pacer clock is the default.
//
dwDioFdioDirection := 0; // 32-bit DI
m_ErrCde := DRV_DeviceSetProperty(m_DeviceHandle, CFG_DioFdioDirection, @dwDioFdioDirection, 4);
dwDiPacerSource := 3; // 10MHz
m_ErrCde := DRV_DeviceSetProperty(m_DeviceHandle, CFG_DiPacerSource, @dwDiPacerSource, 4);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -