勇哥注: 设备的动作可以是plc,或者是运动控制来完成。 后者是一台工业电脑配上运动板卡来完成。 在有些工厂里,可能由客户喜好更喜欢用运动控制(比如富士康的苹果客户, 因为PC机和工厂的生产系统进行通讯要更方便一些,并且对视觉的配合要更好些)。 基于IPC和windows的运动控制,可靠性是没有plc好的。 因为plc相当于是一个专用小系统,并且是实时扫描的。可靠性是相当高。 但是PC有自己的优势,比如复杂和精密的视觉处理的设备都是离不开运动控制的, 因为运动卡能提供更复杂的运动能力和精度保证,plc只能做一些简单的ptp运动。
系列贴子导航:
C#编写运动控制:自定义回原(五) 验证自定义回原精度,并提出解决方案
C#编写运动控制:自定义回原(三) 回原时为什么会出现运动指令无效跳过的现象
C#编写运动控制:自定义回原(二) 限位做为回原、限位反找回原
运动控制之自定义回原(二)
上篇见:《 C#编写运动控制:自定义回原(一)》
继续上篇的话题。
之前我们只是实现了MODE1_Abs。
还有三种模式都没有实现:
MODE2_NegLimitSignal
MODE2_PelLimitSignal
MODE3_LimitSignalAndORG
这三种模式意义如下图所示:
勇哥把界面变化了一下,这次多了指定回原方法 。
以及增加了“正回原点”,即考虑到两个方向回原点。
而上一节是没有实现“正回原点”的。
源代码:
public void home(HomeModeEnum type,ushort homeMode = 2, ushort homeSpeedMode = 0) { Home2(0, type,homeMode,homeSpeedMode); Dmc2210.d2210_set_position(0, 0); homecount = 0; } /* home_mode:回原点的方法, 1—正方向回原点 2—负方向回原点 vel_mode:选择回原点的速度方式, 0—低速回原点 1—高速回原点,遇原点信号,减速后停止 */ public bool Home2(ushort axisID, HomeModeEnum type,ushort homeMode=2,ushort homeSpeedMode=0) { ++homecount; if (homecount > maxHomeCount) return false; //回原时已经在原点上 if (AxisORG==1) { outmsg($"回原时已经在原点上,向前冲[{inOriMoveDist}]"); waitPTP(axisID, inOriMoveDist); return Home2(axisID, type, homeMode, homeSpeedMode); } //回原时已经在正限位 if (AxisPEL==1) { outmsg($"回原时已经在正限位,向负方向冲[{inPelMoveDist}]"); waitPTP(axisID, inPelMoveDist ); return Home2(axisID, type, homeMode, homeSpeedMode); } //回原时已经在负限位 if (AxisMEL==1) { outmsg($"回原时已经在负限位,向正方向冲[{inMelMoveDist}]"); waitPTP(axisID, inPelMoveDist); return Home2(axisID, type, homeMode, homeSpeedMode); } switch (type) { case HomeModeEnum.MODE1_Abs: outmsg($"开始MODE1_Abs回原运动"); //Dmc2210.d2210_home_move(axisID, homeMode, homeSpeedMode); homeMove(axisID, type, homeMode, homeSpeedMode); //WaitMotorDone(0, 10); outmsg($"MODE1_Abs回原完成"); break; case HomeModeEnum.MODE2_NegLimitSignal: outmsg($"开始负限位回原运动"); homeMove(axisID, type, homeMode, homeSpeedMode); outmsg($"负限位回原完成"); break; case HomeModeEnum.MODE2_PelLimitSignal: outmsg($"开始正限位回原运动"); homeMove(axisID, type, homeMode, homeSpeedMode); outmsg($"正限位回原完成"); break; case HomeModeEnum.MODE3_LimitSignalAndORG: outmsg($"开始限位反找回原运动"); homeMove(axisID, type, homeMode, homeSpeedMode); outmsg($"限位反找回原完成"); break; } return true; } /// <summary> /// 回原最大距离 /// </summary> private int homeMaxDistance { get; set; } = 10000; //homeMode = 2 负方向 //homeSpeedMode = 0 低速回原 private void homeMove(ushort axisID, HomeModeEnum type, ushort homeMode = 2, ushort homeSpeedMode = 0) { switch(type) { case HomeModeEnum.MODE1_Abs: PTP(axisID, homeMaxDistance* (homeMode==2?-1:1)); waitHomeDone(axisID); break; case HomeModeEnum.MODE2_NegLimitSignal: PTP(axisID, homeMaxDistance * (homeMode == 2 ? -1 : 1)); if (homeMode == 2) { waitNegHomeDone(axisID); } else if(homeMode==1) { waitPelHomeDone(axisID); PTP(axisID, homeMaxDistance * -1); waitNegHomeDone(axisID); } break; case HomeModeEnum.MODE2_PelLimitSignal: PTP(axisID, homeMaxDistance * (homeMode == 2 ? -1 : 1)); if (homeMode == 2) { waitNegHomeDone(axisID); PTP(axisID, homeMaxDistance); waitPelHomeDone(axisID); } else if (homeMode == 1) { waitPelHomeDone(axisID); } break; case HomeModeEnum.MODE3_LimitSignalAndORG: PTP(axisID, homeMaxDistance * (homeMode == 2 ? -1 : 1)); if(homeMode==2) { waitNegHomeDone(axisID); PTP(axisID, homeMaxDistance); waitHomeDone(axisID); } else if(homeMode==1) { waitPelHomeDone(axisID); PTP(axisID, homeMaxDistance*-1); waitHomeDone(axisID); } break; } }
代码的讲解见视频:
本文源码资料下载:
扫码收费5元,勇哥用以支付本站服务器费用。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

