勇哥注: 设备的动作可以是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
版权声明:本文为博主原创文章,转载请附上博文链接!

