📄 sys.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 + -