using Rs.Controls; using Rs.Framework; using Rs.Motion; using Rs.MotionPlat.Commom; using Rs.MotionPlat.Entitys; using Rs.MotionPlat.Flow.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using static Rs.MotionPlat.Commom.SchedulingMessageBox; namespace Rs.MotionPlat.Flow.SubFlow { enum ETurnoverDumpFlowStep { 到放料位下方, 等待到放料位下方, 放料完成抬起, 等待放料完成抬起 } /// /// 当周转吸嘴在治具或者周转盘取料失败时,自动把产品放下去,然后再报警 /// public class TurnoverDumpFlow { private TurnoverDumpFlow() { } private static TurnoverDumpFlow instance; public static TurnoverDumpFlow Instance { get { if(instance==null) instance = new TurnoverDumpFlow(); return instance; } } private ETurnoverDumpFlowStep step = ETurnoverDumpFlowStep.到放料位下方; //double targetPos = 0.0; TargetPosition targetPosition = new TargetPosition(); AlarmEntity alarmEntity = null; ErrorCode errCode = ErrorCode.Ok; string logInfo = string.Empty; ManualResetEvent dumpFinished = new ManualResetEvent(true); bool finished = true; public bool Dump(ETrayType trayType, List transitNozzleList) { step = ETurnoverDumpFlowStep.到放料位下方; if (finished) { dumpFinished.Reset(); finished = false; } else return false; Task.Run(() => { while (!finished) { if (MachineManage.Instance.MachineStatus == EMachineStatus.Stop) { Thread.Sleep(10); continue; } switch (step) { case ETurnoverDumpFlowStep.到放料位下方: targetPosition.TurnoverZ = SysConfigParam.GetValue("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset * 1.5; errCode = AxisControl.TurnoverZ.MovePos(targetPosition.TurnoverZ, GlobalVar.WholeSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { logInfo = GetClassName() + $"到放料位下方"; MessageQueue.Instance.Insert(logInfo); step = ETurnoverDumpFlowStep.等待到放料位下方; } else { //PromptMessageBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } break; case ETurnoverDumpFlowStep.等待到放料位下方: if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { //if (Ops.IsArrived(AxisControl.TurnoverZ)) if(AxisArrived.TurnoverZIsInTargetPos(targetPosition.TurnoverZ)) { logInfo = GetClassName() + $"已运动到放料位下方"; MessageQueue.Instance.Insert(logInfo); ////关闭真空吸 VacManager.TransitNozzleVacSuction(EVacOperator.Close, true, transitNozzleList.ToArray()); //打开真空破 VacManager.TransitNozzleVacBreak(EVacOperator.Open, true, transitNozzleList.ToArray()); //关闭真空破 VacManager.TransitNozzleVacBreak(EVacOperator.Close, false, transitNozzleList.ToArray()); step = ETurnoverDumpFlowStep.放料完成抬起; } else { step = ETurnoverDumpFlowStep.到放料位下方; } } break; case ETurnoverDumpFlowStep.放料完成抬起: errCode = AxisControl.TurnoverZ.MovePos(0, GlobalVar.WholeSpeed); if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis) { logInfo = GetClassName() + $"放料完成抬起"; MessageQueue.Instance.Insert(logInfo); step = ETurnoverDumpFlowStep.等待放料完成抬起; } else { ///PromptMessageBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode); alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString()); AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null); } break; case ETurnoverDumpFlowStep.等待放料完成抬起: if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis) { //if (Ops.IsArrived(AxisControl.TurnoverZ)) if(AxisArrived.TurnoverZIsInTargetPos(targetPosition.TurnoverZ)) { finished = true; logInfo = GetClassName() + $"放料完成已抬起"; MessageQueue.Instance.Insert(logInfo); dumpFinished.Set(); break; } else { step = ETurnoverDumpFlowStep.放料完成抬起; } } break; } Thread.Sleep(10); } }); return true; } public void Wait() { dumpFinished.WaitOne(); } string GetClassName() { return "TurnoverDumpFlow-"; } } }