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

📄 counterform.pas

📁 16 relay output channels and 16 isolated digital input channels LED indicators to show activated
💻 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 + -