You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

356 lines
18 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
}
}