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.

450 lines
24 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.Framework;
using Rs.Motion;
using Rs.Motion.Base;
using Rs.MotionPlat.Commom;
using Rs.MotionPlat.Entitys.Trays;
using Rs.MotionPlat.Flow.SafePosFlow;
using Rs.MotionPlat.Flow.SubFlow;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static Rs.MotionPlat.Commom.SchedulingMessageBox;
namespace Rs.MotionPlat.Flow.NgFlow
{
enum EWarningSuckerNgFlowStep
{
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
}
/// <summary>
/// 强力吸头异常处理流程
/// </summary>
public class WarningSuckerNgFlow
{
private WarningSuckerNgFlow() { }
private static WarningSuckerNgFlow instance;
public static WarningSuckerNgFlow Instance
{
get
{
if(instance==null)
instance = new WarningSuckerNgFlow();
return instance;
}
}
/// <summary>
/// 强力吸嘴重取次数
/// </summary>
int retakeNum = 0;
bool exit = false;
Stopwatch timeout= new Stopwatch();
string logInfo = string.Empty;
string alarmInfo = string.Empty;
/// <summary>
/// 报警轴列表
/// </summary>
List<IAxis> alarmAxisList = new List<IAxis>();
SchedulingMessageBox msgBox;
EWarningSuckerNgFlowStep step = EWarningSuckerNgFlowStep.;
/// <summary>
/// 任务完成事件
/// </summary>
ManualResetEvent taskFinishedEvent = new ManualResetEvent(true);
/// <summary>
/// 开始处理NG产品
/// </summary>
/// <param name="exceptionTray"></param>
/// <param name="exceptionSlotIndex"></param>
public void DealNgProduct(ETrayType exceptionTray,int exceptionSlotIndex)
{
ErrorCode errCode = ErrorCode.Ok;
SlotPoint targetSlot = new SlotPoint();
exit = false;
step = EWarningSuckerNgFlowStep.;
taskFinishedEvent.Reset();
while (!exit)
{
if (MachineManage.Instance.MachineStatus == EMachineStatus.Stop)
{
Thread.Sleep(10);
continue;
}
switch (step)
{
case EWarningSuckerNgFlowStep.:
if(TurnoverFlow.Instance.GetStep()=="等待任务"
|| TurnoverFlow.Instance.GetStep() == "取料异常报警"
|| TurnoverFlow.Instance.GetStep()== "周转盘放料完成后真空检测")
{
logInfo = GetClassName() + "测试工位已完成";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
}
break;
case EWarningSuckerNgFlowStep.:
if (exceptionTray == ETrayType.Turnover)
{
targetSlot = TrayPointManager.GetTurnoverTrayForceNozzlePoint(exceptionSlotIndex);
errCode = AxisControl.TurnoverX.MovePos(targetSlot.X, GlobalVar.WholeSpeed);
if(errCode== ErrorCode.Ok || GlobalVar.VirtualAxis)
{
errCode = AxisControl.TurnoverY.MovePos(targetSlot.Y, GlobalVar.WholeSpeed);
if(errCode== ErrorCode.Ok || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"到{exceptionTray}盘{exceptionSlotIndex}穴位上方";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode);
}
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode);
}
}
break;
case EWarningSuckerNgFlowStep.:
if (Ops.IsStop(AxisAlias.TurnoverX, AxisAlias.TurnoverY) || GlobalVar.VirtualAxis)
{
if(Ops.IsArrived(AxisAlias.TurnoverX) || GlobalVar.VirtualAxis)
{
if(Ops.IsArrived(AxisAlias.TurnoverY) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已运动到{exceptionTray}盘{exceptionSlotIndex}穴位上方";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, "Axis not arrived target position");
step = EWarningSuckerNgFlowStep.;
}
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, "Axis not arrived target position");
step = EWarningSuckerNgFlowStep.;
}
}
break;
case EWarningSuckerNgFlowStep.:
errCode = AxisControl.TurnoverZ.MovePos(GlobalVar.TurnoverTrayForceNozzleTakeHeight, GlobalVar.WholeSpeed);
if(errCode== ErrorCode.Ok || GlobalVar.VirtualAxis)
{
Ops.On("独立吸头气缸");
logInfo = GetClassName() + "独立吸头气缸下降";
MessageQueue.Instance.Insert(logInfo);
timeout.Restart();
logInfo = GetClassName() + "到异常处理位下方";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
}
break;
case EWarningSuckerNgFlowStep.:
if (Ops.IsStop(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
{
Thread.Sleep(100);
if (Ops.IsArrived(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + "已运动到异常处理位下方";
MessageQueue.Instance.Insert(logInfo);
//打开强力吸嘴真空
VacManager.ForceNozzleVacSuction(EVacOperator.Open);
//关闭周转盘真空吸
VacManager.TurnoverTrayVacSuction(EVacOperator.Close, exceptionSlotIndex);
//打开周转盘这空破
VacManager.TurnoverTrayVacBreak(EVacOperator.Open, exceptionSlotIndex);
step = EWarningSuckerNgFlowStep.;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, "Axis not arrived target position");
step = EWarningSuckerNgFlowStep.;
}
}
break;
case EWarningSuckerNgFlowStep.:
errCode = AxisControl.TurnoverZ.MovePos(0, GlobalVar.WholeSpeed);
if(errCode== ErrorCode.Ok || GlobalVar.VirtualAxis)
{
Ops.Off("独立吸头气缸");
logInfo = GetClassName() + "独立吸头气缸上升";
MessageQueue.Instance.Insert(logInfo);
logInfo = GetClassName() + "取料完成到安全位";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
timeout.Restart();
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
}
break;
case EWarningSuckerNgFlowStep.:
if (Ops.IsStop(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
{
if (Ops.IsArrived(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
{
Thread.Sleep(100);
logInfo = GetClassName() + "已运动到异常处理位安全位";
MessageQueue.Instance.Insert(logInfo);
//关闭周转盘真空破
VacManager.TurnoverTrayVacBreak(EVacOperator.Close, exceptionSlotIndex);
step = EWarningSuckerNgFlowStep.;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, "Axis not arrived target position");
step = EWarningSuckerNgFlowStep.;
}
}
break;
case EWarningSuckerNgFlowStep.:
if(LaserFlow.Instance.HasProduct(ETrayType.Turnover, exceptionSlotIndex))
{
retakeNum++;
if(retakeNum<3)
{
logInfo = $"周转盘{exceptionSlotIndex}号穴位取料失败,失败次数:{retakeNum}";
MessageQueue.Instance.Warn(logInfo);
step = EWarningSuckerNgFlowStep.;
}
else
{
TransitModuleSafePosFlow.Instance.GoSafePostion( EExceptionSafePos.Socket);
alarmInfo = $"{exceptionTray}盘{exceptionSlotIndex}穴位取料失败{retakeNum}次,请人工处理";
msgBox = MsgBox.ShowDialog(AlarmConstID.TurnoverTakeFailAlarm, alarmInfo, ETipButton.Ok);
step = EWarningSuckerNgFlowStep.;
}
}
else
{
MessageQueue.Instance.Insert("WarningSuckerNgFlow-镭射头检测OK");
step = EWarningSuckerNgFlowStep.;
}
break;
case EWarningSuckerNgFlowStep.:
if (LaserFlow.Instance.HasProduct(ETrayType.Turnover, exceptionSlotIndex))
{
TransitModuleSafePosFlow.Instance.GoSafePostion( EExceptionSafePos.Socket);
alarmInfo = $"{exceptionTray}盘{exceptionSlotIndex}穴位产品未取出,请人工处理";
msgBox = MsgBox.ShowDialog(AlarmConstID.TurnoverTakeFailAlarm, alarmInfo, ETipButton.Ok);
step = EWarningSuckerNgFlowStep.;
}
else
{
MessageQueue.Instance.Insert("WarningSuckerNgFlow-镭射头检测OK");
step = EWarningSuckerNgFlowStep.;
}
break;
case EWarningSuckerNgFlowStep.:
int exceptionRow = TurnoverTrayManager.Instance.Slot(exceptionSlotIndex).Row;
if(exceptionRow % 2 == 0)
{
targetSlot = TrayPointManager.GetExceptiontTrayPoint(1);
}
else
{
targetSlot = TrayPointManager.GetExceptiontTrayPoint(2);
}
errCode = AxisControl.TurnoverX.MovePos(targetSlot.X, GlobalVar.WholeSpeed);
if(errCode== ErrorCode.Ok ||GlobalVar.VirtualAxis)
{
errCode = AxisControl.TurnoverY.MovePos(targetSlot.Y, GlobalVar.WholeSpeed);
if(errCode== ErrorCode.Ok || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + "到放报警料穴位上方";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode);
}
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode);
}
break;
case EWarningSuckerNgFlowStep.:
if (Ops.IsStop(AxisAlias.TurnoverX, AxisAlias.TurnoverY) || GlobalVar.VirtualAxis)
{
if (Ops.IsArrived(AxisAlias.TurnoverX) || GlobalVar.VirtualAxis)
{
if (Ops.IsArrived( AxisAlias.TurnoverY) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已运动到已运动到放报警料穴位上方";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
}
else
{
AxisControl.TurnoverY.Get_Target_Position(out double targetPos);
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, $"Axis not arrived target position {targetPos}");
step = EWarningSuckerNgFlowStep.;
}
}
else
{
AxisControl.TurnoverX.Get_Target_Position(out double targetPos);
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, $"Axis not arrived target position {targetPos}");
step = EWarningSuckerNgFlowStep.;
}
}
break;
case EWarningSuckerNgFlowStep.:
errCode = AxisControl.TurnoverZ.MovePos(GlobalVar.ExceptionTrayForceNozzleDumpHeight, GlobalVar.WholeSpeed);
if(errCode== ErrorCode.Ok || GlobalVar.VirtualAxis)
{
Ops.On("独立吸头气缸");
logInfo = GetClassName() + "独立吸头气缸下降";
MessageQueue.Instance.Insert(logInfo);
timeout.Restart();
logInfo = GetClassName() + "到异常处理位下方";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
}
break;
case EWarningSuckerNgFlowStep.:
if (Ops.IsStop(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
{
Thread.Sleep(300);
if (Ops.IsArrived(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + "已运动到放报警料穴位下方";
MessageQueue.Instance.Insert(logInfo);
//关闭强力吸嘴真空吸
VacManager.ForceNozzleVacSuction(EVacOperator.Close);
//打开强力吸嘴的真空破
VacManager.ForceNozzleVacBreak(EVacOperator.Open);
//关闭强力吸嘴的真空破
VacManager.ForceNozzleVacBreak(EVacOperator.Close);
step = EWarningSuckerNgFlowStep.;
}
else
{
AxisControl.TurnoverZ.Get_Target_Position(out double targetPos);
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, $"Axis not arrived target position {targetPos}");
step = EWarningSuckerNgFlowStep.;
}
}
break;
case EWarningSuckerNgFlowStep.:
errCode = AxisControl.TurnoverZ.MovePos(0, GlobalVar.WholeSpeed);
if(errCode== ErrorCode.Ok || GlobalVar.VirtualAxis)
{
Ops.Off("独立吸头气缸");
logInfo = GetClassName() + "独立吸头气缸上升";
MessageQueue.Instance.Insert(logInfo);
logInfo = GetClassName() + "放料完成到安全位";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
timeout.Restart();
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
}
break;
case EWarningSuckerNgFlowStep.:
if (Ops.IsStop(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
{
if (Ops.IsArrived(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + "放料完成已运动到安全位";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
}
else
{
AxisControl.TurnoverZ.Get_Target_Position(out double targetPos);
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, $"Axis not arrived target position {targetPos}");
step = EWarningSuckerNgFlowStep.;
}
}
break;
case EWarningSuckerNgFlowStep.:
if(!Ops.IsOn("NG料光纤检测") || GlobalVar.RunSpace)
{
logInfo = "检测到NG料盘中无产品流程继续";
MessageQueue.Instance.Insert(logInfo);
step = EWarningSuckerNgFlowStep.;
}
else
{
alarmInfo = "NG料盘中有产品请手动取出";
MessageQueue.Instance.Warn(GetClassName() + alarmInfo);
msgBox = MsgBox.ShowDialog(AlarmConstID.NgProductFiberCheckAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
switch (msgBox.Button)
{
case ETipButton.Skip:
logInfo = GetClassName()+ "选择了跳过按钮";
MessageQueue.Instance.Insert(logInfo);
break;
case ETipButton.Yes://移动到安全位
logInfo = "选择了移动到安全位按钮";
MessageQueue.Instance.Insert(logInfo);
TransitModuleSafePosFlow.Instance.GoSafePostion( EExceptionSafePos.Socket);
break;
}
}
break;
case EWarningSuckerNgFlowStep.:
TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket);
exit = true;
taskFinishedEvent.Set();
break;
default:
break;
}
Thread.Sleep(10);
}
}
public bool Wait()
{
return taskFinishedEvent.WaitOne();
}
public string GetClassName()
{
return this.GetType().Name + "-";
}
}
}