前几年做相机飞拍的时候,需要运动轴在高速运动的过程中,触发相机拍照,当年写的没做记录,然后忘记了。最近又碰到了高速轴在运动时候,触发Laser采集信息的功能。查了下固高说明书,需要用高速捕获功能。现做个记录!
运动控制器端子板共有
2
个位置比较输出通道(也即
HSIO
口),
CN14 HSIO
的
1
、
6
脚差分输
出
HSIO0
,
2
、
7
脚差分输出
HSIO1
。
5
脚是
5V
,
9
脚是地。位置比较脉冲输出电压为
5V
。
使用
GT_SetCaptureMode
指令,把某一编码器的捕获模式设置为
CAPTURE_HSIO0
或
CAPTURE_HSIO1
,
HSIO
作为捕获源时使用上升沿触发,即可在
HSIO0
或
HSIO1
口输出上升沿
的同时锁存指定编码器的值。
这里主要用到三个函数。触发前 设置
GT_SetCaptureMode GT_CompareData ,
触发完成后,调用
GT_GetCaptureStatus
查询完成状态
。

mode为捕获模式,CAPTURE_HSIO0(HSIO0 口捕获) CAPTURE_HSIO1 HSIO1
口捕获 看电气接的是哪个口。

这里需要注意的点是,pBuf给出的位置是要触发的位置相对于运动起始位置的相对值,而不是绝对值!!!触发可以输出电平,也可以输出脉冲,看自己的实际使用情况。

说明书实例


个人写的代码示例:
double nPos1 = 0;
double nPos2 = 0;
g_pDev->GetAxisPlanPos(StationID_1,DEV_AXIS_PCB_Y,nPos1);
nPos1 = nPos1 * g_pData->m_cAxis[DEV_AXIS_PCB_Y][StationID_1].nRatio;
g_pDev->m_cHeightIP[0].XDLaserTrigModeSet(TRIG_ENCODER_LEVEL);
double dPluse1 = g_pData->m_LaserTestTrig1*g_pData->m_cAxis[DEV_AXIS_PCB_Y][StationID_1].nRatio - nPos1;
double dPluse2 = g_pData->m_LaserTestTrig2*g_pData->m_cAxis[DEV_AXIS_PCB_Y][StationID_1].nRatio - nPos1;
long pBuf[2] = {dPluse1,dPluse2}; //这里比较位置为相对于开始运动的点位偏移量
short sRtn = -1;
sRtn = GT_CompareData(g_pData->m_cAxis[DEV_AXIS_PCB_Y][StationID_1].nCardID,
g_pData->m_cAxis[DEV_AXIS_PCB_Y][StationID_1].nAxisID,
1,1,0,0,pBuf,2,NULL,0); // 位置1到2中间要输出高电平
// 启动Hsio 捕获
sRtn = GT_SetCaptureMode(g_pData->m_cAxis[DEV_AXIS_PCB_Y][StationID_1].nCardID,
g_pData->m_cAxis[DEV_AXIS_PCB_Y][StationID_1].nAxisID,CAPTURE_HSIO0);
//打开Laser触发 ,开始运动
g_pDev->m_cHeightIP[0].XDLaserTrigOn();
g_pDev->AxisMove(StationID_1,DEV_AXIS_PCB_Y,g_pData->m_LaserTestEnd,DEV_POS_VEL);
g_pDev->m_cHeightIP[0].XDLaserTrigOff();
//查询触发状态。这里是采用软件查询。也可以万用表去测量实际电压值,有触发的话,电压值会瞬间变化
short pSts=0;
long pVal=0;
sRtn = GT_GetCaptureStatus(g_pData->m_cAxis[DEV_AXIS_PCB_Y][StationID_1].nCardID, g_pData->m_cAxis[DEV_AXIS_PCB_Y][StationID_1].nAxisID, &pSts, &pVal);