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

📄 sys.dpr

📁 Delphi编的板卡内部程序。分享给大家
💻 DPR
字号:
program Sys;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  PCI8613 in 'PCI8613.pas';

Function getch() : Integer; Stdcall; External'MSVCRT.DLL' name'_getch';
  Function kbhit() : Integer; Stdcall; External'MSVCRT.DLL' name'_kbhit';
  Function WaitForSingleObject(hHandle: LongInt; dwMilliseconds: LongWord) : LongWord; Stdcall; External'kernel32.dll' name'WaitForSingleObject';

// 获得用户选择的输入量程
Function SelectInputRange() : Integer;
var
  InputRange : LongInt;
begin
  Repeat
  Writeln('0. -10V  ~ +10V');
  Writeln('1. -5V   ~ +5V');
  Writeln('2.  0V    ~ +10V');
  Writeln('Please Select Input Range[0-2]:');
  Readln(InputRange);
  until(inputRange>=0) and (InputRange<=2);       // 判断用户选择的量程是否合法,不合法,则重新选择

  SelectInputRange := InputRange;

end;

Var
  hDevice       : LongInt;                        // 设备对象句柄
  DeviceLgcID   : Integer;                        // 物理设备ID号(由板上JP1决定)
  ADPara        : PCI8613_PARA_AD;                // 硬件参数
  bFirstWait    : Boolean = True;                 // 为每次等待只显示一次提示
  Index         : Integer;
  nADChannel    : Integer = 0;
  ADData        : SmallInt;
  fVolt         : Single;
  InputRange    : Integer;
  bReturn       : Boolean;
  ADBuffer      : Array [0..8191] of LongWord;
  nReadSizeWords: LongInt;                          // 每次读取AD数据的长度(字)
	nRetSizeWords : LongInt;
  ChannelCount  : Integer;
  Label ExitRead0;
  Label ExitRead1;


begin
  { TODO -oUser -cConsole Main : Insert code here }

  DeviceLgcID := 0;
	hDevice     := PCI8613_CreateDevice(DeviceLgcID);  // 创建设备对象


	if(hDevice = -1) then
	begin
    Writeln('Create Device Error!');
		getch();
		exit;                                           // 如果创建设备对象失败,则返回
  end;

	InputRange            := SelectInputRange();      // 要求用户从键盘上选择输入量程

  // 预置硬件参数
	ADPara.ADMode			    := PCI8613_ADMODE_SEQUENCE; // AD模式为连续模式
	ADPara.FirstChannel		:= 0;                       // 首通道
	ADPara.LastChannel		:= 3;                       // 末通道
	ADPara.Frequency		  := 10000;                   // 采样频率(Hz)
	ADPara.GroupInterval	:= 50;                      // 组间间隔(uS)
	ADPara.LoopsOfGroup		:= 1;                       // 组内各通道点数
	ADPara.Gains			    := PCI8613_GAINS_1MULT;
	ADPara.InputRange		  := InputRange;              // 模拟量输入量程范围

	ADPara.TriggerMode		:= PCI8613_TRIGMODE_SOFT;   // 触发模式为软件触发
	ADPara.TriggerSource	:= PCI8613_TRIGSRC_ATR;     // 触发源
	ADPara.TriggerType		:= PCI8613_TRIGTYPE_EDGE;   // 触发类型为边沿触发
	ADPara.TriggerDir		  := PCI8613_TRIGDIR_NEGATIVE;// 触发方向为负向
	ADPara.TrigWindow		  := 40;                      // 触发灵敏度

	ADPara.ClockSource		:= PCI8613_CLOCKSRC_IN;     // 时钟源选用板内时钟源
	ADPara.bClockOutput		:= 0;                       // 禁止时钟输出  
	ADPara.GroundingMode	:= PCI8613_GNDMODE_SE;      // 单端方式(SE:Single end)
	ADPara.TimeoutForNpt	:= 10;                      // 在非空方式下,设置超时时间为10秒钟(只在非空查询方式下有效)



  bReturn   :=PCI8613_InitDeviceProAD(hDevice, @ADPara);
  if(bReturn = False) then                          // 初始化硬件
  begin
		Writeln('PCI8613_InitDeviceDmaAD Error ...');
		getch();
		goto ExitRead1;
	end;


  ChannelCount := ADPara.LastChannel - ADPara.FirstChannel +1;
  nReadSizeWords := 8192 - 8192 mod ChannelCount;       // 将数据长度字转换为双字

  if PCI8613_StartDeviceProAD(hDevice) = false then     // 启动设备
  begin
    Writeln(' StartDeviceAD Error... ');
    getch();
    goto ExitRead0;
  end;

  While( kbhit()= 0 ) do                   // While( kbhit() = 0 ) do
  begin

    bFirstWait := TRUE;
    if bFirstWait = true then
    begin
		  writeln('请等待,您可以按任意键退出,但请不要直接关闭窗口强制退出...');
		  bFirstWait := FALSE;
		end;



    if(PCI8613_ReadDeviceProAD_Npt(hDevice, @ADBuffer, nReadSizeWords, @nRetSizeWords)= false )  then
    begin
			writeln('ReadDeviceProAD_Npt Error...');
			getch();
			goto ExitRead0;
    end;



    fVolt := 0;
    nADChannel := ADPara.FirstChannel;
    for index := 0 to 63 do
    begin
      if kbhit()<> 0  then
        goto ExitRead0;
      ADData := ADBuffer[Index] and $0FFF;
      // 将原码转换为电压值
			case InputRange of
			PCI8613_INPUT_N10000_P10000mV:                            // -10V - +10V
				fVolt := ADData*(20000.0/4096) - 10000.0;
			PCI8613_INPUT_N5000_P5000mV:                              // -5V - +5V
				fVolt := ADData*(10000.0/4096) - 5000.0;
			PCI8613_INPUT_0_P10000mV:                                 // 0V - +10V
				fVolt := ADData*(10000.0/4096);
			else
      end;
      Write(format('CH%d=%6.2f  ',[nADChannel, fVolt]));      // 显示电压值
      nADChannel := nADChannel + 1;

			if nADChannel > ADPara.LastChannel then
      begin
        nADChannel := ADPara.FirstChannel;
        writeln;
      end;

    end;

  end; // While(PCI8613_kbhit() = true) do

ExitRead0:
	getch();
	PCI8613_ReleaseDeviceProAD(hDevice);                        // 释放AD
ExitRead1:
	PCI8613_ReleaseDevice(hDevice);                             // 释放设备对象
	getch();
end.

⌨️ 快捷键说明

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