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

📄 mainform.pas

📁 16 relay output channels and 16 isolated digital input channels LED indicators to show activated
💻 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)
    txtDeviceName: TEdit;
    cmdSelectDevice: TButton;
    grpDiInterrupt: TGroupBox;
    GroupBox1: TGroupBox;
    lstDiSignalCondition0: TListBox;
    lstDiSignalCondition1: TListBox;
    lstDiSignalCondition2: TListBox;
    lstDiSignalCondition3: TListBox;
    lstDiSignalCondition4: TListBox;
    lstDiSignalCondition5: TListBox;
    lstDiSignalCondition6: TListBox;
    lstDiSignalCondition7: 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;
    cmdOpenDevice: TButton;
    cmdCloseDevice: 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 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 CheckEvent();
    procedure cmdOpenDeviceClick(Sender: TObject);
    procedure cmdCloseDeviceClick(Sender: TObject);

  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;

        cmdOpenDeviceClick(Sender);

	dwCount := sizeof(DWORD);
	//Get the Di status change channel
	m_ErrCde := DRV_DeviceGetProperty(m_DeviceHandle, CFG_BoardID, @m_BoardID, dwCount);
       if(BD_USB4761 = m_BoardID) then
           EnableControls(true)
       else
       begin
           EnableControls(false);
           exit;
       end;


	//Get the Di channel trigger mode
	m_ErrCde := DRV_DeviceGetProperty(m_DeviceHandle, CFG_IrqDiTriggerSignals, @m_DITriggerMode, dwCount);

	for i:=0 to 7 do
              lstDiSignalCondition[i].ItemIndex :=((m_DITriggerMode shr i) and 1);


end;

procedure TfrmMain.cmdStartClick(Sender: TObject);
var
  i: integer;
begin

  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;
  //
  // Create thread to check events
  //
  bThreadloop:=true;
        Thread := TCheckThread.Create(true);
  Thread.Priority := tpTimeCritical;
  Thread.Resume;
  // 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

   // 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_DI_INTERRUPT0;
    ptEnableEvent.Count := 1;
    DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);
end;

procedure TfrmMain.chkDiInterrupt1Click(Sender: TObject);
begin
    ptEnableEvent.Enabled := Smallint(chkDiInterrupt1.Checked );
    ptEnableEvent.EventType := ADS_EVT_DI_INTERRUPT1;
    ptEnableEvent.Count := 1;
    DRV_EnableEvent(m_DeviceHandle,ptEnableEvent);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -