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

📄 mainform.pas

📁 usb4711A数据采集卡的DI转换通道程序
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -