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

📄 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 ,Math;

type
  TfrmMain = class(TForm)
    Label2: TLabel;
    GroupBox9: TGroupBox;
    Label1: TLabel;
    Label3: TLabel;
    editScanNum: TEdit;
    cmbChannel: TComboBox;
    butStart: TButton;
    butStop: TButton;
    lstDevice: TListBox;
    butExit: TButton;
    GroupBox2: TGroupBox;
    radRawData: TRadioButton;
    radVoltage: TRadioButton;
    GroupBox3: TGroupBox;
    radClockInternal: TRadioButton;
    radClockExternal0: TRadioButton;
    radClockExternal1: TRadioButton;
    GroupBox1: TGroupBox;
    Label8: TLabel;
    Label7: TLabel;
    Label13: TLabel;
    Label17: TLabel;
    radPacer: TRadioButton;
    radPost: TRadioButton;
    radDelay: TRadioButton;
    radAbout: TRadioButton;
    editDelayCount: TEdit;
    GroupBox4: TGroupBox;
    Label9: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    radDigital: TRadioButton;
    radAI0: TRadioButton;
    radAI1: TRadioButton;
    radAI3: TRadioButton;
    radAI2: TRadioButton;
    editTrigVolt: TEdit;
    GroupBox5: TGroupBox;
    radCyclic: TRadioButton;
    radNonCyclic: TRadioButton;
    GroupBox6: TGroupBox;
    radRising: TRadioButton;
    radFalling: TRadioButton;
    GroupBox7: TGroupBox;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    chkBufferChange: TCheckBox;
    chkTerminate: TCheckBox;
    chkOverrun: TCheckBox;
    editOverrunTime: TEdit;
    chkInterrupt: TCheckBox;
    edtEventCount: TEdit;
    GroupBox8: TGroupBox;
    radOverall: TRadioButton;
    radGainList: TRadioButton;
    cmbGain: TComboBox;
    butGainList: TButton;
    GroupBox10: TGroupBox;
    Label4: TLabel;
    Label6: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    editPacerRate: TEdit;
    GroupBox11: TGroupBox;
    Label5: TLabel;
    editCount: TEdit;
    GroupBox12: TGroupBox;
    radInternal: TRadioButton;
    radExternal: TRadioButton;
    Label24: TLabel;
    Label23: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure lstDeviceClick(Sender: TObject);
    procedure butStartClick(Sender: TObject);
    procedure radGainListClick(Sender: TObject);
    procedure radOverallClick(Sender: TObject);
    procedure butGainListClick(Sender: TObject);
    procedure radPacerClick(Sender: TObject);
    procedure radPostClick(Sender: TObject);
    procedure CheckEvent();
    procedure InterruptEvent();
    procedure BufChangeEvent();
    procedure OverrunEvent();
    procedure TerminateEvent();
    procedure butStopClick(Sender: TObject);
    procedure radCyclicClick(Sender: TObject);
    procedure radNonCyclicClick(Sender: TObject);
    procedure radRawDataClick(Sender: TObject);
    procedure radVoltageClick(Sender: TObject);
    procedure radClockInternalClick(Sender: TObject);
    procedure radClockExternal0Click(Sender: TObject);
    procedure radClockExternal1Click(Sender: TObject);
    procedure radInternalClick(Sender: TObject);
    procedure radExternalClick(Sender: TObject);
    procedure radRisingClick(Sender: TObject);
    procedure radFallingClick(Sender: TObject);
    procedure radDigitalClick(Sender: TObject);
    procedure radAI0Click(Sender: TObject);
    procedure radAI1Click(Sender: TObject);
    procedure radAI2Click(Sender: TObject);
    procedure radAI3Click(Sender: TObject);
    procedure radDelayClick(Sender: TObject);
    procedure radAboutClick(Sender: TObject);
    procedure butExitClick(Sender: TObject);
    procedure cmbGainChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    chkThread : CheckThread;
  public
    { Public declarations }
    Function DoesErr(var lErrCode: LongInt): integer;
    Function PhyChanToLogChan(DevCfg:Driver.DEVCONFIG_AI;PhyChan:smallint): smallint;    
  end;

var
  frmMain: TfrmMain;

  DevFeature      : DEVFEATURES;    // structure for device features
  ptDevFeatures    : PT_DeviceGetFeatures;
  DevConfig_AI     : Driver.DEVCONFIG_AI;
  ptAIGetConfig    : PT_AIGetConfig;
  ptFAIDmaExStart  : PT_FAIDmaExStart;   // FAIIntStart table
  ptFAITransfer    : PT_FAITransfer;     // FAITransfer table
  ptFAICheck       : PT_FAICheck;        // FAICheck table
  ptEnableEvent    : PT_EnableEvent;     // Enable event
  ptCheckEvent     : PT_CheckEvent;      // Check event
  hUserBuf         : HGLOBAL;//Pointer;
  hDisplayBuf      : HGLOBAL;

  gdwPacerRate     : Longint  = 250000;               // pacer rate
  gulConvNum       : Longint = 200000;//40960;               // conversion number
  gwStartChl       : Smallint = 0;
  gwChlNum         : Smallint = 1;   // scan channels
  gwDataType       : Smallint = 1;                  // display type : FLOAT(1)
  gwEvtFlag        : Smallint = 1;                  // event enable(0)
  gwActualBufSize  : Longint = 0;               // actual allocate buffer size
  gwFifoEnable     : Smallint = 0;               // Fifo disable(0)

  gwGainList       : Smallint = 0;      // gain list flag
  gdwStartPt       : Longint = 0;
  gdwStopPt        : Longint = 99;    // display points
  gwExtTrig        : Smallint = 0;      // external or internal trigger
  gwClockSrc       : Smallint = 0;		// Clock source
  gwTrigEdge       : Smallint = 0;		// Trigger edge
  gwSRCType        : Smallint = 0;	   // Source type
  gwTrigVol        : single = 0.0;		// Trigger voltage

  gwCyclicMode     : Smallint = 1;    // cyclic or non-cyclic mode
  gwTrigMode       : Smallint = 0;    // Trigger Mode
  gwIntrCount      : Smallint = 1;
  gwCyclicCount    : Longint = 1;    // number of cyclic count

  gwActiveBuf      : Smallint = 0;     // return by FAICheck
  gwOverrun        : Smallint = 0;     // return by FAICheck, FAITransfer
  gwStopped        : Smallint = 0;     // return by FAICheck
  gulRetrieved     : Longint = 0;     // return by FAICheck
  gwHalfReady      : Smallint = 0;     // return by FAICheck
  gwDelayCnt       : Longint = 2;
  bThreadloop      : Boolean = true;

  gwDevice         : Smallint = 0;
  gwSubDevice      : Smallint = 0;      // Device index

  gnNumOfDevices   : Smallint;
  gnNumOfSubdevices: Smallint;  // number of installed devices

   szErrMsg        : string;               // Use for MESSAGEBOX function
   szBuffer        : string;				// Temperatory buffer
  ErrCde           : Longint;                     // Return error code

  DeviceList       : array[0..99] of PT_DEVLIST;
  SubDeviceList    : array[0..99] of PT_DEVLIST;

  DriverHandle     : Longint = 0;         // driver handle
  fVoltageArray    : array[0..64] of single;

  gwGainCde        : array[0..64] of Smallint;
  ReorderGainCode  : array[0..64] of Smallint;
  gwMaxLogChanNum  : Smallint;
  gwGain            : array[0..64] of Smallint ;
  usStartChan, usChanNum : Smallint;
  gulIntCounter       : Longint = 0;
  gulBfChgCounter     : Longint = 0;
  gulOverrunCounter   : Longint = 0;
  gulOverrunTime      : Longint = 10000;
  gulEventCount       : Longint =  1;
  szCounter           : string;
  MAX_DEVICES         : Longint = 99;

  bBufferChange   : Boolean = true;
  bInterrupt      : Boolean = true;
  bOverrun        : Boolean = true;
  bTerminate      : Boolean = true;
  Function GetMaxLogChanNum(DevCfg:Driver.DEVCONFIG_AI;DevFeature:Driver.DEVFEATURES): smallint;

implementation

uses DislpayForm,GainListForm;

{$R *.dfm}
{*************************************************************
 * Function: Handle the error code. If the input error code > 0,
 *           it means some error apperent.  This function can
 *           show the error message to a message box and stop
 *           this application.
 * Input:    The error code.
 * return:   none
 ************************************************************* }
Function TfrmMain.DoesErr(var lErrCode: LongInt): integer;
var
  szErrMsg   : string[100];
  pszErrMsg  : PChar;
begin
  {Check the pressed error code}
  If (lErrCode <> 0) Then
  begin
    pszErrMsg := @szErrMsg;
    DRV_GetErrorMessage(lErrCode, pszErrMsg);
    Application.MessageBox(pszErrMsg, 'Error!!', MB_OK);
    DoesErr := 1;
  end
  else
    DoesErr := 0;
end;

Function TfrmMain.PhyChanToLogChan(DevCfg:Driver.DEVCONFIG_AI;PhyChan:smallint): smallint;
var
        i :smallint;
        FunResult:smallint;
begin
        if(DevCfg.ulChanConfig = 1) then
        begin
                PhyChanToLogChan := PhyChan;
                Exit;
        end;
        FunResult := 0;
        i := 0;
        while (i <=Min(PhyChan,31)) do
        begin
		if ((DevCfg.ulChanConfig and (1 shl i))<>0) then i:= i+1;
		FunResult := FunResult + 1;
                i := i+1;
        end;

	if(phychan >= 32) then
        begin
                i := 32;
                while i<=phychan  do
                begin
		    if((DevCfg.ulChanConfigEx[0] and (1 shl (i-32)))<>0) then i := i+1;
                    FunResult := FunResult + 1;
                    i := i+1;                    
                end;
        end;
    PhyChanToLogChan := FunResult -1;
end;

Function GetMaxLogChanNum(DevCfg:Driver.DEVCONFIG_AI;DevFeature:Driver.DEVFEATURES): smallint;
var
        i :smallint;
        FunResult : smallint;
begin
        if(DevCfg.ulChanConfig = 1) then
        begin
                GetMaxLogChanNum := DevFeature.usMaxAIDiffChl;
                Exit;
        end;

        FunResult := 0;
        i := 0;
        while (i < DevFeature.usMaxAISiglChl) do
        begin
                if(i <32) then
                begin
                   if ((DevCfg.ulChanConfig and (1 shl i))<>0) then i:= i+1;
                end
                else
                   if ((DevCfg.ulChanConfigEx[0] and (1 shl (i-32)))<>0) then i:= i+1;
                FunResult := FunResult + 1;
                i := i+1;
        end;
        GetMaxLogChanNum := FunResult ;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
var
    nOutEntries  : Smallint;
    i            : integer;

begin
    ErrCde := DRV_DeviceGetNumOfList(gnNumOfDevices);
    if( DoesErr(ErrCde) = 1 ) then
    Exit;

    if (gnNumOfDevices > MAX_DEVICES )  then
        gnNumOfDevices := MAX_DEVICES;

    // Add type of PC Laboratory Card
    ErrCde := DRV_DeviceGetList(DeviceList[0],gnNumOfDevices, nOutEntries);
    if( DoesErr(ErrCde) = 1 ) then
    Exit;

    // Here MaxEntries = nOutEntries
    for i := 0 to gnNumOfDevices-1 do
        lstDevice.Items.Add( DeviceList[i].szDeviceName );

    for i:=0 to 63 do
        gwGain[i]:=0;

    lstDevice.ItemIndex := gwDevice;
    lstDeviceClick(Sender);

    butStop.Enabled := False;
end;

procedure TfrmMain.lstDeviceClick(Sender: TObject);
var
    i   : Smallint;
begin
    cmbGain.Clear();
    gwDevice := lstDevice.ItemIndex;

    ErrCde := DRV_DeviceOpen(DeviceList[gwDevice].dwDeviceNum, DriverHandle);
    if( DoesErr(ErrCde) = 1 ) then
    Exit;

    // get device features
    ptDevFeatures.buffer := @DevFeature;
    ptDevFeatures.size := SizeOf(DEVFEATURES);
    ErrCde := DRV_DeviceGetFeatures(DriverHandle, ptDevFeatures);
    if DoesErr(ErrCde) = 1  then
    begin
      DRV_DeviceClose(DriverHandle);
      Exit;
    end;

    // get AI configuration
    ptAIGetConfig.size := SizeOf(DEVCONFIG_AI);
    ptAIGetConfig.buffer := @DevConfig_AI;
    ErrCde := DRV_AIGetConfig(DriverHandle, ptAIGetConfig);
    if DoesErr(ErrCde) = 1  then
    begin
        DRV_DeviceClose(DriverHandle);
        butStart.Enabled := false;
        Exit;
    end;

    // initialize Input Range List Combobox with device features
    if (DevFeature.usNumGain <> 0) then
    begin
        for i := 0 to DevFeature.usNumGain-1 do
            cmbGain.Items.Add(DevFeature.glGainList[i].szGainStr);
        cmbGain.ItemIndex := 0;
    end;


    // Initialize Start Channel
    cmbChannel.Clear();
    for i := 0 to DevFeature.usMaxAISiglChl-1 do
    begin
        cmbChannel.Items.Add(InttoStr(i));
    end;
     cmbChannel.ItemIndex := 0;

    gwMaxLogChanNum := GetMaxLogChanNum(DevConfig_AI,DevFeature);
    butStart.Enabled := true;
    // close device
    DRV_DeviceClose(DriverHandle);
end;

procedure TfrmMain.butStartClick(Sender: TObject);
var
     //temp  : integer;
     i     : integer;
     LogChan  : integer;

begin
     gwTrigVol := StrToInt(editTrigVolt.Text);
     gwDelayCnt := StrToInt(editDelayCount.Text);
     gdwPacerRate := StrToInt(editPacerRate.Text);
     gulConvNum := StrToInt(editCount.Text);
     gwStartChl := cmbChannel.ItemIndex;
     gwChlNum :=  StrToInt(editScanNum.Text);
     if(radInternal.Checked) then
       gwExtTrig := 0
     else
       gwExtTrig :=1;


     for i:=0 to 63  do
         gwGainCde[i]:= DevFeature.glGainList[gwGain[i]].usGainCde;


     LogChan := frmMain.PhyChanToLogChan(DevConfig_AI,gwStartChl);
     for i:=0 to Min(gwChlNum-1,gwMaxLogChanNum-1) do
     begin
      	ReorderGainCode[i] := gwGainCde[(LogChan + i) Mod gwMaxLogChanNum];
     end;

    ErrCde := DRV_DeviceOpen(DeviceList[gwDevice].dwDeviceNum,
             DriverHandle);
     if DoesErr(ErrCde) = 1  then
    begin
      DRV_DeviceClose(DriverHandle);
      Exit;
    end;



     // allocate memory
     hUserBuf :=GlobalAlloc(GPTR, SizeOf(single) *gulConvNum);

     if (hUserBuf = 0 )  then
    begin
      DRV_DeviceClose(DriverHandle);
      Exit;
    end;

     // allocate memory
        hDisplayBuf :=GlobalAlloc(GPTR, SizeOf(single) * gulConvNum);

     if (hDisplayBuf = 0)  then
    begin
      DRV_DeviceClose(DriverHandle);
      Exit;
    end ;
     ptFAITransfer.DataBuffer := Pointer(GlobalLock(hDisplayBuf));

     // enable event
        ptEnableEvent.EventType := 0;
        if( chkBufferChange.Checked ) then
             ptEnableEvent.EventType :=ptEnableEvent.EventType or  ADS_EVT_BUFCHANGE;

        if( chkTerminate.Checked ) then
            ptEnableEvent.EventType := ptEnableEvent.EventType or ADS_EVT_TERMINATED;
        if( chkOverrun.Checked )  then
            ptEnableEvent.EventType := ptEnableEvent.EventType or ADS_EVT_OVERRUN;
        if( chkInterrupt.Checked )  then
            ptEnableEvent.EventType:= ptEnableEvent.EventType or ADS_EVT_INTERRUPT;

        ptEnableEvent.Enabled := 1;
        ptEnableEvent.Count   := StrToInt(edtEventCount.Text) * 2048;


      ErrCde := DRV_EnableEvent(DriverHandle,ptEnableEvent);

       if DoesErr(ErrCde) = 1  then
      begin
         GlobalFree(HGLOBAL(hUserBuf));
         GlobalFree(HGLOBAL(hDisplayBuf));
         DRV_DeviceClose(DriverHandle);
         Exit;
      end;



      ptFAIDmaExStart.TrigSrc	    	:= gwExtTrig;
      ptFAIDmaExStart.TrigMode		:= gwTrigMode;
      ptFAIDmaExStart.ClockSrc		:= gwClockSrc;
      ptFAIDmaExStart.TrigEdge		:= gwTrigEdge;
      ptFAIDmaExStart.SRCType	      	:= gwSRCType;
      ptFAIDmaExStart.CyclicMode     	:= gwCyclicMode;

⌨️ 快捷键说明

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