📄 pci8613.pas
字号:
unit PCI8613;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus,
StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, StdActns,
ActnList, ToolWin, ImgList;
//#################### AD硬件参数PCI8211_PARA_AD定义 #####################
// 用于AD采样的实际硬件参数
type
PPCI8613_PARA_AD = ^PCI8613_PARA_AD;
PCI8613_PARA_AD = record
ADMode : LongInt; // AD模式选择(连续/分组方式)
FirstChannel : LongInt; // 首通道[0, 15]
LastChannel : LongInt; // 末通道[0, 15],要求末通道必须大于或等于首通道
Frequency : LongInt; // 采集频率,单位为Hz, [1, 100000]
GroupInterval : LongInt; // 分组时的组间间隔(单位:微秒)[1, 419430]
LoopsOfGroup : LongInt; // 组内循环次数[1, 255]
Gains : LongInt; // 增益设置
InputRange : LongInt; // 模拟量输入量程范围
TriggerMode : LongInt; // 触发模式选择
TriggerSource : LongInt; // 触发源选择
TriggerType : LongInt; // 触发类型选择(边沿触发/脉冲触发)
TriggerDir : LongInt; // 触发方向选择(正向/负向触发)
TrigWindow : LongInt; // 触发灵敏窗[1, 65535], 单位25纳秒
ClockSource : LongInt; // 时钟源选择(内/外时钟源)
bClockOutput : LongInt; // 允许时钟输出到CLKOUT,=TRUE:允许时钟输出, =FALSE:禁止时钟输出
GroundingMode : LongInt; // 接地方式(单端或双端选择)
TimeoutForNpt : LongInt; // 非空查询方式下的超时时间,单位秒,取值范围为[0, 3600]
end;
//***********************************************************
// AD硬件参数PCI8613_PARA_AD中的ADMode所使用工作模式选项
const PCI8613_ADMODE_SEQUENCE = $00; // 连续采样
const PCI8613_ADMODE_GROUP = $01; // 分组采样
//***********************************************************
// AD硬件参数PCI8613_PARA_AD中的InputRange模拟量输入范围所使用的选项
const PCI8613_INPUT_N10000_P10000mV= $00; // ±10000mV
const PCI8613_INPUT_N5000_P5000mV = $01; // ±5000mV
const PCI8613_INPUT_0_P10000mV = $02; // 0~10000mV
//***********************************************************
// AD参数PCI8613_PARA_AD中的Gains使用的硬件增益选项
const PCI8613_GAINS_1MULT = $00; // 1倍增益(使用PGA202或PGA203放大器)
const PCI8613_GAINS_10MULT = $01; // 10倍增益(使用PGA202放大器)
const PCI8613_GAINS_100MULT = $02; // 100倍增益(使用PGA202放大器)
const PCI8613_GAINS_1000MULT = $03; // 1000倍增益(使用PGA202放大器)
const PCI8613_GAINS_2MULT = $01; // 2倍增益(使用PGA203放大器)
const PCI8613_GAINS_4MULT = $02; // 4倍增益(使用PGA203放大器)
const PCI8613_GAINS_8MULT = $03; // 8倍增益(使用PGA203放大器)
//***********************************************************
// AD硬件参数PCI8613_PARA_AD中的TriggerMode成员变量所使用触发模式选项
const PCI8613_TRIGMODE_SOFT = $00; // 软件触发(属于内触发)
const PCI8613_TRIGMODE_POST = $01; // 硬件后触发(属于外触发)
//***********************************************************
// AD硬件参数PCI8613_PARA_AD中的TriggerSource触发源信号所使用的选项
const PCI8613_TRIGSRC_ATR = $00; // 选择外部ATR作为触发源
const PCI8613_TRIGSRC_DTR = $01; // 选择外部DTR作为触发源
// AD硬件参数PCI8613_PARA_AD中的TriggerType触发类型所使用的选项
const PCI8613_TRIGTYPE_EDGE = $00; // 边沿触发
const PCI8613_TRIGTYPE_PULSE = $01; // 脉冲触发(电平)
//***********************************************************
// AD硬件参数PCI8613_PARA_AD中的TriggerDir触发方向所使用的选项
const PCI8613_TRIGDIR_NEGATIVE = $00; // 负向触发(低脉冲/下降沿触发)
const PCI8613_TRIGDIR_POSITIVE = $01; // 正向触发(高脉冲/上升沿触发)
const PCI8613_TRIGDIR_POSIT_NEGAT = $02; // 正负向触发(高/低脉冲或上升/下降沿触发)
//***********************************************************
// AD硬件参数PCI8613_PARA_AD中的ClockSource时钟源所使用的选项
const PCI8613_CLOCKSRC_IN = $00; // 内部时钟
const PCI8613_CLOCKSRC_OUT = $01; // 外部时钟(CLKIN)
//***********************************************************
// AD参数(PCI8613_PARA_AD)中的GroundingMode使用的模拟信号接地方式选项
const PCI8613_GNDMODE_SE = $00; // 单端方式(SE:Single end)
const PCI8613_GNDMODE_DI = $01; // 双端方式(DI:Differential)
//*************************************************************************************
// 用于AD采样的实际硬件参数
type
PPCI8613_STATUS_AD = ^PCI8613_STATUS_AD;
PCI8613_STATUS_AD = record
bNotEmpty : LongInt; // 板载FIFO存储器的非空标志,=TRUE非空, = FALSE 空
bHalf : LongInt; // 板载FIFO存储器的半满标志,=TRUE半满以上, = FALSE 半满以下
bDynamic_Overflow : LongInt; // 板载FIFO存储器的动态溢出标志,= TRUE已发生溢出, = FALSE 未发生溢出
bStatic_Overflow : LongInt; // 板载FIFO存储器的静态溢出标志,= TRUE已发生溢出, = FALSE 未发生溢出
bTriggerFlag : LongInt; // 触发标志, =TRUE表示触发事件发生, =FALSE表示触发事件未发生
end;
const PCI8613_MAX_SEGMENT_COUNT = 64;
type
PPCI8613_STATUS_DMA = ^PCI8613_STATUS_DMA;
PCI8613_STATUS_DMA = record
iCurSegmentID : LongInt; // 当前段缓冲ID,表示DMA正在传输的缓冲区段
bSegmentSts : Array [0..PCI8613_MAX_SEGMENT_COUNT-1] of LongInt; // 各个缓冲区的新旧状态,=1表示该相应缓冲区数据为新,否则为旧
bBufferOverflow : LongInt; // 返回溢出状态
end;
//***********************************************************
// DA输出函数InitDeviceDA的模拟量输出范围参数OutputRange所使用的选项
const PCI8613_OUTPUT_0_P5000mV = $00; // 0~5000mV
const PCI8613_OUTPUT_0_P10000mV = $01; // 0~10000mV
const PCI8613_OUTPUT_N5000_P5000mV = $02; // ±5000mV
const PCI8613_OUTPUT_N10000_P10000mV = $03; // ±10000mV
// DA输出函数PCI8613_DAReset的复位ResetMode所使用的选项
const PCI8613_RESET_LEAST = $00; // 复位至最小值
const PCI8613_RESET_MIDDLE = $01; // 复位至中间值
//***********************************************************
// // 用于计数器的参数结构
type
PPCI8613_PARA_CNT = ^PCI8613_PARA_CNT;
PCI8613_PARA_CNT = record
ControlMode : Longword; // 计数器工作模式[0—5]
AddDecMode : Longword; // 计数器加减模式:加计数或减计数[0:减计数,1:加计数]
CNTVal : Longword; // 计数器值
end;
// CNT控制函数PCI8613_InitDeviceCNT硬件参数ControlMode控制字模式选项
const PCI8613_GATEMODE_POSITIVE_0 = $00; // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入新的初值,按新值计数
// 减法计数时,计数到0时OUT为1;加法计数时,计数到4294967295时OUT变为1
// 计数结束产生中断
const PCI8613_GATEMODE_RISING_1 = $01; // COUNTER:GATE上边沿触发计数,计数中出现GATE上升沿重新装入初值计数
// 可编程单拍脉冲:当写入初值时OUT为1,当开始计数时OUT为0
// 减法计数时,计数到0时OUT为1;加法计数时,计数到4294967295时OUT变为1
const PCI8613_GATEMODE_POSITIVE_2 = $02; // COUNTER:GATE高电平时计数,低电平时停止计数,若计数中改变初值,下次有效
// 频率发生器:计数期间OUT为1
// 减法计数时,计数到0后输出一个周期的0,并重新装入计数值计数;
// 加法计数时,计数到4294967295时输出一个周期的0,并重新装入计数值计数
const PCI8613_GATEMODE_POSITIVE_3 = $03; // COUNTER:GATE高电平时计数,低电平时停止计数,若计数中改变初值,下次有效
// 方波发生器:计数期间OUT为1
// 减法计数时,计数到0后输出一个周期的0,并重新装入计数值计数;
// 加法计数时,计数到4294967295时输出一个周期的0,并重新装入计数值计数
const PCI8613_GATEMODE_POSITIVE_4 = $04; // COUNTER:GATE高电平时计数,低电平时停止计数,若计数中改变初值,本次有效
// 软件触发选通:写入初值OUT为1
// 减法计数时,计数到0后输出一个周期的低电平信号;
// 加法计数时,计数到4294967295时输出一个周期的低电平信号
const PCI8613_GATEMODE_RISING_5 = $05; // COUNTER:GATE上边沿触发计数,计数中出现GATE上升沿重新装入初值计数
// 硬件触发选通:写入初值OUT为1
// 减法计数时,计数到0后输出一个周期的低电平信号;
// 加法计数时,计数到4294967295时输出一个周期的低电平信号
//***********************************************************
// CreateFileObject所用的文件操作方式控制字(可通过或指令实现多种方式并操作)
const PCI8613_modeRead = $0000; // 只读文件方式
const PCI8613_modeWrite = $0001; // 只写文件方式
const PCI8613_modeReadWrite = $0002; // 既读又写文件方式
const PCI8613_modeCreate = $1000; // 如果文件不存可以创建该文件,如果存在,则重建此文件,并清0
const PCI8613_typeText = $4000; // 以文本方式操作文件
//***********************************************************
// 用于DA的复位方式(适用于PCI8613_InitDevProDA函数的ResetMode参数)
const PCI8613_RESET_MODE_NEGATIVE = $0000 ;// 负满度(-5V或-10V...)
const PCI8613_RESET_MODE_ZERO =$0001 ;// 零点(0V)
//***********************************************************
// 用户函数接口
//######################## 设备对象管理函数 ##############################
Function PCI8613_CreateDevice(DeviceLgcID : Integer = 0) : LongInt; StdCall; External'PCI8613.dll' Name 'PCI8613_CreateDevice'; // 用逻辑号创建设备对象
Function PCI8613_CreateDeviceEx(DevicePhysID : Integer = 0) : LongInt; StdCall; External'PCI8613.dll' Name 'PCI8613_CreateDeviceEx'; // 用物理号创建设备对象
Function PCI8613_GetDeviceCount(hDevice : LongInt) : Integer; StdCall; External'PCI8613.dll' Name 'PCI8613_GetDeviceCount'; // 取得设备总台数
Function PCI8613_GetDeviceCurrentID(hDevice : LongInt; DeviceLgcID : Pointer; DevicePhysID : Pointer) : Boolean; StdCall; External'PCI8613.dll' Name 'PCI8613_GetDeviceCurrentID';
Function PCI8613_ListDeviceDlg(hDevice : LongInt) : Boolean; StdCall; External'PCI8613.dll' Name 'PCI8613_ListDeviceDlg'; // 以对话框窗体方式列表系统当中的所有的该PCI设备
Function PCI8613_ReleaseDevice(hDevice : LongInt) : Boolean; StdCall; External'PCI8613.dll' Name 'PCI8613_ReleaseDevice'; // 仅释放设备对象
//####################### AD数据读取函数 #################################
// 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备
// 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面的初始化设备和读取
// AD数据两个函数便能轻松高效地实现高速、连续的数据采集
// AD通用函数
// AD程序查询方式函数
Function PCI8613_InitDeviceProAD( // 初始化设备,当返回TRUE后,设备即准备就绪.
hDevice : LongInt; // 设备对象,它由CreateDevice函数创建
pADPara :PPCI8613_PARA_AD) : Boolean; StdCall; External'PCI8613.dll' Name 'PCI8613_InitDeviceProAD'; // 硬件参数, 它仅在此函数中决定硬件状态
Function PCI8613_StartDeviceProAD( // 在初始化之后,启动设备
hDevice : LongInt) : Boolean; StdCall; External'PCI8613.dll' Name 'PCI8613_StartDeviceProAD'; // 设备对象句柄,它由CreateDevice函数创建
Function PCI8613_SetDevFreqencyAD( // 在AD转换过程中,动态改变采样频率
hDevice : LongInt; // 设备对象句柄
nADFrequency : LongWord) : Boolean; StdCall; External'PCI8613.dll' Name 'PCI8613_SetDevFreqencyAD'; // AD采样频率(Hz)
Function PCI8613_ReadDeviceProAD_Npt( // 当AD标志有效时,用此函数读取设备上的AD数据(程序非空方式)
hDevice : LongInt; // 设备句柄,它由CreateDevice函数创建
ADBuffer : Pointer; // 接受原始AD数据的用户缓冲区
nReadSizeWords : LongWord; // 相对于偏位点后读入的数据长度(字)
nRetSizeWords : Pointer) : Boolean; StdCall; External'PCI8613.dll' Name 'PCI8613_ReadDeviceProAD_Npt'; // 返回实际读取的长度(字)
Function PCI8613_GetDevStatusProAD( // 在AD采样过程中取得设备的各种状态,返回值表示函数是否成功
hDevice : LongInt; // 设备句柄,它由CreateDevice函数创建
pADStatus : PPCI8613_STATUS_AD) : Boolean; StdCall; External'PCI8613.dll' Name 'PCI8613_GetDevStatusProAD'; // AD的各种信息结构体
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -