运动控制卡
什么是运动控制卡是一种基于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

相关新闻

免费开源智能股票分析工具:3分钟打造你的AI投资助手

免费开源智能股票分析工具:3分钟打造你的AI投资助手

免费开源智能股票分析工具:3分钟打造你的AI投资助手 还在为复杂的股票数据头痛吗?每天面对海量行情信息却无从下手?今天我要分享一个完全免费、开源、智能的股票分析工具——daily_stock_analysis,它能帮你把复杂的市场数据变成清…

2026/7/24 22:50:06 阅读更多 →
微信单向好友检测:5分钟快速清理无效社交关系,让你的朋友圈更真实![特殊字符]

微信单向好友检测:5分钟快速清理无效社交关系,让你的朋友圈更真实![特殊字符]

微信单向好友检测:5分钟快速清理无效社交关系,让你的朋友圈更真实!🚀 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://…

2026/7/24 22:50:06 阅读更多 →
终极指南:如何轻松访问全球最大同人创作平台AO3

终极指南:如何轻松访问全球最大同人创作平台AO3

终极指南:如何轻松访问全球最大同人创作平台AO3 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 还在为无法访问Archive of Our Own(AO3)而烦恼吗?😊 作为全球…

2026/7/24 22:49:06 阅读更多 →

最新新闻

C语言程序设计第10天/数组

C语言程序设计第10天/数组

数组概念数组是一组相同类型元素的集合;数组可以存放1个或多个数据,但是数据元素个数不能为0;数组中存放的多个数据,类型必须相同;数组分为一维数组和多维数组,多维数组中常见的是二维数组。一维数组的创建…

2026/7/24 22:56:07 阅读更多 →
this关键字

this关键字

文章目录有个规定:有个规定: 在一个类中,声明了n个构造器,则最多有n-1个构造器,可以有“this(形参列表)”的结构, this(形参列表),必须放在当前构造器的第一行 class Person {private double …

2026/7/24 22:56:07 阅读更多 →
如何快速掌握原神抽卡记录导出工具:完整使用指南与数据分析技巧

如何快速掌握原神抽卡记录导出工具:完整使用指南与数据分析技巧

如何快速掌握原神抽卡记录导出工具:完整使用指南与数据分析技巧 【免费下载链接】genshin-wish-export Easily export the Genshin Impact wish record. 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin-wish-export 原神抽卡记录导出工具&#x…

2026/7/24 22:56:07 阅读更多 →
使用vs code开发microPython,消除库文件报错

使用vs code开发microPython,消除库文件报错

使用vs code 写microPython代码的时候,总是遇到库文件报错,也就是类似machine之类的库下面会有波浪线,看起来很是别扭。 前几天在翻看树莓派pico的文档,发现里面提供了很好的方法。 安装vs code环境 $ sudo apt update $ sudo apt…

2026/7/24 22:56:07 阅读更多 →
Lytro相关教程

Lytro相关教程

Lytro相关教程Lytro 相关工具安装Lytro Power Tools的安装过程Lytro DeskTop的安装过程Lytro Power Tools的国外论坛其他相关博客文件常用命令Lytro 相关工具安装 Lytro Power Tools Lytro DeskTop Lytro Power Tools的安装过程 工具所需要的环境,建议使用annocan…

2026/7/24 22:56:07 阅读更多 →
解锁《鸣潮》极限体验:WaveTools工具箱的四大核心功能详解

解锁《鸣潮》极限体验:WaveTools工具箱的四大核心功能详解

解锁《鸣潮》极限体验:WaveTools工具箱的四大核心功能详解 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》玩家设计的开源工具箱,能够帮助玩家突破游戏…

2026/7/24 22:55:07 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻