在很多应用场合,用户进行外触发工作,通常有两种方式来获得外触发信号的个数:
(1)采用IO计数卡,将外触发信号接入计数卡中,计数卡通过硬件对信号进行计数读出,优势在于计数精度较高及实时性好,劣势在于会增加系统成本、会占用计算机插槽、加大系统的复杂性及调试难度 。
(2)使用标准采集卡,在采集软件中增加对IO计数的功能。优势在于易于开发调试,无需增加系统复杂性。
本文针说明采用调用Sapera SDK的方式来实现,主要借助于SapTransfer和它的一些派生类。
- SapTransfer
功能:管理转移过程
常用函数:SapTransfer::Create
SapTransfer::Freeze
SapTransfer::Grab
SapTransfer::Snap
SapTransfer::Wait
SapTransfer::Abort
SapTransfer::IsGrabbing
SapTransfer::GetPair
- Specialized Transfer Classes
功能:特别转换类(一系列从属于SapTransfer的类,使用户方便操作许多常用的转移节点)
常用转换类:SapAcqToBuf Class
SapAcqDeviceToBuf Class
SapCabToBuf Class
SapBufToBuf Class
SapAcqToCab Class
SapCabToCab Class
SapBufToCab Class
上述类将端口的节点与图像的buffer进行关联, 这样每一帧图像进入SapTransfer的回调函数后,用户可以获得当前图像的节点信息,这些信息就包含有时间戳,而时间戳的计数基准可以以系统时间或者外触发信号的个数。通过上述方式,即可实现对外触发进行计数
采用该种方式按照如下几个步骤进行:
(1)在OnInitDlg函数new了m_Xfer对象之后,CreateObjects之前配置时间戳计时的基准
m_Xfer->GetPair(0)->SetCounterStampTimeBase(SapXferPair::CounterStampLineTrigger) ;
其中 GetPair(int pairindex)函数为获得特定节点的进入权限,节点为0到(获得的最大节点数-1),与采集卡上的端口进行对应
SetCounterStampTimeBase为设置计时基准的函数,参数可设几种,默认为CounterStampMicroSec,
SapXferPair::CounterStampMicroSec //以系统时间us为计数基准
SapXferPair::CounterStampMilliSec //以系统时间ms为计数基准
SapXferPair::CounterStampLine //以行有效信号或者水平同步信号为计数基准
SapXferPair::CounterStampLineTrigger //以编码器行触发脉冲为计数基准
SapXferPair::CounterStampFrame //以针有效信号或垂直同步信号为计数基准
SapXferPair::CounterStampExtFrameTrigger 以编码器帧触发脉冲为计数基准
需要注意的是,部分采集卡及采集卡驱动版本不支持里面的CounterStampExtFrameTrigger等,在调试代码时可能出现assert错误,请升级至最新采集卡驱动
(2)在XferCallback(SapXferCallbackInfo *pInfo) 中增加用以记录序号的int型变量timestamp,
int timestamp ;
m_Buffers->GetCounterStamp(×tamp);
(3)通过获取的时间戳与前一个时间戳相减,再与实际采集到的图像比对,以检查是否丢行 。例如设置一帧图像为1000行,如果前后两个时间戳之间的差为1001,则实际采集时出现了丢一行的情况