|
|
using Rs.Controls;
|
|
|
using Rs.Framework;
|
|
|
using Rs.Motion.Base;
|
|
|
using Rs.MotionPlat.Commom;
|
|
|
using Rs.MotionPlat.Entitys;
|
|
|
using Rs.MotionPlat.Flow.NormalFlow;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Diagnostics;
|
|
|
using System.Linq;
|
|
|
using System.Net.Http;
|
|
|
using System.Text;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace Rs.MotionPlat.Flow
|
|
|
{
|
|
|
|
|
|
enum EHomeFlowStep
|
|
|
{
|
|
|
回原环境检测,
|
|
|
Z轴回原,
|
|
|
等待Z轴回原完成,
|
|
|
Z回起始位,
|
|
|
等待Z回起始位完成,
|
|
|
X轴回原,
|
|
|
等待X轴回原完成,
|
|
|
Y轴回原,
|
|
|
等待Y轴回原完成,
|
|
|
到起始位,
|
|
|
等待到起始位
|
|
|
}
|
|
|
|
|
|
public class HomeFlow
|
|
|
{
|
|
|
EHomeFlowStep step = EHomeFlowStep.回原环境检测;
|
|
|
ushort homeStep = 0;
|
|
|
private static HomeFlow instace;
|
|
|
private bool m_bCancle = false;
|
|
|
private bool m_bHomed = false;
|
|
|
private Stopwatch homeTime = new Stopwatch();
|
|
|
public static HomeFlow Instance
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
if (instace == null)
|
|
|
instace = new HomeFlow();
|
|
|
return instace;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void CancleHome()
|
|
|
{
|
|
|
m_bCancle = true;
|
|
|
}
|
|
|
|
|
|
private HomeFlow() { }
|
|
|
|
|
|
public void StartGoHome()
|
|
|
{
|
|
|
DevLog.EventTracker("INIT START", 0, "", "HOME");
|
|
|
step = EHomeFlowStep.回原环境检测;
|
|
|
homeStep = 0;
|
|
|
m_bHomed = false;
|
|
|
m_bCancle = false;
|
|
|
Task.Run(() =>
|
|
|
{
|
|
|
while (!m_bCancle && !m_bHomed)
|
|
|
{
|
|
|
if(GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
MessageQueue.Instance.Insert("Device home ok");
|
|
|
MachineManage.Instance.SetLocalMachineStatus(EMachineStatus.Homed);
|
|
|
m_bHomed = true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
switch (step)
|
|
|
{
|
|
|
|
|
|
|
|
|
//case EHomeFlowStep.Z回起始位:
|
|
|
// AxisControl.StockZ1.MovePos(GlobalVar.StockZ1OutStock, GlobalVar.WholeSpeed);
|
|
|
// AxisControl.StockZ2.MovePos(GlobalVar.StockZ2OutStock, GlobalVar.WholeSpeed);
|
|
|
// AxisControl.StockZ3.MovePos(GlobalVar.StockZ3OutStock, GlobalVar.WholeSpeed);
|
|
|
// step = EHomeFlowStep.等待Z回起始位完成;
|
|
|
// break;
|
|
|
//case EHomeFlowStep.等待Z回起始位完成:
|
|
|
// if (Ops.IsStop("LoadX", "LoadY1", "LoadY2", "TakeTrayX", "StockZ1", "StockZ2", "StockZ3"))
|
|
|
// {
|
|
|
// step = EHomeFlowStep.回原环境检测;
|
|
|
// }
|
|
|
// break;
|
|
|
case EHomeFlowStep.回原环境检测:
|
|
|
|
|
|
for (int i = 1; i < 5; i++)
|
|
|
{
|
|
|
Ops.Off($"吸料真空{i}破");
|
|
|
MessageQueue.Instance.Insert($"关闭吸料真空{i}破");
|
|
|
}
|
|
|
|
|
|
Ops.Off("料盘搬运气缸下");
|
|
|
Ops.On("料盘搬运气缸上");
|
|
|
MessageQueue.Instance.Insert($"料盘搬运气缸抬起");
|
|
|
for (int i = 1; i < 4; i++)
|
|
|
{
|
|
|
Ops.Off($"抽屉拉伸气缸{i}");
|
|
|
MessageQueue.Instance.Insert($"关闭抽屉拉伸气缸{i}");
|
|
|
}
|
|
|
//吸嘴有无产品检测
|
|
|
for (int i = 1; i <= 4; i++)
|
|
|
{
|
|
|
while (true)
|
|
|
{
|
|
|
VacManager.DischargeVacSuction(EVacOperator.Open, true, i);
|
|
|
if (Ops.IsOn($"吸料真空{i}检测"))
|
|
|
{
|
|
|
Msgbox.ShowDialog(AlarmCollection.Get(AlarmConstID.吸嘴有料).Transform(i), EButtonType.Retry);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
VacManager.DischargeVacSuction(EVacOperator.Close, true, i);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//料盘搬运检测
|
|
|
while (true)
|
|
|
{
|
|
|
if (Ops.IsOff("料盘搬运气缸原位"))
|
|
|
{
|
|
|
Msgbox.ShowDialog(AlarmCollection.Get(AlarmConstID.料盘搬运气缸原位检测), EButtonType.Retry);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
while (true)
|
|
|
{
|
|
|
Ops.On("料盘真空开");
|
|
|
Ops.Off("料盘真空关");
|
|
|
if (Ops.IsOn("料盘真空"))
|
|
|
{
|
|
|
Msgbox.ShowDialog(AlarmCollection.Get(AlarmConstID.料盘搬运有料盘), EButtonType.Retry);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Ops.Off("料盘真空开");
|
|
|
Ops.On("料盘真空关");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//先检测料仓处是否有料盘,如果有料盘提醒拿走
|
|
|
//满料对射3光电
|
|
|
for (int i = 1; i <= 3; i++)
|
|
|
{
|
|
|
//if (Ops.IsOn($"满料{i}对射光电"))
|
|
|
//{
|
|
|
// StockManager.OpenTray(i);
|
|
|
//}
|
|
|
while (true)
|
|
|
{
|
|
|
if (Ops.IsOn($"满料{i}对射光电"))
|
|
|
{
|
|
|
Msgbox.ShowDialog(AlarmCollection.Get(AlarmConstID.料仓有料报警).Transform(i), EButtonType.Ok);
|
|
|
//打开料仓jia'ci
|
|
|
Ops.Off($"料仓夹磁气缸{i}夹");
|
|
|
Ops.On($"料仓夹磁气缸{i}开");
|
|
|
Thread.Sleep(200);
|
|
|
Msgbox.ShowDialog(AlarmCollection.Get(AlarmConstID.取走顶层料盘报警).Transform(i), EButtonType.Ok);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
while (true)
|
|
|
{
|
|
|
if (Ops.IsOff($"抽屉拉伸气缸{i}原位"))
|
|
|
{
|
|
|
Msgbox.ShowDialog(AlarmCollection.Get(AlarmConstID.料仓未到位报警).Transform(i), EButtonType.Ok);
|
|
|
//打开料仓jia'ci
|
|
|
Ops.Off($"料仓夹磁气缸{i}夹");
|
|
|
Ops.On($"料仓夹磁气缸{i}开");
|
|
|
Thread.Sleep(200);
|
|
|
Msgbox.ShowDialog(AlarmCollection.Get(AlarmConstID.取走顶层料盘报警).Transform(i), EButtonType.Ok);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
while (true)
|
|
|
{
|
|
|
Ops.On($"抽屉锁{i}");
|
|
|
Thread.Sleep(200);
|
|
|
if (Ops.IsOff($"抽屉锁{i}动位"))
|
|
|
{
|
|
|
Msgbox.ShowDialog(AlarmCollection.Get(AlarmConstID.料仓抽屉锁动位异常报警), EButtonType.Retry);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
//检测各个轴是否有使能
|
|
|
string canGohome = CheckCanHome();
|
|
|
if (!string.IsNullOrEmpty(canGohome))
|
|
|
{
|
|
|
Msg.ShowError($"轴{canGohome}处于报警状态,不能回原");
|
|
|
MessageQueue.Instance.Warn($"轴{canGohome}处于报警状态,不能回原");
|
|
|
m_bCancle = true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
step = EHomeFlowStep.Z轴回原;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case EHomeFlowStep.Z轴回原:
|
|
|
MessageQueue.Instance.Insert("Z轴开始回零");
|
|
|
MachineManage.Instance.MachineStatus = EMachineStatus.Homing;
|
|
|
//料仓Z轴回零
|
|
|
AxisControl.GetAxis($"StockZ1").Home();
|
|
|
AxisControl.GetAxis($"StockZ2").Home();
|
|
|
AxisControl.GetAxis($"StockZ3").Home();
|
|
|
|
|
|
AxisControl.GetAxis($"NozzleZ1").Home();
|
|
|
AxisControl.GetAxis($"NozzleZ2").Home();
|
|
|
AxisControl.GetAxis($"NozzleZ3").Home();
|
|
|
AxisControl.GetAxis($"NozzleZ4").Home();
|
|
|
homeTime.Restart();
|
|
|
step = EHomeFlowStep.等待Z轴回原完成;
|
|
|
break;
|
|
|
case EHomeFlowStep.等待Z轴回原完成:
|
|
|
if (homeTime.ElapsedMilliseconds < 1000 * 60 * 2)//5分钟还未回零成功,则返回回零超时
|
|
|
{
|
|
|
if (Ops.AllZHomed())
|
|
|
{
|
|
|
MessageQueue.Instance.Insert("Z axis home finished!");
|
|
|
step = EHomeFlowStep.X轴回原;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
AxisControl.GetAxis($"StockZ1").Abort_Go_Home();
|
|
|
AxisControl.GetAxis($"StockZ2").Abort_Go_Home();
|
|
|
AxisControl.GetAxis($"StockZ3").Abort_Go_Home();
|
|
|
|
|
|
AxisControl.GetAxis($"NozzleZ1").Abort_Go_Home();
|
|
|
AxisControl.GetAxis($"NozzleZ2").Abort_Go_Home();
|
|
|
AxisControl.GetAxis($"NozzleZ3").Abort_Go_Home();
|
|
|
AxisControl.GetAxis($"NozzleZ4").Abort_Go_Home();
|
|
|
MachineManage.Instance.MachineStatus = EMachineStatus.HomeFail;
|
|
|
MessageQueue.Instance.Insert("Device home fail");
|
|
|
CancleHome();
|
|
|
}
|
|
|
break;
|
|
|
case EHomeFlowStep.X轴回原:
|
|
|
MessageQueue.Instance.Insert("loadx go home");
|
|
|
AxisControl.LoadX.Home();
|
|
|
homeTime.Restart();
|
|
|
step = EHomeFlowStep.等待X轴回原完成;
|
|
|
break;
|
|
|
case EHomeFlowStep.等待X轴回原完成:
|
|
|
if (homeTime.ElapsedMilliseconds < 1000 * 60 * 2)//5分钟还未回零成功,则返回回零超时
|
|
|
{
|
|
|
if (Ops.IsHomed("LoadX"))
|
|
|
{
|
|
|
step = EHomeFlowStep.Y轴回原;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
AxisControl.LoadX.Abort_Go_Home();
|
|
|
MachineManage.Instance.MachineStatus = EMachineStatus.HomeFail;
|
|
|
MessageQueue.Instance.Insert("Device home fail");
|
|
|
CancleHome();
|
|
|
}
|
|
|
break;
|
|
|
case EHomeFlowStep.Y轴回原:
|
|
|
AxisControl.LoadY1.Home();
|
|
|
AxisControl.LoadY2.Home();
|
|
|
AxisControl.TakeTrayX.Home();
|
|
|
homeTime.Restart();
|
|
|
step = EHomeFlowStep.等待Y轴回原完成;
|
|
|
break;
|
|
|
case EHomeFlowStep.等待Y轴回原完成:
|
|
|
if (homeTime.ElapsedMilliseconds < 1000 * 60 * 2)//5分钟还未回零成功,则返回回零超时
|
|
|
{
|
|
|
if (Ops.IsHomed("LoadY1", "LoadY2", "TakeTrayX"))
|
|
|
{
|
|
|
step = EHomeFlowStep.到起始位;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
AxisControl.LoadY1.Abort_Go_Home();
|
|
|
AxisControl.LoadY2.Abort_Go_Home();
|
|
|
AxisControl.TakeTrayX.Abort_Go_Home();
|
|
|
MachineManage.Instance.MachineStatus = EMachineStatus.HomeFail;
|
|
|
MessageQueue.Instance.Insert("Device home fail");
|
|
|
CancleHome();
|
|
|
}
|
|
|
break;
|
|
|
case EHomeFlowStep.到起始位:
|
|
|
AxisControl.StockZ1.MovePos(GlobalVar.StockZ1OutStock, GlobalVar.WholeSpeed);
|
|
|
AxisControl.StockZ2.MovePos(GlobalVar.StockZ2OutStock, GlobalVar.WholeSpeed);
|
|
|
AxisControl.StockZ3.MovePos(GlobalVar.StockZ3OutStock, GlobalVar.WholeSpeed);
|
|
|
AxisControl.LoadY1.MovePos(GlobalVar.StockSideY1,GlobalVar.WholeSpeed);
|
|
|
AxisControl.LoadX.MovePos(GlobalVar.DischargeSafePostionX,GlobalVar.WholeSpeed);
|
|
|
AxisControl.LoadY2.MovePos(GlobalVar.DischargeSafePostionY2,GlobalVar.WholeSpeed);
|
|
|
AxisControl.TakeTrayX.MovePos(GlobalVar.TakeTrayXWaitPos,GlobalVar.WholeSpeed);
|
|
|
step = EHomeFlowStep.等待到起始位;
|
|
|
break;
|
|
|
case EHomeFlowStep.等待到起始位:
|
|
|
if (Ops.IsStop("LoadX", "LoadY1", "LoadY2", "TakeTrayX", "StockZ1", "StockZ2", "StockZ3"))
|
|
|
{
|
|
|
MessageQueue.Instance.Insert("Device home ok");
|
|
|
MachineManage.Instance.MachineStatus = EMachineStatus.Homed;
|
|
|
m_bHomed = true;
|
|
|
step = EHomeFlowStep.回原环境检测;
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
DevLog.EventTracker("INIT END", 0, "", "HOME");
|
|
|
}
|
|
|
|
|
|
private string CheckCanHome()
|
|
|
{
|
|
|
List<string> list = new List<string>();
|
|
|
foreach(IAxis axis in AxisControl.GetAllAxis())
|
|
|
{
|
|
|
axis.GetAlarmStatus(out bool bAlarm);
|
|
|
if(bAlarm)
|
|
|
{
|
|
|
list.Add(axis.Config.AxisName);
|
|
|
}
|
|
|
}
|
|
|
return string.Join(",", list);
|
|
|
}
|
|
|
}
|
|
|
}
|