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

📄 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;                // 硬件参数
  ADStatus      : PCI8613_STATUS_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;

  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;

  nReadSizeWords := 1024*4;                         // 将数据长度字转换为双字

  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;
		while(TRUE) do                                  // 查询当前物理缓冲区数据是否已准备就绪
    begin

      if PCI8613_GetDevStatusProAD(hDevice, @ADStatus) = false  then
      begin
				Writeln('GetDevStatusProAD Error...');
				getch();
				goto ExitRead0;
			end;

			if ADStatus.bHalf = 1 then
      begin
				break;                                      // 若板载FIFO存储器数据量达到半满以上,则退出状态查询,开始读取半满数据
			end
			else
			begin
				if bFirstWait = true then
        begin
					writeln('请等待,您可以按任意键退出,但请不要直接关闭窗口强制退出...');
					bFirstWait := FALSE;
				end;
				if(kbhit()<>0) then
          goto ExitRead0;                           // 如果用户按键,则退出
			end;
    end;     // while(TRUE) do

    if(PCI8613_ReadDeviceProAD_Half(hDevice, @ADBuffer, nReadSizeWords, @nRetSizeWords)= false )  then
    begin
			writeln('ReadDeviceProAD_Half 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.00/4096) - 10000.00;
			PCI8613_INPUT_N5000_P5000mV:                                // -5V - +5V
				fVolt := ADData*(10000.00/4096) - 5000.00;
			PCI8613_INPUT_0_P10000mV:                                   // 0V - +10V
				fVolt := ADData*(10000.00/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 + -