回零信号可采用限位传感器、home原点传感器、编码器或光栅尺Z(C)相信号。
限位信号采用普通IO触发方式,Home及Index信号使用FPGA捕获方式。
通过限位、Home、Index三种信号组合共计7种回零方式:
限位回零
需要设置回零方向(触发正限位还是负限位)、反向脱离步长(轴第一次触发限位后反向离开距离),轴在触发正(负)限位后先反向移动反向脱离步长的距离再以低速回到限位。
Home回零
需要设置回零方向(从轴的哪边寻找Home信号),轴在捕获到Home信号时会立即捕获当前编码器位置并停止,重新将捕获位置设为目标位置并低速移动到目标位置(因为速度较高寻找Home时,捕获到Home位置后可能电机并不能立即停下,所以会有这样一个过程,即再以低速返回捕获位置,若回零设置速度低,该过程不明显)。缺点:回零初始方向不太好设定,轴停止在Home信号左边和右边不好判断。
Index回零:在电机单圈内寻找编码器Index信号,轴在捕获到Index信号时会立即捕获当前编码器位置并停止,重新将捕获位置设为目标位置并低速移动到目标位置(因为速度较高寻找Index时,捕获到Index位置后可能电机并不能立即停下,所以会有这样一个过程,即再以低速返回捕获位置,若回零设置速度低,该过程不明显)。
限位+Home回零: 轴先寻找限位再寻找Home信号。(最常见方式。)
限位+Index回零: 轴先寻找限位再寻找Index信号。(直线电机常见回零方式。)
Home+Index回零:轴先寻找Home再寻找Index信号。
限位+Home+Index回零:轴先寻找限位再寻找Home再寻找Index信号。
/*举例:线程内单轴回零*/
private void btn_homeStart_Click(object sender, EventArgs e)
{
Thread threadHome; //回零线程
short cardNo = 0; //卡号为0
short axis = 1; //回零轴
mc.THomePrm tHomePrm = new mc.THomePrm(); //回零参数
threadHome = new Thread(() =>
{
short sRtn = 0;
mc.THomeStatus pHomeStatus;//使用home回零或home+index回零,若轴停止在home点则需要先移开home点在开启回零。由实际情况确认。
sRtn = gts.mc.GT_ClrSts(cardNo, axis, axisNum);//回零前先清除状态
sRtn = gts.mc.GT_ZeroPos(cardNo, axis, 1);//清除规划和实际位置
sRtn = gts.mc.GT_GetHomePrm(cardNo, axis, out tHomePrm);//读取回零参数
tHomePrm.mode = 11; //限位加home回零方式 宏定义11
tHomePrm.searchHomeDistance = 0; //搜索Home距离,0表示最大距离搜索
tHomePrm.searchIndexDistance = 0; //搜索index距离,0表示最大距离搜索
tHomePrm.moveDir = 1; //回零方向 1为正 -1为负
tHomePrm.indexDir = 1; //搜索index方向 1为正 -1为负
tHomePrm.velHigh = 20; //寻找限位速度
tHomePrm.velLow = 5; //寻找home、index速度
tHomePrm.smoothTime = 10; //平滑时间,运动加减速平滑
tHomePrm.acc = 1; //加速度
tHomePrm.dec = 1; //减速度
tHomePrm.escapeStep = 10000; //限位回零后方式时第一次找到限位反向移动距离
tHomePrm.homeOffset = 0; //原点偏移 = 0
sRtn = gts.mc.GT_GoHome(cardNo, axis, ref tHomePrm);//启动SmartHome回原点
do
{
sRtn = mc.GT_GetHomeStatus(cardNo, axis, out pHomeStatus);//获取回原点状态
}
while (pHomeStatus.run == 1 & pHomeStatus.stage == 100); // 等待搜索原点停止run和stage来判断是否回零完成。
Thread.Sleep(1000); //等待电机完全停止,时间由电机调试效果确定也可采用到位判断
sRtn = gts.mc.GT_ZeroPos(cardNo, axis, 1); //回零完成手动清零设为原点
}) { IsBackground = true };
threadHome.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
mc.THomeStatus tHomeStatus = new mc.THomeStatus();
sRtn = mc.GT_GetHomeStatus(cardNo, axis, out tHomeStatus);
homeRunning = tHomeStatus.run;//回零状态:0已停止运动 1正在运动
homeStage = tHomeStatus.stage;//0-100 对应宏定义,请查阅固高手册可以查询回零过程,stage = 100表示回零成功。
homeError = tHomeStatus.error;//回零错误代码请查阅固高手册可以查询回零错误,0表示回零过程无错误
}