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


少有人走的路



















