工控电气调试人员或软件工程师可能会有这样的疑惑,明明读取控制器轴运动状态已经停止运动了,但实际上轴还没有停下来,这是这是怎么回事?要如何判断轴是否已经运动到位?
在说判断轴运动到位判断方法前,先分析一下上述的问题。之所以提前读到轴运动停止是因为运动控制器中的轴运动状态是规划状态,也就是说,控制器规划发完,运动状态就会停止,但实际上,电机运动或多或少都会有一定滞后,所以会造成提前读到轴运动停止状态的现象。那么,要怎么处理呢?通常有几种方式:
1. 规划停止加延时
既然电机有滞后,那么我们可以在读到规划运动停止后,加一个延时,确保电机已经停下来后再执行后续的轴运动。这种方法的优点是比较简单,只需要在软件代码中加个延时即可,缺点是延时多少不好把控,加多了多出来的空闲时间白白浪费,影响效率。
//启动运动
......
//等待到位
do
{
GTSControl.GetAxisSts(cardNum, out alrm, out limitP, out limitN, out enable, out run, out arrive);
} while (run[axis - 1]);
Thread.Sleep(delayTime);
ydLed_arrive.Invoke((System.Action)delegate
{
ydLed_arrive.Checked = false;
label_arriveSts.Text = "电机运动到位!";
label_arriveSts.BackColor = Color.Green;
});
2. 读取驱动器到到位IO信号
一般伺服驱动器都可以设置一个IO,当运动停止后输出一个运动到位信号给控制器。固高GTS运动控制器端子板轴端口的16引脚即是接收驱动器运动到位IO的引脚,只需要在伺服驱动器是指好IO,并把IO接到GTS端子板轴通道的16引脚。上位机可通过读取该IO的状态来判断轴运动到位状态。这种方法的优点是判断比较准确,但是接线,配置稍微麻烦。
3. 控制卡根据误差带和保持时间虚拟到位信号
固高GTS运动控制器有电机到位判断功能,其原理是先设置一个误差带和保持时间,控制器监控编码器的位置,当编码器进入到误差带后并在误差带内保持一个设定的时间就认为电机运动到位。此时轴状态字中的电机到位标志就会置起。这种方法的优点是省去接线的麻烦,准确度尚可,缺点是需要调出合适的误差带和保持时间,否则条件不满足,电机到位标志可能始终无法置起。
//启动运动
......
//等待运动到位
GTSControl.GetAxisSts(cardNum, out alrm, out limitP, out limitN, out enable, out run, out arrive);
GTSControl.GetDiSts(cardNum,gts.mc.MC_ARRIVE,1,out diSts,8);
if (arriveMode==0)
{
ydLed_arrive.Checked=!arrive[axis - 1];
if(arrive[axis - 1])
{
label_arriveSts.Text = "电机运动到位!";
label_arriveSts.BackColor = Color.Green;
}
}
else if(arriveMode == 1)
{
ydLed_arrive.Checked = diSts[axis - 1];
if (!diSts[axis - 1])
{
label_arriveSts.Text = "电机运动到位!";
label_arriveSts.BackColor = Color.Green;
}
}
需要Demo源码请在下方下载!

我也是有底线哒~
© 版权声明
THE END
暂无评论内容