固高运动控制卡实战(下):点位运动与直线/圆弧插补 API 详解

固高运动控制卡实战(下):点位运动与直线/圆弧插补 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 等)整理的学习笔记。

相关推荐
充值内卷1 小时前
[特殊字符] 自己动手做一个类 tldraw 的桌面白板:StepDraw 开源啦(C++ + WebView2 + Canvas)
开发语言·c++
raindayinrain1 小时前
c++对象模型--内存布局,多态,运行时类型识别
开发语言·c++
镜子AI1 小时前
镜子AI工程实践:用熵权法 + TOPSIS 做多方案选型排序(零依赖 Python)
开发语言·人工智能·python
估值探索者1 小时前
【Python量化组合管理实战 02】钱该怎么分?等权、波动率倒数与动态评分三种配权实测
java·开发语言·python·接口·股票数据api接口
西索斯coding1 小时前
Kimi K2.6 与 Qwen3.7 Max:跨文件修复评测与成本核算方法(2026)
开发语言·python·ai
从小白到软工1 小时前
5-2 从查表到控件:造按钮
c语言·开发语言·数据结构·经验分享·ai编程
迪康Defender2 小时前
PHP 高危漏洞应急分析:从风险原理到端点侧纵深防护
运维·开发语言·安全·自动化·php·运维开发·远程工作
2601_966949652 小时前
为什么不应该把 QuantDash API Key 直接写进公开代码仓库?从 Git 提交历史理解凭证泄露风险
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
智_永无止境2 小时前
又找到一个纯Java的OCR项目,识别的格式还挺多
java·开发语言·ocr