固高运动控制卡实战(下):点位运动与直线/圆弧插补 API 详解
上篇讲了初始化、上下电、Jog 点动。这篇进入"让轴精确运动":点位运动 (单轴走到指定位置)和多轴插补(XY 直线、圆弧),把固高 GTS 库里的插补 API 一次讲透。(上篇见《固高运动控制卡实战(上):初始化、伺服上下电、状态判断与 Jog 点动调试》)
一、从"点动"到"精确运动":三种运动模式
| 模式 | 干什么 | 典型 API |
|---|---|---|
| Jog(点动) | 按住动,松开停,调试用 | GT_PrfJog / GT_SetJogPrm |
| 点位运动 | 单轴从 A 精确走到 B | GT_SetPos / GT_SetVel / GT_Update |
| 插补运动 | 多轴联动走轨迹(直线/圆弧) | GT_LnXY / GT_ArcXYR / GT_ArcXYC |
Jog 是"调速",点位和插补是"定轨迹"。产线上真正干活的是点位和插补。
二、点位运动:单轴走到指定位置
固高 GTS 点位运动的标准套路(三件套):
csharp
// 1. 设目标位置(脉冲数)
gts.mc.GT_SetPos((short)axis, 100000); // 走到 100000 个脉冲的位置
// 2. 设运动速度
gts.mc.GT_SetVel((short)axis, 100); // 速度 100
// 3. 更新参数到控制卡(必须!)
gts.mc.GT_Update(1 << (axis - 1));
GT_Update 必须最后调 :前面设的位置、速度、加减速都只是"写入缓存",
GT_Update才把参数一次性生效到控制卡。忘记 Update = 轴不动,这是最常见的坑。
完整点位运动封装
csharp
/// <summary>
/// 单轴点位运动:从当前位置走到指定位置
/// </summary>
public int MoveAbs(int Axis, int Pos, double Vel, double Acc, double Dec)
{
gts.mc.GT_ClrSts((short)Axis, 8); // 清状态
gts.mc.GT_PrfTrap((short)Axis); // 设梯形速度规划模式
gts.mc.TTrapPrm trap = new gts.mc.TTrapPrm();
trap.acc = Acc; // 加速度
trap.dec = Dec; // 减速度
trap.vel = Vel; // 最大速度
gts.mc.GT_SetTrapPrm((short)Axis, ref trap); // 设梯形参数
gts.mc.GT_SetPos((short)Axis, Pos); // 设目标位置
gts.mc.GT_Update(1 << (Axis - 1)); // 生效
return 0;
}
梯形速度规划(Trap):电机从 0 加速到 Vel → 匀速 → 减速到 0,速度曲线像个梯形。这是点位运动最常用的规划模式。
三、直线插补:多轴联动走直线
直线插补 = 多个轴按比例同步运动,让末端走出直线轨迹。
GT_LnXY:XY 两轴直线
csharp
// 坐标系内走直线到 (x, y)
public static extern short GT_LnXY(short crd, int x, int y,
double synVel, double synAcc, double velEnd, short fifo);
| 参数 | 含义 |
|---|---|
| crd | 坐标系号(1~8) |
| x, y | 目标位置(脉冲) |
| synVel | 合成速度(沿轨迹方向的速度) |
| synAcc | 合成加速度 |
| velEnd | 终点速度(一般 0) |
| fifo | 缓冲队列模式(0/1) |
GT_LnXYZ:XYZ 三轴直线
csharp
// XYZ 三轴直线插补
gts.mc.GT_LnXYZ(1, 50000, 30000, 10000, 100, 1000, 0, 0);
// crd x y z synVel synAcc velEnd fifo
坐标系概念:插补必须先在坐标系下运动(GT_SetCrdPrm 配坐标系),轴和坐标系的对应关系在 GTS800.cfg 里配置。
G0 快速移动:不关心轨迹的"空跑"
csharp
// G0 模式:快速移动到目标点(不严格保证轨迹,速度优先)
gts.mc.GT_LnXYG0(1, 50000, 30000, 100, 1000, 0);
G0 常用于换刀、回到安全位等"快速转场"动作,G1(GT_LnXY)才用于加工/测量轨迹。
四、圆弧插补:走圆弧
方式一:GT_ArcXYR ------ 半径方式
csharp
// 圆弧插补(半径方式)
public static extern short GT_ArcXYR(short crd, int x, int y, double radius,
short circleDir, double synVel, double synAcc, double velEnd, short fifo);
| 参数 | 含义 |
|---|---|
| x, y | 圆弧终点坐标 |
| radius | 圆弧半径 |
| circleDir | 方向(1=顺时针,0=逆时针) |
方式二:GT_ArcXYC ------ 圆心方式
csharp
// 圆弧插补(圆心方式)
public static extern short GT_ArcXYC(short crd, int x, int y,
double xCenter, double yCenter, short circleDir,
double synVel, double synAcc, double velEnd, short fifo);
| 参数 | 含义 |
|---|---|
| x, y | 圆弧终点坐标 |
| xCenter, yCenter | 圆心坐标(相对当前位置的偏移) |
| circleDir | 方向(1=顺时针,0=逆时针) |
半径 vs 圆心 :半径方式只给半径让控制卡自己算圆心,代码简单但有歧义(同一半径有两个圆弧);圆心方式直接给圆心位置,精确无歧义,加工场景推荐圆心方式。
示例:画一个正方形 + 圆角
csharp
// 1. 起点先移动到 (0,0)
// 2. 四条边直线插补
gts.mc.GT_LnXY(1, 50000, 0, 100, 1000, 0, 0); // 走到右上角
gts.mc.GT_LnXY(1, 50000, 50000, 100, 1000, 0, 0); // 走到左上角
gts.mc.GT_LnXY(1, 0, 50000, 100, 1000, 0, 0); // 走到左下角
gts.mc.GT_LnXY(1, 0, 0, 100, 1000, 0, 0); // 回到原点
// 3. 圆弧
gts.mc.GT_ArcXYC(1, 30000, 20000, 10000, 10000, 1, 100, 1000, 0, 0);
五、连续插补:一段接一段不减速
csharp
// 连续插补:一次提交多段,段与段之间不停顿
public static extern short GT_LnXYZWN(short crd, int x, int y, int z,
double synVel, double synAcc, double velEnd, int segNum, short fifo);
segNum = 段数 。一次把整条路径的多段全部提交给控制卡,控制卡自动衔接,段与段之间不减速、不停顿,适合画复杂轮廓(如多段折线、多边形)。
六、运动中读位置、读速度、急停
csharp
// 读规划位置(走的目标位置)
double pos = 0;
gts.mc.GT_GetPrfPos((short)axis, out pos, 1, out uint clock);
// 读实际速度
double vel = 0;
gts.mc.GT_GetVel((short)axis, out vel);
// 读状态(运动中/限位/报警)
gts.mc.GT_GetSts((short)axis, out int pSts, 1, out uint clock2);
// 急停(option=0 立即停,option=1 减速停)
gts.mc.GT_Stop(1 << (axis - 1), 1);
读位置是调试神器 :把
GT_GetPrfPos放到定时器里轮询,就能在界面实时显示轴位置,验证运动是否到位。
七、坐标系参数:插补前先配好
csharp
// 设置坐标系参数(哪个轴属于哪个坐标系、各轴比例等)
gts.mc.TCrdPrm crdPrm = new gts.mc.TCrdPrm();
gts.mc.GT_GetCrdPrm(1, out crdPrm); // 先读当前坐标系配置
// ... 修改参数 ...
gts.mc.GT_SetCrdPrm(1, ref crdPrm); // 写回控制卡
坐标系参数一般在 GTS800.cfg 里配好(轴的映射、合成比例),代码里主要是读出来确认。
八、下篇小结
| 知识点 | 一句话 |
|---|---|
| 三种运动模式 | Jog(调试)/ 点位(单轴定位)/ 插补(多轴轨迹) |
| 点位运动 | SetPos + SetVel + Update,忘记 Update 轴不动 |
| 直线插补 | GT_LnXY / GT_LnXYZ,合成速度 synVel |
| 圆弧插补 | GT_ArcXYR(半径)/ GT_ArcXYC(圆心,加工推荐) |
| G0 快速移动 | 不关心轨迹,速度优先 |
| 连续插补 | GT_LnXYZWN,多段不停顿 |
| 读状态 | GetPrfPos / GetVel / GetSts,定时器轮询实时显示 |
| 急停 | GT_Stop(0 立即停 / 1 减速停) |
结语
从 Jog 点动到点位运动再到多轴插补,就是运动控制开发的三级跳。固高 GTS 的 API 设计很统一:先设模式、再设参数、最后 GT_Update 生效,记住这个套路,任何轴都能调起来。觉得有用就点赞收藏,下一篇继续!
参考:结合固高(Googol)GTS 系列运动控制卡、gts.cs API 库(GT_LnXY/GT_ArcXYR/GT_ArcXYC 等)整理的学习笔记。