运动模式是指规划一个或多个轴运动的方式。 运动控制器支持的运动模式有点位运动模式、 Jog运动模式、电子齿轮(即 Gear) 运动模式和插补运动模式
GT_PrfTrap | 设置指定轴为点位模式 |
GT_PrfJog | 设置指定轴为 Jog 模式 |
GT_PrfGear | 设置指定轴为电子齿轮模式 |
GT_GetPrfMode | 查询指定轴的运动模式 |
在设置或切换运动模式时,要保证轴处于规划静止状态。如果轴正在运动,请先调用GT_Stop 指令停止一个或多个轴的运动,然后再调用上表中的指令切换到想要的运动模式下。
一·、点位模式(PT)
每一个轴在规划静止时都可以设置为点位运动。在点位运动模式下,各轴可以独立设置目标位置、目标速度、加速度、减速度、起跳速度、平滑时间等运动参数,能够独立运动或停止。
GT_PrfTrap | 设置指定轴为点位运动模式 |
GT_SetTrapPrm | 设置点位运动模式下的运动参数 |
GT_GetTrapPrm | 读取点位运动模式下的运动参数 |
GT_SetPos | 设置目标位置 |
GT_GetPos | 读取目标位置 |
GT_SetVel | 设置目标速度 |
GT_GetVel | 读取目标速度 |
GT_Update | 启动点位运动 |
JOG模式关键程序步骤:
(1)配置运动控制器 --GT_LoadConfig
(2)将 AXIS 轴设为点位模式 --GT_PrfTrap
(3)设置需要修改的运动参数 --GT_GetTrapPrm
public struct TTrapPrm
{
public double acc;//加速度
public double dec;//减速度
public double velStart;//起始速度
public short smoothTime;//平滑时间
}
(4)设置 AXIS 轴的目标位置 --GT_SetPos
(5)设置 AXIS 轴的目标速度 --GT_SetVel
(6)启动AXIS轴运动 --GT_Update
(7)等待AXIS轴规划停止
(8)电机伺服关闭 --GT_AxisOff
例程:将第 1 轴设定为点位运动模式,并且以速度 50pulse/ms,加速度 0.25pulse/ms2,减速度0.125pulse/ms2,平滑时间为 25ms 的运动参数正向运动 50000 个脉冲。
int main(int argc, char* argv[])
{
short sRtn;
TTrapPrm trap;
long sts;
double prfPos;
// 1、打开运动控制器
sRtn = GT_Open();
//2、复位运动控制器
sRtn = GT_Reset();
commandhandler("GT_Reset", sRtn);
//3、 配置运动控制器
// 注意:配置文件取消了各轴的报警和限位
sRtn = GT_LoadConfig("test.cfg");
// 4、清除各轴的报警和限位
sRtn =GT_ClrSts(1, 8);
///5、伺服使能
sRtn =GT_AxisOn(AXIS);
// 位置清零
sRt6、n = GT_ZeroPos(AXIS);
//7、将 AXIS 轴设为点位模式
sRtn = GT_PrfTrap(AXIS);
//8、读取点位运动参数(需要读取所有运动参数到上位机变量)
sRtn = GT_GetTrapPrm(AXIS, &trap);
//9、设置需要修改的运动参数
trap.acc = 0.25;
trap.dec = 0.125;
trap.smoothTime = 25;
//10、设置点位运动参数
sRtn = GT_SetTrapPrm(AXIS, &trap);
//11、设置 AXIS 轴的目标位置
sRtn = GT_SetPos(AXIS, 50000L);
//12、设置AXIS轴的目标速度
sRtn = GT_SetVel(AXIS, 50);
//13、启动AXIS轴的运动
sRtn = GT_Update(1<<(AXIS-1));
do
{
// 读取AXIS轴的状态
sRtn = GT_GetSts(AXIS, &sts);
// 读取AXIS轴的规划位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
printf("sts=0x%-10lxprfPos=%-10.1lf\r", sts, prfPos);
}while(sts&0x400);
//14、等待AXIS轴规划停止
//15、伺服关闭
sRtn = GT_AxisOff(AXIS);
printf("\nGT_AxisOff()=%d\n", sRtn);
getch();
return 0;
}
二、JOG运动模式
在 Jog 运动模式下,各轴可以独立设置目标速度、加速度、减速度、平滑系数等运动参数,能够独立运动或停止
GT_PrfJog | 设置指定轴为 Jog 运动模式 |
GT_SetJogPrm | 设置 Jog 运动模式下的运动参数 |
GT_GetJogPrm | 读取 Jog 运动模式下的运动参数 |
GT_SetVel | 设置目标速度 |
GT_GetVel | 读取目标速度 |
GT_Update | 启动 Jog 运动 |
JOG模式关键程序步骤:
(1)配置运动控制器 --GT_LoadConfig
(2)将 AXIS 轴设为JOG模式 --GT_PrfJog
(3)设置JOG运动参数 --GT_SetJogPrm
public struct TJogPrm
}
(4)设目标速度 --GT_SetVel
(5)启动 AXIS 轴的运动 --GT_Update
(6)在运动过程中可以更改运动速度 --GT_SetVel GT_Update
(7)伺服关闭 --GT_AxisOffint main(int argc, char* argv[])
{
short sRtn;
TJogPrm jog;
long sts;
double prfPos, prfVel;
// 打开运动控制器
sRtn = GT_Open();
// 指令返回值检测,请查阅例程 3-1
// 复位运动控制器
sRtn = GT_Reset();
// 配置运动控制器
// 注意:配置文件取消了各轴的报警和限位
sRtn = GT_LoadConfig("test.cfg");
// 清除各轴的报警和限位
sRtn =GT_ClrSts(1, 8);
// 伺服使能
sRtn = GT_AxisOn(AXIS);
// 位置清零
sRtn = GT_ZeroPos(AXIS);
// 将 AXIS 轴设为 Jog 模式
sRtn = GT_PrfJog(AXIS);
// 读取 Jog 运动参数(需要读取全部运动参数到上位机变量)
sRtn =GT_GetJogPrm(AXIS, &jog);
//设置需要修改的运动参数
jog.acc = 0.0625;
jog.dec = 0.0625;
// 设置 Jog 运动参数
sRtn = GT_SetJogPrm(AXIS, &jog);
// 设置 AXIS 轴的目标速度
sRtn = GT_SetVel(AXIS, 100);
// 启动 AXIS 轴的运动
sRtn = GT_Update(1<<(AXIS-1));
while(1)
{
// 读取AXIS轴的状态
sRtn = GT_GetSts(AXIS, &sts);
// 读取AXIS轴的规划位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 读取AXIS轴的规划速度
sRtn = GT_GetPrfVel(AXIS, &prfVel);
printf("sts=0x%-10lxprfPos=%-10.1lfprfVel=%-10.1lf\r", sts, prfPos, prfVel);
if(prfPos>= 100000)
{
// 设置AXIS轴新的目标速度
sRtn = GT_SetVel(AXIS, 50);
// AXIS轴新的目标速度生效
sRtn = GT_Update(1<<(AXIS-1));
break;
}
}
while(!kbhit())
{
// 读取AXIS轴的状态
sRtn = GT_GetSts(AXIS, &sts);
// 读取AXIS轴的规划位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 读取AXIS轴的规划速度
sRtn = GT_GetPrfVel(AXIS, &prfVel);
printf("sts=0x%-10lxprfPos=%-10.1lfprfVel=%-10.1lf\r", sts, prfPos, prfVel);
}
// 伺服关闭
sRtn = GT_AxisOff (AXIS);
printf("\nGT_AxisOff()=%d\n", sRtn);
getch();
return 0;
}
三、电子齿轮模式(Gear)
电子齿轮模式能够将两轴或多轴联系起来,实现精确的同步运动,从而替代传统的机械齿轮连接。
我们把被跟随的轴叫主轴,把跟随的轴叫从轴。电子齿轮模式下, 1 个主轴能够驱动多个从轴,从轴可以跟随主轴的规划位置、编码器位置。
传动比:主轴速度与从轴速度的比例。电子齿轮模式能够灵活的设置传动比,节省机械系统的安装时间。当主轴速度变化时,从轴会根据设定好的传动比自动改变速度。电子齿轮模式也能够在运动过程中修改传动比。
GT_PrfGear | 设置指定轴为电子齿轮运动模式 |
GT_SetGearMaster | 设置电子齿轮运动跟随主轴 |
GT_GetGearMaster | 读取电子齿轮运动跟随主轴 |
GT_SetGearRatio | 设置电子齿轮比 |
GT_GetGearRatio | 读取电子齿轮比 |
GT_GearStart | 启动电子齿轮运动 |
Gear模式关键程序步骤:
1、控制卡配置
(1)配置运动控制器 --GT_LoadConfig
2、主轴配置
(1)将 AXIS 轴设为JOG模式 --GT_PrfJog
(2)设置JOG运动参数 --GT_SetJogPrm
public struct TJogPrm
{
public double acc;
public double dec;
public double smooth;
}
(3)设目标速度 --GT_SetVel
(4)启动主轴的运动 --GT_Update
3、从轴配置
(1)将从轴设为 Gear 模式 --GT_PrfGear
(2)设置主轴,默认跟随主轴规划位置 --GT_SetGearMaster(SLAVE, MASTER)
(3)设置从轴的传动比和离合区 --GT_SetGearRatio(SLAVE, 2, 1, 100000)
说明:
1) 调 用 GT_SetGearRatio(short profile, long masterEven, long slaveEven, long masterSlope)
指令来设置传动比和离合区。 profile 是从轴轴号; masterEven 是主轴位
移, slaveEven 是从轴位移, masterEven/slaveEven 等于传动比; slope 是主轴离合
区位移,即主轴在离合区内走过的位移,用户应自行计算出来。
2) 如果从轴轴号为 slave,当主轴位移 alpha 时从轴位移 beta,主轴运动 slope 位移后从
轴到达设定传动比,应当调用以下指令:GT_SetGearRatio(slave, alpha, beta, slope);
(4)启动从轴 --GT_GearStart
示例:主轴为 Jog 模式,从轴为电子齿轮模式,传动比为主轴速度:从轴速度=2: 1,主轴运动离合区位移后(图中阴影部分的区域),从轴达到设定的传动比。
int main(int argc, char* argv[])
{
short sRtn;
double prfVel[8];
TJogPrm jog;
// 打开运动控制器
sRtn = GT_Open();
// 复位运动控制器
sRtn = GT_Reset();
// 配置运动控制器
// 注意:配置文件 test.cfg 取消了各轴的报警和限位
sRtn = GT_LoadConfig("test.cfg");
// 清除各轴的报警和限位
sRtn =GT_ClrSts(1, 8);
// 伺服使能
sRtn = GT_AxisOn(MASTER);
sRtn = GT_AxisOn(SLAVE);
// 位置清零
sRtn = GT_ZeroPos(MASTER);
sRtn = GT_ZeroPos(SLAVE);
// 1、将主轴设为 Jog 模式
sRtn = GT_PrfJog(MASTER);
//2、设置主轴运动参数
sRtn =GT_GetJogPrm(MASTER, &jog);
jog.acc = 1;
sRtn = GT_SetJogPrm(MASTER, &jog);
sRtn = GT_SetVel(MASTER, 100);
//3、启动主轴
sRtn = GT_Update(1<<(MASTER-1));
// 将从轴设为 Gear 模式
sRtn = GT_PrfGear(SLAVE);
// 设置主轴,默认跟随主轴规划位置
sRtn = GT_SetGearMaster(SLAVE, MASTER);
// 设置从轴的传动比和离合区
sRtn = GT_SetGearRatio(SLAVE, 2, 1, 100000);
// 启动从轴
sRtn =GT_GearStart(1<<(SLAVE-1));
while(!kbhit())
{
// 查询各轴的规划速度
sRtn = GT_GetPrfVel(1, prfVel, 8);
printf("master vel=%-10.2lf\tslave vel=%-10.2lf\r",
prfVel[MASTER-1], prfVel[SLAVE-1]);
}
// 伺服关闭
sRtn = GT_AxisOff (MASTER);
printf("\nGT_AxisOff()=%d, Axis:%d\n", sRtn, MASTER);
sRtn = GT_AxisOff (SLAVE);
printf("\nGT_AxisOff()=%d, Axis:%d\n", sRtn, SLAVE);
getch();
return 0;
}
四、插补运动模式
GT_SetCrdPrm | 设置坐标系参数,确立坐标系映射,建立坐标系 |
GT_GetCrdPrm | 查询坐标系参数 |
GT_CrdData | 向插补缓存区增加插补数据 |
GT_LnXY | 缓存区指令,二维直线插补 |
GT_LnXYZ | 缓存区指令,三维直线插补 |
GT_LnXYZA | 缓存区指令,四维直线插补 |
GT_LnXYG0 | 缓存区指令,二维直线插补(终点速度始终为 0) |
GT_LnXYZG0 | 缓存区指令,三维直线插补(终点速度始终为 0) |
GT_LnXYZAG0 | 缓存区指令,四维直线插补(终点速度始终为 0) |
GT_ArcXYR | 缓存区指令, XY 平面圆弧插补(以终点位置和半径为输入参数) |
GT_ArcXYC | 缓存区指令, XY 平面圆弧插补(以终点位置和圆心位置为输入参数) |
GT_ArcYZR | 缓存区指令, YZ 平面圆弧插补(以终点位置和半径为输入参数) |
GT_ArcYZC | 缓存区指令, YZ 平面圆弧插补(以终点位置和圆心位置为输入参数) |
GT_ArcZXR | 缓存区指令, ZX 平面圆弧插补(以终点位置和半径为输入参数) |
GT_ArcZXC | 缓存区指令, ZX 平面圆弧插补(以终点位置和圆心位置为输入参数) |
GT_BufIO | 缓存区指令,缓存区内数字量 IO 输出设置指令 |
GT_BufDelay | 缓存区指令,缓存区内延时设置指令 |
GT_BufDA | 缓存区指令,缓存区内输出 DA 值 |
GT_BufLmtsOn | 缓存区指令,缓存区内有效限位开关 |
GT_BufLmtsOff | 缓存区指令,缓存区内无效限位开关 |
GT_BufSetStopIo | 缓存区指令,缓存区内设置 axis 的停止 IO 信息 |
GT_BufMove | 缓存区指令,实现刀向跟随功能,启动某个轴点位运动 |
GT_BufGear | 缓存区指令,实现刀向跟随功能,启动某个轴跟随运动 |
GT_CrdSpace | 查询插补缓存区剩余空间 |
GT_CrdClear | 清除插补缓存区内的插补数据 |
GT_CrdStart | 启动插补运动 |
GT_CrdStatus | 查询插补运动坐标系状态 |
GT_SetUserSegNum | 缓存区指令,设置自定义插补段段号 |
GT_GetUserSegNum | 读取自定义插补段段号 |
GT_GetRemainderSegNum | 读取未完成的插补段段数 |
GT_SetOverride | 设置插补运动目标合成速度倍率 |
GT_SetCrdStopDec | 设置插补运动平滑停止、急停合成加速度 |
GT_GetCrdStopDec | 查询插补运动平滑停止、急停合成加速度 |
GT_GetCrdPos | 查询该坐标系的当前坐标位置值 |
GT_GetCrdVel | 查询该坐标系的合成速度值 |
GT_InitLookAhead | 初始化插补前瞻缓存区 |
使用插补模式需要至少两步操作:建立坐标系和向缓存区存入数据。下面分别就这两个步骤分别进行详细讲解。
(一)建立坐标系
建立坐标系就是初始化 TCrdPrm 结构体。
public struct TCrdPrm
{
public short dimension; //表示所建立的坐标系的维数,取值范围:[1, 4]
public short profile1; // 分别规划轴1~8.如果规划轴.没有对应到该坐标系,则 profile[x]的值为 0;
public short profile2;
public short profile3; //如果对应到了 X 轴,则 profile[x]为 1,Y 轴对应为 2, Z 轴对应为 3, A 轴对应为 4。
public short profile4;
public short profile5; //每个元素的取值范围: [0, 4]
public short profile6;
public short profile7;
public short profile8;
public double synVelMax; //该坐标系所能承受的最大合成速度 ,取值范围: (0, 32767)
public double synAccMax; //该坐标系所能承受的最大合成加速度 ,取值范围: (0, 32767)
public short evenTime; //最小匀速时间 ,取值范围: (0, 32767)
public short setOriginFlag; //是否需要指定坐标系的原点坐标的规划位置.0:不需要指定原点坐标值,则坐标系
//的原点在当前规划位置上。 1:需要指定原点坐标值,坐标系的原点在 originPos指
//定的规划位置上。
public int originPos1;
public int originPos2; //指定的坐标系原点的规划位置值
public int originPos3;
public int originPos4;
public int originPos5;
public int originPos6;
public int originPos7;
public int originPos8;
}
例程:建立了一个二维坐标系,规划轴 1 对应为 x 轴,规划轴 2 对应为 y 轴,坐标系原点的规划位置是(100, 100), 单位: pulse,在此坐标系内运动的最大合成速度为 500pulse/ms,最大合成加速度为 1pulse/ms^2, 最小匀速时间为 50ms。
TCrdPrm crdPrm;
// 将结构体变量初始化为0
memset(&crdPrm, 0, sizeof(crdPrm));
// 为结构体赋值
crdPrm.dimension=2; // 坐标系为二维坐标系
crdPrm.synVelMax=500; // 最大合成速度: 500pulse/ms
crdPrm.synAccMax=1; // 最大加速度: 1pulse/ms^2
crdPrm.evenTime = 50; // 最小匀速时间: 50ms
crdPrm.profile[0] = 1; // 规划器1对应到X轴
crdPrm.profile[1] = 2; // 规划器2对应到Y轴
crdPrm.setOriginFlag = 1; // 表示需要指定坐标系的原点坐标的规划位置
crdPrm.originPos[0] = 100; // 坐标系的原点坐标的规划位置为(100, 100)
crdPrm.originPos[1] = 100;
// 建立1号坐标系,设置坐标系参数
sRtn = GT_SetCrdPrm(1, &crdPrm);
(二)向缓存区存入数据
步骤:
(a)首先清除缓存区中的数据。--GT_CrdClear(坐标系号,缓冲区号)
(b)向对应坐标系的相应缓冲区添加运行或动作数据。 --GT_ArcXYR,GT_LnXYZG0,GT_LnXY,GT_BufDelay等
(c)启动插补运动。 --GT_CrdStart
(1)直线插补例程
假设某数控机床刀具在 xy 平面从原点出发,走一段如图 6-12 所示的正六边形轨迹。一共需要
走七段轨迹,图中标号已标出。每走完一段轨迹会输出一次 IO 信号,并且暂停 400ms。
// 即将把数据存入坐标系1的FIFO0中,所以要首先清除此缓存区中的数据
sRtn = GT_CrdClear(1, 0);
// 向缓存区写入第一段插补数据
sRtn = GT_LnXY(
1, // 该插补段的坐标系是坐标系1
200000, 0, // 该插补段的终点坐标(200000, 0)
100, // 该插补段的目标速度: 100pulse/ms
0.1, // 插补段的加速度: 0.1pulse/ms^2
0, // 终点速度为0
0); // 向坐标系1的FIFO0缓存区传递该直线插补数据
// 向缓存区写入第二段插补数据
sRtn = GT_LnXY(1, 100000, 173205, 100, 0.1, 0, 0);
// 缓存区数字量输出
sRtn =GT_BufIO(
1, // 坐标系是坐标系1
MC_GPO, // 数字量输出类型:通用输出
0xffff, // bit0~bit15全部都输出
0x55, // 输出的数值为0x55
0); // 向坐标系1的FIFO0缓存区传递该数字量输出
// 缓存区延时指令
sRtn =GT_BufDelay(
1, // 坐标系是坐标系1
400, // 延时400ms
0); // 向坐标系1的FIFO0缓存区传递该延时
// 启动坐标系1的FIFO0的插补运动
sRtn = GT_CrdStart(1, 0);
do
{
// 查询坐标系1的FIFO的插补运动状态
sRtn = GT_CrdStatus(
1, // 坐标系是坐标系1
&run, // 读取插补运动状态
&segment, // 读取当前已经完成的插补段数
0); // 查询坐标系1的FIFO0缓存区
// 坐标系在运动, 查询到的run的值为1
}while(run == 1);
......
(2)圆弧插补指令分为两种:
a) 半径描述方法 --GT_ArcXYR、 GT_ArcYZR、 GT_ArcZXR
b) 圆心坐标描述方法 -- GT_ArcXYC、 GT_ArcYZC、 GT_ArcZXC
// 即将把数据存入坐标系1的FIFO0中,所以要首先清除此缓存区中的数据
sRtn = GT_CrdClear(1, 0);
// 向缓存区写入第一段插补数据
sRtn = GT_LnXY(
1, // 该插补段的坐标系是坐标系1
200000, 0, // 该插补段的终点坐标(200000, 0)
100, // 该插补段的目标速度: 100pulse/ms
0.1, // 插补段的加速度: 0.1pulse/ms^2
0, // 终点速度为0
0); // 向坐标系1的FIFO0缓存区传递该直线插补数据
// 向缓存区写入第二段插补数据,该段数据是以圆心描述方法描述了一个整圆
sRtn = GT_ArcXYC(
1, // 坐标系是坐标系1
200000, 0, // 该圆弧的终点坐标(200000, 0)
-100000, 0, // 圆弧插补的圆心相对于起点位置的偏移量(-100000, 0)
0, // 该圆弧是顺时针圆弧
100, // 该插补段的目标速度: 100pulse/ms
0.1, // 该插补段的加速度: 0.1pulse/ms^2
0, // 终点速度为0
0); // 向坐标系1的FIFO0缓存区传递该直线插补数据
// 向缓存区写入第三段插补数据,该段数据是以半径描述方法描述了一个1/4圆弧
sRtn = GT_ArcXYR(
1, // 坐标系是坐标系1
0, 200000, // 该圆弧的终点坐标(0, 200000)
200000, // 半径: 200000pulse
1, // 该圆弧是逆时针圆弧
100, // 该插补段的目标速度: 100pulse/ms
0.1, // 该插补段的加速度: 0.1pulse/ms^2
0, // 终点速度为0
0); // 向坐标系1的FIFO0缓存区传递该直线插补数据
// 向缓存区写入第四段插补数据,回到原点位置
sRtn = GT_LnXY(1, 0, 0, 100, 0.1, 0, 0);
//启动坐标系1的FIFO0的插补运动
sRtn = GT_CrdStart(1, 0);
do
{
// 查询坐标系1的FIFO的插补运动状态
sRtn = GT_CrdStatus(
1, // 坐标系是坐标系1
&run, // 读取插补运动状态
&segment, // 读取当前已经完成的插补段数
0); // 查询坐标系1的FIFO0缓存区
// 坐标系在运动, 查询到的run的值为1
}while(run == 1);