using Rs.Controls; using Rs.Framework; 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; namespace Rs.MotionPlat.Flow.Space { enum ETakeTrayTestStep { 到取料盘上方, 等待到取料盘上方, 到下方取料盘, 等待运动到取料位下方, 取料盘完成抬起, 取料盘后真空检测, 到放料盘上方, 等待到放料盘上方, 到下方放料盘, 等待运动到放料位下方, 放料盘完成后抬起, 等待放料完成抬起 } public class TakeTrayTest:BaseFlow { Dictionary trayNameDic = new Dictionary(); private static TakeTrayTest instance; public static TakeTrayTest Instance { get { if (instance == null) instance = new TakeTrayTest(); return instance; } } private TakeTrayTest() { trayNameDic.Add(1, "Empty1"); trayNameDic.Add(2, "Input"); trayNameDic.Add(3, "Ok"); trayNameDic.Add(4, "Ng"); trayNameDic.Add(5, "Multi"); trayNameDic.Add(6, "Empty2"); } int trayIndex = 1; Stopwatch stopwatch = new Stopwatch(); ETakeTrayTestStep step = ETakeTrayTestStep.到取料盘上方; public override void Run() { switch (step) { case ETakeTrayTestStep.到取料盘上方: double centerX = SysConfigParam.GetValue($"Tray{trayNameDic[trayIndex]}CenterX"); double centerY = SysConfigParam.GetValue($"Tray{trayNameDic[trayIndex]}CenterY"); double cameraCenterX = SysConfigParam.GetValue("ClampCenter2UpCameraCenterX"); double cameraCenterY = SysConfigParam.GetValue("ClampCenter2UpCameraCenterY"); Motion.ErrorCode errCode = AxisControl.LoadX.MovePos(centerX + cameraCenterX, GlobalVar.TakeTraySpeed); if (errCode == Motion.ErrorCode.Ok) { errCode = AxisControl.LoadY.MovePos(centerY + cameraCenterY, GlobalVar.TakeTraySpeed); if (errCode == Motion.ErrorCode.Ok) { step = ETakeTrayTestStep.等待到取料盘上方; } } break; case ETakeTrayTestStep.等待到取料盘上方: if(Ops.IsStop("LoadX","LoadY")) { step = ETakeTrayTestStep.到下方取料盘; } break; case ETakeTrayTestStep.到下方取料盘: Ops.On("上下气缸电磁阀动位"); Ops.Off("上下气缸电磁阀原位"); Thread.Sleep(150); step = ETakeTrayTestStep.等待运动到取料位下方; stopwatch.Restart(); break; case ETakeTrayTestStep.等待运动到取料位下方: if (Ops.IsOn("上下气缸动位") || stopwatch.ElapsedMilliseconds>5000) { stopwatch.Stop(); Ops.On("夹爪真空吸"); Thread.Sleep(150); step = ETakeTrayTestStep.取料盘完成抬起; } break; case ETakeTrayTestStep.取料盘完成抬起: Ops.Off("上下气缸电磁阀动位"); Ops.On("上下气缸电磁阀原位"); Thread.Sleep(150); step = ETakeTrayTestStep.取料盘后真空检测; break; case ETakeTrayTestStep.取料盘后真空检测: if(Ops.IsOn("上下气缸原位")) { step = ETakeTrayTestStep.到放料盘上方; if(trayIndex==6) { trayIndex = 1; } else { trayIndex++; } } break; case ETakeTrayTestStep.到放料盘上方: centerX = SysConfigParam.GetValue($"Tray{trayNameDic[trayIndex]}CenterX"); centerY = SysConfigParam.GetValue($"Tray{trayNameDic[trayIndex]}CenterY"); cameraCenterX = SysConfigParam.GetValue("ClampCenter2UpCameraCenterX"); cameraCenterY = SysConfigParam.GetValue("ClampCenter2UpCameraCenterY"); errCode = AxisControl.LoadX.MovePos(centerX + cameraCenterX, GlobalVar.TakeTraySpeed); if (errCode == Motion.ErrorCode.Ok) { errCode = AxisControl.LoadY.MovePos(centerY + cameraCenterY, GlobalVar.TakeTraySpeed); if (errCode == Motion.ErrorCode.Ok) { step = ETakeTrayTestStep.等待到放料盘上方; } } break; case ETakeTrayTestStep.等待到放料盘上方: if (Ops.IsStop("LoadX", "LoadY")) { step = ETakeTrayTestStep.到下方放料盘; } break; case ETakeTrayTestStep.到下方放料盘: Ops.On("上下气缸电磁阀动位"); Ops.Off("上下气缸电磁阀原位"); Thread.Sleep(150); step = ETakeTrayTestStep.等待运动到放料位下方; stopwatch.Restart(); break; case ETakeTrayTestStep.等待运动到放料位下方: if(Ops.IsOn("上下气缸动位") || stopwatch.ElapsedMilliseconds > 5000) { stopwatch.Stop(); Ops.Off("夹爪真空吸"); Thread.Sleep(10); Ops.On("夹爪真空破"); Thread.Sleep(200); Ops.Off("夹爪真空破"); step = ETakeTrayTestStep.放料盘完成后抬起; } break; case ETakeTrayTestStep.放料盘完成后抬起: Ops.Off("上下气缸电磁阀动位"); Ops.On("上下气缸电磁阀原位"); Thread.Sleep(150); step = ETakeTrayTestStep.等待放料完成抬起; break; case ETakeTrayTestStep.等待放料完成抬起: if(Ops.IsOn("上下气缸原位")) { step = ETakeTrayTestStep.到取料盘上方; } break; } } } }