每个坐标系包含两个缓存区(FIFO):FIFO0和FIFO1,其中FIFO0为主要运动FIFO,FIFO1为辅助运动FIFO,每个FIFO都含有4096段插补数据的空间。
注:缓存区的释放:用户如果不使用插补模式,直接切换到其他运动模式,插补模式的缓存区就自动释放了。如调用指令 GT_PrfJog 即可。
在运动控制器的插补模式下,不能随意切换到其他运动模式,否则会导致插补坐标系破坏,并且原来压入插补缓存区的数据会丢失。但是在实际应用中,经常会有类似下面例子描述的情况。假如机床在走一段轨迹的途中需要暂停下来,更换路径换刀或者移到安全的地方以查看加工效果,然后再回到暂停时的坐标继续完成剩余的轨迹。为了实现上述操作,应利用每个坐标系提供的两个缓存区FIFO0和FIFO1。
FIFO0是主运动FIFO,用户的主体插补运动的插补数据应该放在FIFO0中。FIFO0的插补运动可以被中断(通过调用GT_Stop指令),中断后可以进行辅助FIFO1的插补运动,辅助FIFO1的插补运动完成后,需要将坐标系位置恢复到FIFO0主运动被打断的位置,之后FIFO0可从断点处继续恢复原来的运动(恢复运动调用GT_CrdStart指令)。
FIFO1是辅助运动FIFO,用户的辅助插补运动的插补数据可以放在FIFO1中,FIFO1的插补数据必须在FIFO0的运动停止的情况下才能输入,如果FIFO0在运动,向FIFO1中传递插补数据,将会提示错误。FIFO1的插补运动也可以暂停、恢复,但是,在FIFO1暂停时不可以进行FIFO0的插补运动,否则,FIFO1缓存区将会被清空,不可以再恢复FIFO1的运动。
注:在主运动 FIFO0 的运动暂停之后,又进行了 FIFO1 的运动,如果用户希望在 FIFO1 运动结束之后,继续进行 FIFO0 的运动,则用户必须保证,FIFO1 运动结束后,坐标位置值与 FIFO0 停止时的坐标位置值(断点位置)相同,否则, FIFO0 将不接受启动运动指令,调用 GT_CrdStart 指令恢复启动 FIFO0 的运动,将会提示错误。
主运动FIFO与辅助运动FIFO的关系可以参考下例。
例:假设机床需要做运动:主加工运动需要从(0, 0)运动到(100000, 100000)位置,中途在(50000,50000)附近出现了断刀,需要暂停运动去换刀。由于主加工运动已经将预定的轨迹数据压入了缓存区,若重新压入新的数据则会破坏原来的运动,因此需要启动辅助运动来协助完成。假设换刀轨迹是先走到(70000, 30000),然后走到(110000, 50000)位置完成换刀动作。但为了能继续主加工运动,需要回到暂停点。
// 清除fifo数据
sRtn = GT_CrdClear(1, 0);
sRtn = GT_CrdClear(1, 1);
// 向FIFO0缓存区写入主运动插补数据
sRtn = GT_LnXY(
1, // 该插补段的坐标系是坐标系1
100000, 100000, // 该插补段的终点坐标(100000, 100000)
10, // 该插补段的目标速度: 10pulse/ms
1, // 插补段的加速度: 1pulse/ms^2
0, // 终点速度为0
0); // 向坐标系1的FIFO0缓存区传递该直线插补数据
// 启动主运动,并将标志flag置1
sRtn = GT_CrdStart(1, 0);
flag = 1;
do
{
// 查询插补坐标位置
sRtn = GT_GetCrdPos(1, crdPos);
// 当X轴的坐标位置大于50000时,暂停
if(crdPos[0] > 50000.0)
{
// 停止坐标系1的运动
sRtn = GT_Stop(1<<8, 1<<8); //GT_Stop(轴号/坐标系号,停止方式)
// 注意:要等坐标系真正停止下来去获取当前的位置
do
{
// 读取坐标系的状态,查看是否停止
sRtn = GT_CrdStatus(1, &run, &seg, 0);
}while(run == 1);
// 获取暂停后当前的位置,并将标志 flag 置 0,退出 while 循环
sRtn = GT_GetCrdPos(1, crdstoppos);
flag = 0;
}
printf("crdPos[0]=%-10.1lf crdPos[1]=%-10.1lf\r", crdPos[0], crdPos[1]);
}while(flag == 1);
// 向FIFO1缓存区写入辅助运动插补数据
sRtn = GT_LnXY(1, 70000, 30000, 10, 1, 0, 1);
sRtn = GT_LnXY(1, 110000, 50000, 10, 1, 0, 1);
// 启动坐标系1的FIFO1中运动
sRtn = GT_CrdStart(1, 1);
do
{
// 查询插补规划位置
sRtn = GT_GetCrdPos(1, crdPos);
// 等待辅助运动完毕
sRtn = GT_CrdStatus(1, &run, &seg, 1);
printf("crdPos[0]=%-10.1lf crdPos[1]=%-10.1lf\r", crdPos[0], crdPos[1]);
}while(1 == run);
// 向FIFO1压入暂停后的位置点
sRtn = GT_LnXY(1, (long)crdstoppos[0], (long)crdstoppos[1], 10, 1, 0, 1);
// 启动回暂停点运动
sRtn = GT_CrdStart(1, 1);
do
{
// 查询插补规划位置
sRtn = GT_GetCrdPos(1, crdPos);
// 等待回到暂停点位置运动完毕
sRtn = GT_CrdStatus(1, &run, &seg, 1);
printf("crdPos[0]=%-10.1lf crdPos[1]=%-10.1lf\r", crdPos[0], crdPos[1]);
}while(1 == run);
// 恢复主运动
sRtn = GT_CrdStart(1, 0);
do
{
// 获取当前的位置
sRtn = GT_GetCrdPos(1, crdPos);
// 等待主运动完毕
sRtn = GT_CrdStatus(1, &run, &seg, 0);
printf("crdPos[0]=%-10.1lf crdPos[1]=%-10.1lf\r", crdPos[0], crdPos[1]);
}while(1 == run);注:(1)等待某个轴运动结束的代码如下。 do
{
// 获取当前的位置
sRtn = GT_GetCrdPos(1, crdPos);//查询该坐标系的当前坐标位置值。
// 等待主运动完毕
sRtn = GT_CrdStatus(1,
&run, //读取插补运动状态。 0:该坐标系的该 FIFO 没有在运动; 1:该坐标系的该 FIFO正在进行插补运动。
&seg, //读取当前已经完成的插补段数。当重新建立坐标系或者调用 GT_CrdClear 指令后,该值会被清零。
0); //所要查询运动状态的插补缓存区号。
}while(1 == run);
(2) GT_Stop会停止相应坐标系的运动,但是并不会清空缓冲区的数据。当调用相应轴的 GT_CrdStart函数时,相应轴会向之前的目标点继续移动。