using Rs.Controls; using Rs.Framework; using Rs.Motion.Base; using Rs.MotionPlat.Commom; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Rs.MotionPlat.Flow { public class HomeFlow { 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() { MachineManage.Instance.InitializeState = EInitializeState.Initializing ; homeStep = 0; m_bHomed = false; Task.Run(() => { while (true && !m_bCancle && !m_bHomed) { if(GlobalVar.VirtualAxis) { MachineManage.Instance.SetCenterMachineStatus(Commom.ERunStatus.Stopped); MessageQueue.Instance.Insert("Device home ok"); MachineManage.Instance.SetLocalMachineStatus(EMachineStatus.Homed); MachineManage.Instance.InitializeState = EInitializeState.Initialized; m_bHomed = true; } else { switch (homeStep) { case 0://所有的Z轴回原 string canGohome = CheckCanHome(); if (!string.IsNullOrEmpty(canGohome)) { Msg.ShowError($"轴{canGohome}处于报警状态,不能回原"); MessageQueue.Instance.Warn($"轴{canGohome}处于报警状态,不能回原"); m_bCancle = true; } else { MessageQueue.Instance.Insert("Z轴开始回零"); homeTime.Restart(); MachineManage.Instance.MachineStatus = EMachineStatus.Homing; AxisControl.GetAxis($"NozzleZ1").Home(); AxisControl.GetAxis($"NozzleZ2").Home(); AxisControl.GetAxis($"NozzleR1").Home(); AxisControl.GetAxis($"NozzleR2").Home(); homeStep++; } break; case 1://等待所有Z轴回原完成 if (homeTime.ElapsedMilliseconds < 1000 * 60 * 2)//5分钟还未回零成功,则返回回零超时 { if (Ops.AllZHomed() && Ops.AllRHomed()) { MessageQueue.Instance.Insert("ZR axis home finished!"); homeStep++; } } else { AxisControl.GetAxis($"NozzleZ1").Abort_Go_Home(); AxisControl.GetAxis($"NozzleZ2").Abort_Go_Home(); MachineManage.Instance.MachineStatus = EMachineStatus.HomeFail; MessageQueue.Instance.Insert("Device home fail"); CancleHome(); } break; case 2: AxisControl.LoadX.MovePos(SysConfigParam.GetValue("LoadXStartPos"), GlobalVar.WholeSpeed); AxisControl.LoadY.MovePos(SysConfigParam.GetValue("LoadYStartPos"), GlobalVar.WholeSpeed); AxisControl.TurnoverY.MovePos(SysConfigParam.GetValue("PressY"), GlobalVar.WholeSpeed); AxisControl.TurnoverZ.MovePos(SysConfigParam.GetValue("TurnoverSafeZ"), GlobalVar.WholeSpeed); AxisControl.PressZ.MovePos(SysConfigParam.GetValue("PressSafeZ"), GlobalVar.WholeSpeed); homeStep++; break; case 3: if (Ops.IsStop(AxisControl.LoadX, AxisControl.LoadY,AxisControl.TurnoverY,AxisControl.TurnoverZ,AxisControl.PressZ)) { MachineManage.Instance.SetCenterMachineStatus(ERunStatus.Stopped); MessageQueue.Instance.Insert("Device home ok"); MachineManage.Instance.MachineStatus = EMachineStatus.Homed; m_bHomed = true; MachineManage.Instance.InitializeState = EInitializeState.Initialized; homeStep = 0; } break; default: break; } } } }); } private string CheckCanHome() { return string.Empty; List list = new List(); foreach(IAxis axis in AxisControl.GetAllAxis()) { axis.GetAlarmStatus(out bool bAlarm); if(bAlarm) { list.Add(axis.Config.AxisName); } } return string.Join(",", list); } } }