取多缓冲区方式下一个采集块ADResult

VC/C++Builder下定义原型:
int __stdcall ADResult(ADCard_Result * Buf);

VC/C++Builder下使用示例:
WORD ADBuf[NumChn*NumSamp+1];
I = ADResult((ADResult *) ADBuf);

VB下定义方式:
Declare Function DllADResult Lib "ADCard.Dll" Alias "_ADResult@4" (ByRef pBuf As Integer) As Long

VB下使用示例:
Dim ADBuf[NumSamp*NumChn] as Integer
I = DllADResult(ADBuf[0])

Delphi下定义方式
function ADResult(var Buf:word):longint; stdcall; external 'adcard.dll' name '_ADResult@4';

Delphi下使用示例
ADBuf : array of word;
SetLength(ADBuf,NumSamp*NumChn+3);
I := ADResult(ADBuf);

功能及参数说明:

ADResult()函数用于在多缓冲区方式下把最先(旧)的一个有采集结果的缓冲区内容拷贝到用户数组ADBuf中。并释放当前缓冲区。这是把驱动程序缓冲区当成以块为单位的FIFO时,以块为单位取采集结果的标准方式。若执行ADResult()及时(如在RegisterNotify()注册的消息响应函数中),各ADResult()函数返回的缓冲区将在时间上是连续的。

参数ADBuf为用户程序通过的存放采集结果的缓冲区地址。此时数组ADBuf的尺寸要求大于SampPerChn*NumChn+1个短整数,但结果正好为NumChn通道、NumSamp个采样点,NumChn和NumSamp在StartIntr()函数中定义。

返回结果的格式是:ADBuf(0)为此次结果的序列号:在多缓冲区方式下,每个缓冲区的序列号按采集时间先后顺序增一,若缓冲区满而丢失数据时此值会增加以表示丢失了多少缓冲区;在单缓冲区方式下,表示此次快照是系统内部缓冲区被覆盖(填满)多少此时的结果。此值是按无符号短整数递增的,在65535(=0xffff)后会反转为0的。

ADBuf(1至NumChn*SampPerChn)顺序存放各通道、各时刻的采样值。第n通道(n=0至NumChn-1)、第m时刻(m=1至SampPerChn)就存放在数组单元ADBuf((m-1)*NumChn+n+1)中,即ADBuf(1)存放第0通道第1时刻的值,ADBuf(2)存放第1通道第1时刻值,......,ADBuf(NumChn)存放第NumChn-1通道第1时刻的值,ADBuf(NumChn+1)存放第0通道第2时刻的值,......。对12位AD板,采样结果为偏移二进制编码,即:0表示最低电压值(如-5V),2048(=0x800)表示0电压,4095(=0xfff)表示最高电压(如+5V)。具体电压值可由属性VZero和VMax转换出。

若AD板既支持模拟量,又支持开关量,则在等价的NumChn个总通道中,通道0至BegChn-1为常规的模拟量,通道BegChn至NumChn-1为组合的开关量通道,每16个开关量通道占1个模拟量通道的缓冲区(即每模拟通道占1位,且通道0占短整数的bit 0,通道15占短整数的bit15,而每模拟通道占16位(无符号短整数))

对AD采集结果ADBuf(?)的模拟量,它实际采用偏移二进制编码,它对应的实际电压为(单位:V): (ADBuf(?)-VZero)/(VMax-VZero)*5

其中,VMax与VZero由ConfigInfo()函数返回。由于VB不支持无符号整数(只能按有符号整数对待),对16位AD芯片(VZero=32768., VMax=65535.),要得到电压值,需用如下公式:
If (ADBuf(1) > 0) Then
V = (ADBuf(1) - VZero) / (VMax - VZero) * 5
Else
V = (65536 + ADBuf(1) - VZero) / (VMax - VZero) * 5)
End If