运动控制卡

发布时间:2026/7/24 22:50:04
运动控制卡 什么是运动控制卡是一种基于PC机及工业PC机、 用于各种运动控制场合包括位移、速度、加速度等的上位控制单元运动控制卡原理可与各种类型的步进电机驱动器连接驱动步进电机组成高精度位置控制系统或调速系统。可与电脑机组成主从式控制结构电脑机负责人机界面的管理和其它管理工作而运动控制卡负责运动控制方面的所有细节。运动控制卡用户通过厂家提供的动态链接库可方便快速的开发出自己需要的运动控制功能固高科技MCT2008 Demo 使用MCT2008 是固高运动控制器的功能演示和调试软件通过该软件可以查看和监控控制器状态配置板卡、测试控制器不同功能模块、调试电机系统等1. 复位操作复位以后一般情况下由于调试时没有连接位等传感器而控制器在出现报警状态下是不能运行的因此为了能顺利让电机运行应当使限位等报警无效轴状态以第1轴为例操作如下:1)点击 MCT2008 主界面菜单“视图”--“轴状态”各个部件的状态是否绿色如果是红色 调整对应部件参数下图中 正负限位 和驱动报警 为红色工具--控制器配置-- di 数字量输入调整正负限位输入反转回到视图”--“轴状态”界面 查看是否变绿 绿色既为正常伺服使能绿色默认是未上电 需要点击 伺服使能按钮 上电其他轴状态 如上步骤修改完毕后 写入控制器状态 保存参数本地使用控制器状态 写入到文件 GTS800.cfg 保存到winform项目 debug文件夹测试运动菜单轴状态 实时查看各轴位置、速度、报警、限位、伺服使能状态 排查轴卡死、限位触发、伺服报警故障示波器 波形采集位置/速度/指令脉冲/编码器反馈曲线 整定PID、查看启停加减速抖动提升视觉定位重复精度编码器 实时读取编码器实际脉冲值 校验实际走距和指令距离是否一致排查丢脉冲问题点位运动 坐标定点移动 视觉取像点位、产品固定工位移动调试Jog 点动连续走轴Pt 分段多段 点位轨迹运动Follow 电子跟随主轴从动轴同步运转Gear 电子齿轮耦合 多轴同步联动插补运动 直线/圆弧两轴联动插补 视觉轮廓轨迹跟踪、弧形路径运动数字量输入 实时监控DI硬件输入电平限位、急停、传感器信号 确认光电感应、硬限位接线是否正常数字量输出 手动控制DO输出电磁阀、指示灯、相机触发 调试相机触发IO、气缸动作信号捕获 锁存编码器位置外部光电触发瞬间记录坐标 产品触发光电时抓取当前精准位置纠偏c#程序开发1.导入gst.dll 到winform项目中的bin/debug中2.打开mct2008 工具 - 控制器配置 - di -- 1 2 3轴的 正限位 负限位 驱动警告 都进行取反然后点击控制→写入控制器3.运动控制配置文件-写入控制器状态 保存文件GTS800.cfg 到项目Debug文件中4.软件的安装目录中gts.cs文件 引入当前项目根目录中5. 导入gts类库 using static gts.mc;轴调试页面初始化//初始化控制卡对象 private GoogolMotion _motion new GoogolMotion(); //初始化控制卡状态 short _rtn; //轴编号 short axis 1; #region 轴调试 // 初始化btn private void btnInitial_Click(object sender, EventArgs e) { _rtn _motion.InitCard(); for (short i 0; i 16; i) _motion.SetDo(i, 0); //初始化后所有的DO设置为低电平 timer1.Start(); //启动计时器 MessageBox.Show(初始化完成); }伺服上使能/// summary /// 伺服上使能 /// /summary /// param nameaxis轴号/param /// returns/returns public short ServoOn(short axis) { rtn gts.mc.GT_AxisOn(axis); return rtn; }伺服下使能/// summary /// 伺服下使能 /// /summary /// param nameaxis/param /// returns/returns public short ServoOff(short axis) { rtn gts.mc.GT_AxisOff(axis); return rtn; }清除状态// 清除状态btn private void btnClearSts_Click(object sender, EventArgs e) { _motion.ClearSts(axis); // }点位运动// 点位运动btn private void btnMoveTo_Click(object sender, EventArgs e) { if (textPosition.Text.Length 0) { MessageBox.Show(位置不能为空); return; } if (!int.TryParse(textPosition.Text, out int position)) { MessageBox.Show(数据类型错误); return; } _motion.MoveTo(axis, position, 5); //启动点位运动 }停止运动// 停止运动btn private void btnStopMove_Click(object sender, EventArgs e) { _motion.StopMove(axis); }位置清零// 位置清零 private void btnZeroPos_Click(object sender, EventArgs e) { _motion.ZeroPos(axis); }jog - jog // Jog- btn MouseDown private void btnJogNeg_MouseDown(object sender, MouseEventArgs e) { if (textVel.Text.Length 0) return; if (!double.TryParse(textVel.Text, out double vel)) return; _motion.JogNegative(axis, vel);//负向运动 } // Jog- Jog btnMouseUp private void btnJogStop_MouseUp(object sender, MouseEventArgs e) { _motion.StopMove(axis); } // Jog btn MouseDown private void btnJogPosi_MouseDown(object sender, MouseEventArgs e) { if (textVel.Text.Length 0) return; if (!double.TryParse(textVel.Text, out double vel)) return; _motion.JogPositive(axis, vel);//正向运动 }位置清零// 位置清零 private void btnZeroPos_Click(object sender, EventArgs e) { _motion.ZeroPos(axis); }回原// 回原btn private void btnHome_Click(object sender, EventArgs e) { _motion.GoHome(axis); }计时器绑定方法#region 计时器刷新轴状态和运动信息 private void timer1_Tick(object sender, EventArgs e) { // 获取轴状态 var rtn gts.mc.GT_GetSts(axis, out int pSts, 1, out uint pClock); this.Invoke(new Action(() { /* 0x200 转二进制 1000000000 仅第10位是1其他位全是0 按位与运算 pSts 0x200 1. 如果pSts第10位1伺服未使能运算结果≠0 → 标签变红​ 2. 如果pSts第10位0伺服正常使能运算结果0 → 标签变绿 */ // 更新伺服使能状态 lblServoSts.BackColor (pSts 0x200) ! 0 ? Color.Red : Color.Green; // 伺服报警 lblSvAlarm.BackColor (pSts 0x2) ! 0 ? Color.Red : Color.Green; // 正限位触发 lblPositive.BackColor (pSts 0x20) ! 0 ? Color.Red : Color.Green; // 负限位触发 lblNegative.BackColor (pSts 0x40) ! 0 ? Color.Red : Color.Green; // 运动出错 lblMotionError.BackColor (pSts 0x10) ! 0 ? Color.Red : Color.Green; // 运动中 lblMoitonRunning.BackColor (pSts 0x400) ! 0 ? Color.Red : Color.Green; // 平滑停止 lblSmoothStop.BackColor (pSts 0x80) ! 0 ? Color.Red : Color.Green; // 急停 lblEStop.BackColor (pSts 0x100) ! 0 ? Color.Red : Color.Green; textEncPos.Text _motion.GetEncPos(axis).ToString(); //读取实际位置 textPrfPos.Text _motion.GetPrfPos(axis).ToString(); //读取规划位置 textEncVel.Text _motion.GetEncVel(axis).ToString(); //读取实际速度 textPrfVel.Text _motion.GetPrfVel(axis).ToString(); //读取规划速度 RefreshIOSts(); })); }IO调试页面初始化label控件的文本和图片显示窗口加载事件 private void FrmMain_Load(object sender, EventArgs e) { InitialIOControl(); } // 初始化label控件的文本和图片显示 private void InitialIOControl() { // 遍历DI Groupbox中所有的label控件 foreach (Label lbl in grbDI.Controls) { lbl.Image Properties.Resources.Gray32;//所有图片初始化为灰色 lbl.Text $DI{lbl.Tag}; //设置显示的名称 } // 遍历DO Groupbox中所有的label控件 foreach (Label lbl in grbDO.Controls) { lbl.Image Properties.Resources.Gray32;//所有图片初始化为灰色 lbl.Text $DO{lbl.Tag}; //设置显示的名称 } // 遍历DebugDo Groupbox中所有的label控件 foreach (Label lbl in grbDebugDo.Controls) { lbl.Image Properties.Resources.Switch_Off;//所有图片初始化为灰色 lbl.Text $DO{lbl.Tag}; //设置显示的名称 lbl.Click LblDO_Click; } }设置Debugdo的click事件// 设置Debugdo的click事件 private void LblDO_Click(object sender, EventArgs e) { var lblDo sender as Label; // 获取当前控件 var doIndex Convert.ToInt16(lblDo.Tag); //通过控件的tag属性判断当前DO的索引 var currDoValue _motion.GetDo(doIndex); //读取当前索引的通用输出信号 /* 数字信号只有两种状态用电位高低区分 - 高电平端子电压接近供电电压常见DC24V系统 约24V逻辑值记为 1​ - 低电平端子电压接近0VGND地线电位逻辑值记为 0 DO数字输出板卡控制外部元件 - DO置1 → 输出24V高电平点亮指示灯 - DO置0 → 输出低电平0V关闭指示灯 */ if (currDoValue 0) _motion.SetDo(doIndex, 1); //设置高电平 点亮指示灯 else _motion.SetDo(doIndex, 0); //设置第电平 关闭指示灯 }刷新控件// 刷新控件显示 private void RefreshIOSts() { try { // 遍历DI Groupbox中所有的label控件 foreach (Label lbl in grbDI.Controls) { var di _motion.GetDI(Convert.ToInt16(lbl.Tag)); lbl.Image di 0 ? Properties.Resources.Gray32 : Properties.Resources.Green32;//所有图片初始化为灰色 } // 遍历DI Groupbox中所有的label控件 foreach (Label lbl in grbDO.Controls) { var doValue _motion.GetDo(Convert.ToInt16(lbl.Tag)); lbl.Image doValue 0 ? Properties.Resources.Gray32 : Properties.Resources.Green32; } // 遍历DI Groupbox中所有的label控件 foreach (Label lbl in grbDebugDo.Controls) { var doValue _motion.GetDo(Convert.ToInt16(lbl.Tag)); lbl.Image doValue 0 ? Properties.Resources.Switch_Off : Properties.Resources.Switch_On; } } catch (Exception) { } }插补运动页面建立坐标系// 建立坐标系 包含 x y 轴 坐标系 为后续做插补提供运动关系 private void btnCreateCoord_Click(object sender, EventArgs e) { var rtn _motion.CreateXYCoord(x, y); // 建立坐标系 if (rtn 0) MessageBox.Show(坐标系建立完成); }直线插补private void btnLnXY_Click(object sender, EventArgs e) { var xPosition int.Parse(textXPos.Text); var yPosition int.Parse(textYPos.Text); _motion.LnXYMotion(xPosition, yPosition, 5); }绘制矩形private void btnDrawRect_Click(object sender, EventArgs e) { var x1 int.Parse(textX1.Text); var y1 int.Parse(textY1.Text); var x2 int.Parse(textX2.Text); var y2 int.Parse(textY2.Text); var x3 int.Parse(textX3.Text); var y3 int.Parse(textY3.Text); var x4 int.Parse(textX4.Text); var y4 int.Parse(textY4.Text); var x5 int.Parse(textX5.Text); var y5 int.Parse(textY5.Text); gts.mc.GT_CrdClear(1, 0); //清除缓存区数据 gts.mc.GT_LnXY(1, x1, y1, 5, 0.5, 0, 0); //插入第一段运动 gts.mc.GT_LnXY(1, x2, y2, 5, 0.5, 0, 0); //插入第一段 gts.mc.GT_LnXY(1, x3, y3, 5, 0.5, 0, 0); //插入第一段 gts.mc.GT_LnXY(1, x4, y4, 5, 0.5, 0, 0); //插入第一段 gts.mc.GT_LnXY(1, x5, y5, 5, 0.5, 0, 0); //插入第一段 gts.mc.GT_CrdStart(1, 0);//启动 }封装运动控制相关功能类 -GoogolMotionusing System; using System.Collections.Generic; using System.Data; using System.Drawing.Printing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace GoogolTech.App { public class GoogolMotion { short rtn; //指令返回值 uint pClock;//控制卡内部计时器 /// summary /// 初始化控制卡 /// /summary /// returns/returns public short InitCard() { rtn gts.mc.GT_Open(0, 1); //打开控制卡 rtn gts.mc.GT_Reset(); // 复位控制卡 rtn gts.mc.GT_LoadConfig(GTS800.cfg);//加载配置文件 rtn gts.mc.GT_ClrSts(1, 4); //清除1-4轴报警状态 return rtn; } /// summary /// 清除当前轴状态 /// /summary /// param nameaxis/param /// returns/returns public short ClearSts(short axis) { return gts.mc.GT_ClrSts(axis, 1); } /// summary /// 伺服上使能 /// /summary /// param nameaxis轴号/param /// returns/returns public short ServoOn(short axis) { rtn gts.mc.GT_AxisOn(axis); return rtn; } /// summary /// 伺服下使能 /// /summary /// param nameaxis/param /// returns/returns public short ServoOff(short axis) { rtn gts.mc.GT_AxisOff(axis); return rtn; } /// summary /// 伺服使能状态 /// /summary /// param nameaxis轴号/param /// returns/returns public bool GetServoEnable(short axis) { // 读取轴状态轴状态通过pSts变量返回该变量是一个32位的二进制数值 rtn gts.mc.GT_GetSts(axis, out int pSts, 1, out pClock); // 二进制值 pSts 0000 0010 0000 0000 16进制 0x200 10进制512 // pSts 右移九位 0000 0000 0000 0001 // 按位与运算 // 0001 0011 0001 var i pSts 9; // 右移运算 //if (i 1) // return true; //else // return false; if ((pSts 0x200) ! 0) return true; else return false; } /// summary /// 伺服报警 /// /summary /// param nameaxis/param /// returns/returns public bool GetSvAlarm(short axis) { // 读取轴状态轴状态通过pSts变量返回该变量是一个32位的二进制数值 rtn gts.mc.GT_GetSts(axis, out int pSts, 1, out pClock); return (pSts 0x2) ! 0; // !0 返回true 即伺服报警 } /// summary /// 跟随误差越限 /// /summary /// param nameaxis/param /// returns/returns public bool GetSvFollowErrorSts(short axis) { // 读取轴状态轴状态通过pSts变量返回该变量是一个32位的二进制数值 rtn gts.mc.GT_GetSts(axis, out int pSts, 1, out pClock); return (pSts 0x10) ! 0; // !0 返回true } /// summary /// 正限位报警 /// /summary /// param nameaxis/param /// returns/returns public bool GetPositiveLimitSts(short axis) { // 读取轴状态轴状态通过pSts变量返回该变量是一个32位的二进制数值 rtn gts.mc.GT_GetSts(axis, out int pSts, 1, out pClock); return (pSts 0x20) ! 0; // !0 返回true } /// summary /// 负限位报警 /// /summary /// param nameaxis/param /// returns/returns public bool GetNegativeLimitSts(short axis) { // 读取轴状态轴状态通过pSts变量返回该变量是一个32位的二进制数值 rtn gts.mc.GT_GetSts(axis, out int pSts, 1, out pClock); return (pSts 0x40) ! 0; // !0 返回true } /// summary /// 平滑停止状态 /// /summary /// param nameaxis/param /// returns/returns public bool GetSmoothStopSts(short axis) { // 读取轴状态轴状态通过pSts变量返回该变量是一个32位的二进制数值 rtn gts.mc.GT_GetSts(axis, out int pSts, 1, out pClock); return (pSts 0x80) ! 0; // !0 返回true } /// summary /// 急停 /// /summary /// param nameaxis/param /// returns/returns public bool GetEStopSts(short axis) { // 读取轴状态轴状态通过pSts变量返回该变量是一个32位的二进制数值 rtn gts.mc.GT_GetSts(axis, out int pSts, 1, out pClock); return (pSts 0x100) ! 0; // !0 返回true } /// summary /// 运动中 /// /summary /// param nameaxis/param /// returns/returns public bool GetMotionRunningSts(short axis) { // 读取轴状态轴状态通过pSts变量返回该变量是一个32位的二进制数值 rtn gts.mc.GT_GetSts(axis, out int pSts, 1, out pClock); return (pSts 0x400) ! 0; // !0 返回true } /// summary /// 点位运动 /// /summary /// param nameaxis轴号/param /// param nameposition运动位置/param /// param namevel速度/param /// param nameacc加速度/param /// param namedec减速度/param /// param namesmooth平滑时间[0-50]/param /// returns/returns public int MoveTo( short axis, int position, double vel, double acc 0.25, double dec 0.125, short smooth 10) { rtn gts.mc.GT_PrfTrap(axis);//设置点位运动模式 // 获取运动参数out 关键字返回 rtn gts.mc.GT_GetTrapPrm(axis, out gts.mc.TTrapPrm pPrm); pPrm.acc acc; // 设置加速度 pPrm.dec dec; // 设置减速度 pPrm.smoothTime smooth; // 设置平滑时间 rtn gts.mc.GT_SetTrapPrm(axis, ref pPrm); //设置运动参数 rtn gts.mc.GT_SetVel(axis, vel);//设置速度 rtn gts.mc.GT_SetPos(axis, position);//设置运动位置 rtn gts.mc.GT_Update(1(axis-1)); //更新运动 return rtn; } /// summary /// 停止运动 /// /summary /// param nameaxis/param /// returns/returns public int StopMove(short axis) { return gts.mc.GT_Stop(1 (axis - 1), 0); } /// summary /// Jog /// /summary /// param nameaxis轴号/param /// param namevel速度/param /// param nameacc加速度/param /// param namedec减速度/param /// param namesmooth平滑时间/param /// returns/returns public int JogPositive( short axis, double vel, double acc 0.25, double dec 0.15, double smooth 0.5) { rtn gts.mc.GT_ClrSts(axis, 1);//清除当前轴状态 rtn gts.mc.GT_PrfJog(axis);//Jog运动模式 rtn gts.mc.GT_GetJogPrm(axis, out gts.mc.TJogPrm pPrm); //获取jog运动参数 pPrm.accacc; pPrm.decdec; pPrm.smooth smooth; rtn gts.mc.GT_SetJogPrm(axis, ref pPrm);//设置运动参数 rtn gts.mc.GT_SetVel(axis, vel);//设置速度 rtn gts.mc.GT_Update(1 (axis - 1)); //更新运动 return rtn; } /// summary /// Jog- /// /summary /// param nameaxis轴号/param /// param namevel速度/param /// param nameacc加速度/param /// param namedec减速度/param /// param namesmooth平滑时间/param /// returns/returns public int JogNegative( short axis, double vel, double acc 0.25, double dec 0.15, double smooth 0.5) { rtn gts.mc.GT_ClrSts(axis, 1);//清除当前轴状态 rtn gts.mc.GT_PrfJog(axis);//Jog运动模式 rtn gts.mc.GT_GetJogPrm(axis, out gts.mc.TJogPrm pPrm); //获取jog运动参数 pPrm.acc acc; pPrm.dec dec; pPrm.smooth smooth; rtn gts.mc.GT_SetJogPrm(axis, ref pPrm);//设置运动参数 rtn gts.mc.GT_SetVel(axis, -vel);//设置速度 /* 1 (AXIS - 1) 二进制左移运算符。左操作数的值向左移动右操作数指定的位数 https://www.runoob.com/csharp/csharp-operators.html 1对应 二进制 0001 (AXIS-1)轴的索引 结果 为0 1的二进制 0001 左移 (AXIS - 1)位 得到的结果为0001 代表是1轴 如果是2轴结果为0010 如果是3轴结果为0100 哪一位是1就表示哪个轴运动 */ rtn gts.mc.GT_Update(1 (axis - 1)); //更新运动 return rtn; } /// summary /// 读取实际位置(编码器位置) /// /summary /// param nameaxis实际位置/param /// returns/returns public double GetEncPos(short axis) { rtn gts.mc.GT_GetEncPos(axis, out double pValue, 1, out pClock); return pValue; } /// summary /// 读取规划位置 /// /summary /// param nameaxis/param /// returns规划位置/returns public double GetPrfPos(short axis) { rtn gts.mc.GT_GetPrfPos(axis, out double pValue, 1, out pClock); return pValue; } /// summary /// 读取实际速度(编码器速度) /// /summary /// param nameaxis/param /// returns实际速度/returns public double GetEncVel(short axis) { rtn gts.mc.GT_GetEncVel(axis, out double pValue, 1, out pClock); return pValue; } /// summary /// 读取规划速度 /// /summary /// param nameaxis/param /// returns规划速度/returns public double GetPrfVel(short axis) { rtn gts.mc.GT_GetPrfVel(axis, out double pValue, 1, out pClock); return pValue; } /// summary /// 位置清零 /// /summary /// param nameaxis/param /// returns/returns public int ZeroPos(short axis) { return gts.mc.GT_ZeroPos(axis, 1); } /// summary /// 智能回原 /// /summary /// param nameaxis轴号/param /// param namevelHigh高速/param /// param namevelLow低速/param /// param nameacc加速度/param /// param namedec减速度/param /// param namesmooth平滑时间/param /// returns/returns public int GoHome( short axis, double velHigh 5, double velLow 1, double acc0.25, double dec0.15, short smooth10) { rtn gts.mc.GT_ClrSts(axis, 1); //清除报警 rtn gts.mc.GT_ZeroPos(axis, 1);//位置清零 rtn gts.mc.GT_GetHomePrm(axis, out gts.mc.THomePrm homePrm);//获取回原参数 homePrm.mode gts.mc.HOME_MODE_LIMIT_HOME; //限位home回原 homePrm.moveDir 1;// -1 负极限 1正极限 homePrm.indexDir 1; homePrm.edge 1;//上升沿 homePrm.velHigh velHigh; homePrm.velLow velLow; homePrm.acc acc; homePrm.dec dec; homePrm.smoothTime smooth;// homePrm.searchHomeDistance 0;//0表示最大长度 homePrm.homeOffset 0; gts.mc.THomeStatus homeStatus; //回原状态 // 回原线程 var homeThread new Thread(() { rtn gts.mc.GT_GoHome(axis, ref homePrm);//启动回原 // 查询回原状态 do { rtn gts.mc.GT_GetHomeStatus(axis, out homeStatus); Thread.Sleep(50); } while (homeStatus.run 1); // 1正在运动0 回原完成 Thread.Sleep(100); rtn gts.mc.GT_ZeroPos(axis, 1); }) { IsBackground true }; homeThread.Start();//启动回原线程 return rtn; } private int GetIOIndexValue(int index, int value) { if ((value (1 index)) ! 0) return 1; // 返回1 为高电平 else return 0; // 返回0 为低电平 } /// summary /// 读取当前索引的通用输入信号 /// /summary /// param nameindexDI索引/param /// returns1 高电平 0 低电平/returns public int GetDI(int index) { // 读取通用输入信号 MC_GPI是通用输入 out 返回的参数为16位二进制数 rtn gts.mc.GT_GetDi(gts.mc.MC_GPI, out int pValue); return GetIOIndexValue(index, pValue); } /// summary /// 读取当前轴原点信号 /// /summary /// param nameindexDI索引/param /// returns1 高电平 0 低电平/returns public int GetHomeDI(int index) { // 读取通用输入信号 MC_GPI是通用输入 out 返回的参数为8位二进制数 rtn gts.mc.GT_GetDi(gts.mc.MC_HOME, out int pValue); return GetIOIndexValue(index, pValue); } /// summary /// 读取当前索引的通用输出信号 /// /summary /// param nameindexDO索引/param /// returns1 高电平 0 低电平/returns public int GetDo(int index) { // 读取通用输出信号 MC_GPO是通用输出 out 返回的参数为16位二进制数 rtn gts.mc.GT_GetDo(gts.mc.MC_GPO, out int pValue); return GetIOIndexValue(index, pValue); } /// summary /// 设置DO输出 /// /summary /// param nameindexDO索引/param /// param namevalue1 高电平 0 低电平/param public void SetDo(short index, short value) { gts.mc.GT_SetDoBit(gts.mc.MC_GPO, Convert.ToInt16(index 1), value); } /// summary /// 建立二维插补坐标系 /// /summary /// param namex轴1/param /// param namey轴2/param /// returns/returns public int CreateXYCoord(short x, short y) { gts.mc.TCrdPrm crdPrm new gts.mc.TCrdPrm();//插补坐标系参数 crdPrm.dimension 2; // 二维坐标系 crdPrm.profile1 x; // x轴 crdPrm.profile2 y; // y轴 crdPrm.synVelMax 100;//最大速度 crdPrm.synAccMax 0.5;//最大加速度 crdPrm.evenTime 50;//平滑时间 crdPrm.setOriginFlag 1;//设置原点 crdPrm.originPos1 0;//x轴原点 crdPrm.originPos2 0; crdPrm.originPos3 0; rtn gts.mc.GT_SetCrdPrm(1, ref crdPrm);//设置插补坐标系 rtn gts.mc.GT_SetCrdStopDec(1, 5, 5);//设置急停减速度和平滑减速度 return rtn; } /// summary /// 建立三维插补坐标系 /// /summary /// param namex轴1/param /// param namey轴2/param /// returns/returns public int CreateXYZCoord(short x, short y,short z) { gts.mc.TCrdPrm crdPrm new gts.mc.TCrdPrm();//插补坐标系参数 crdPrm.dimension 2; // 二维坐标系 crdPrm.profile1 x; // x轴 crdPrm.profile2 y; // y轴 crdPrm.profile3 z; // z轴 crdPrm.synVelMax 100; //最大速度 crdPrm.synAccMax 0.5;//最大加速度 crdPrm.evenTime 50;//插补时间 crdPrm.setOriginFlag 1;//设置原点 crdPrm.originPos1 0;//原点坐标 crdPrm.originPos2 0; crdPrm.originPos3 0; rtn gts.mc.GT_SetCrdPrm(1, ref crdPrm);//设置插补坐标系 rtn gts.mc.GT_SetCrdStopDec(1, 5, 5);//设置急停减速度和平滑减速度 return rtn; } /// summary /// 直线插补 /// /summary /// param namexx坐标/param /// param nameyy坐标/param /// param namevel速度/param /// param nameacc加速度/param /// param namevelEnd终点速度/param /// param namefifo缓存区/param /// returns/returns public int LnXYMotion( int x, // x坐标 int y, // y坐标 double vel, //速度 double acc0.25, //加速度 double velEnd0, //终点速度 short fifo0) //缓存区 { rtn gts.mc.GT_CrdClear(1, fifo); //清除缓存区数据 rtn gts.mc.GT_LnXY(1, x,y, vel, acc,velEnd, fifo); //插入数据 rtn gts.mc.GT_CrdStart(1, 0);//启动插补 return rtn; } /// summary /// 查询插补状态 /// /summary /// param namepRun运动状态/param /// param namepSeg返回插补的段数/param /// param namefifo缓存区/param /// returns/returns public int GetCrdSts(out short pRun, out int pSeg, short fifo0) { rtn gts.mc.GT_CrdStatus(1, out pRun, out pSeg, fifo); return rtn; ; } } }扩展如查看对应API使用方式 参考官方文档 编程手册GTS运动控制器-基本功能_R1.5.pdf