勇哥注: 设备的动作可以是plc,或者是运动控制来完成。 后者是一台工业电脑配上运动板卡来完成。 在有些工厂里,可能由客户喜好更喜欢用运动控制(比如富士康的苹果客户, 因为PC机和工厂的生产系统进行通讯要更方便一些,并且对视觉的配合要更好些)。 基于IPC和windows的运动控制,可靠性是没有plc好的。 因为plc相当于是一个专用小系统,并且是实时扫描的。可靠性是相当高。 但是PC有自己的优势,比如复杂和精密的视觉处理的设备都是离不开运动控制的, 因为运动卡能提供更复杂的运动能力和精度保证,plc只能做一些简单的ptp运动。
系列贴子导航:
C#编写运动控制:自定义回原(五) 验证自定义回原精度,并提出解决方案
C#编写运动控制:自定义回原(三) 回原时为什么会出现运动指令无效跳过的现象
C#编写运动控制:自定义回原(二) 限位做为回原、限位反找回原
前面介绍的回原还是有缺陷的,这节来完善一下。
主要缺陷包括下面这些:
回原类型MODE1_Abs,如果在正方向回原会卡住
找限们并且反找原点模式下,希望可以指定是停在原点左边还是右边,并且可以指定冲出原点的距离
对于问题1,主要是因为waitHomeDone这种类型的函数没有超时处理。
当等待回原完成时,如果超时需要返回bool值,向上级调用者报告错误。
对于问题2,主要是在homeMove中增加了homeWaitPos分支。
引入了几个waitHomeDone函数。
只有回原模式1和4才支持回原停靠的位置是左边还是右边。
public int outHomeDist { get; set; } = 200;
/// <summary>
/// 回原结束等待,会判断回原位置是左还是右,用于找限位返找原点模式
/// </summary>
/// <param name="axisid"></param>
/// <returns></returns>
public bool waitHomeDone2(ushort axisid)
{
Stopwatch sw1 = new Stopwatch(); sw1.Start();
bool[] oriStatus = new bool[] { false,false,false };
oriStatus[0] = AxisORG==1;
while (true)
{
if (homeWaitPos == 1)
{
if(!oriStatus[0] && oriStatus[1] && !oriStatus[2])
{
StopMove(axisid);
while(AxisStatus!=0)
{
Delay(1);
}
waitPTP(axisid, outHomeDist, 0);
break;
}
}
if (sw1.ElapsedMilliseconds > 2000)
return false;
if (homeWaitPos == 1)
{
if (oriStatus[0])
return false;
if (AxisORG == 1)
{
oriStatus[1] = true;
}
else
{
if (oriStatus[0] == false && oriStatus[1])
{
oriStatus[2] = false;
}
}
}
else if (homeWaitPos == 2)
{
if (AxisORG == 1)
{
StopMove(axisid);
break;
}
}
Delay(1);
}
return true;
}
/// <summary>
/// 回原结束等待,会判断回原位置是左还是右,用于第一种回原点模式
/// </summary>
/// <param name="axisid"></param>
/// <returns></returns>
public bool waitHomeDone3(ushort axisid)
{
Stopwatch sw1 = new Stopwatch(); sw1.Start();
bool[] oriStatus = new bool[] { false, false, false };
oriStatus[0] = AxisORG == 1;
while (true)
{
if (homeWaitPos == 2)
{
if (!oriStatus[0] && oriStatus[1] && !oriStatus[2])
{
StopMove(axisid);
while (AxisStatus != 0)
{
Delay(1);
}
waitPTP(axisid, -outHomeDist, 0);
break;
}
}
if (sw1.ElapsedMilliseconds > 2000)
return false;
if (homeWaitPos == 2)
{
if (oriStatus[0])
return false;
if (AxisORG == 1)
{
oriStatus[1] = true;
}
else
{
if (oriStatus[0] == false && oriStatus[1])
{
oriStatus[2] = false;
}
}
}
else if (homeWaitPos == 1)
{
if (AxisORG == 1)
{
StopMove(axisid);
break;
}
}
Delay(1);
}
return true;
}详细改进的代码演示见视频讲解:
本文源码资料下载:
扫码收费5元,勇哥用以支付本站服务器费用。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路



















