using System.Threading; using System.Threading.Tasks; using VirtualSrm.Common.Entity; using VirtualSrm.Srm.Entity; using VirtualSrm.Srm.EnumType; using VirtualSrm.Utils; namespace VirtualSrm.Srm.Strategy { public class 执行搬运命令:IStrategy { private StackerEntity Stacker; private TaskEntity Task; private bool XFlag; private bool YFlag; private bool ZFlag; public 执行搬运命令(StackerEntity stacker, TaskEntity task) { this.Stacker = stacker; this.Task = task; } public void DoJob() { Task.Status = (int)ETaskStatus.执行中; Stacker.WState = (int)ESrmState.定位到取货位; Stacker.WLiftFull = 0; Stacker.WDeliveryFinish = 0; Stacker.WPickFinish = 0; Stacker.WTaskFinish = 0; ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(MoveX)), Task.SourcePosX); ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(MoveY)), Task.SourcePosY); while(!XFlag || !YFlag) { Thread.Sleep(1000); } Stacker.WState = (int)ESrmState.取货中; XFlag = false; YFlag = false; ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(MoveZ)), Task.SourcePosZ); while (!ZFlag) { Thread.Sleep(1000); } ZFlag = false; Thread.Sleep(1000); ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(MoveZ)), 0); while (!ZFlag) { Thread.Sleep(1000); } Stacker.WState = (int)ESrmState.取货完成; Stacker.WLiftFull = 1; Stacker.WPickFinish = 1; Thread.Sleep(1000); ZFlag = false; Stacker.WState = (int)ESrmState.移动到放货位置; ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(MoveX)), Task.DestinationPosX); ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(MoveY)), Task.DestinationPosY); while (!XFlag || !YFlag) { Thread.Sleep(1000); } Stacker.WState = (int)ESrmState.放货中; XFlag = false; YFlag = false; Thread.Sleep(1000); ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(MoveZ)), Task.DestinationPosZ); while (!ZFlag) { Thread.Sleep(1000); } Stacker.WLiftFull = 0; ZFlag = false; Thread.Sleep(1000); ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(MoveZ)), 0); while (!ZFlag) { Thread.Sleep(1000); } Stacker.WDeliveryFinish = 1; Stacker.WState = (int)ESrmState.搬运完成; Thread.Sleep(1000); ZFlag = false; Stacker.WTaskFinish = 1; while(Stacker.TaskNo != 0) { Thread.Sleep(1000); } Stacker.WTaskNo = Stacker.TaskNo; Task.Status = (int)ETaskStatus.已结束; Stacker.WState = (int)ESrmState.堆垛机空闲; Stacker.WTaskFinish = 0; Stacker.WLiftFull = 0; Stacker.WDeliveryFinish = 0; Stacker.WPickFinish = 0; } private void MoveX(object x) { var xBegin = Stacker.WPosX; var xEnd = (int)x; var deleta = xBegin < xEnd ? 1 : -1; while(Stacker.WPosX != xEnd) { if(Stacker.EmergencyStop == 0) { Stacker.WPosXmm += 100*deleta; Thread.Sleep(1000); Stacker.WPosXmm += 100 * deleta; Stacker.WPosX += deleta; } Thread.Sleep(1000); } XFlag = true; } private void MoveY(object y) { var yBegin = Stacker.WPosY; var yEnd = (int)y; var deleta = yBegin < yEnd ? 1 : -1; while (Stacker.WPosY != yEnd) { if (Stacker.EmergencyStop == 0) { Stacker.WPosYmm += 100 * deleta; Thread.Sleep(1000); Stacker.WPosYmm += 100 * deleta; Stacker.WPosY += deleta; } Thread.Sleep(1000); } YFlag = true; } private void MoveZ(object z) { var zEnd = (int)z; if(zEnd == 2 || zEnd ==6) { Stacker.WPosZ = (int)EForkPos.货叉在右侧; Stacker.WPosZmm += 100; Thread.Sleep(1000); Stacker.WPosZmm += 100; Thread.Sleep(1000); } else if (zEnd == 1 || zEnd == 5) { Stacker.WPosZ = (int)EForkPos.货叉在右侧; Stacker.WPosZmm += 100; Thread.Sleep(1000); Stacker.WPosZmm += 100; Thread.Sleep(1000); Stacker.WPosZmm += 100; Thread.Sleep(1000); Stacker.WPosZmm += 100; Thread.Sleep(1000); } else if (zEnd == 3 || zEnd == 7) { Stacker.WPosZ = (int)EForkPos.货叉在左侧; Stacker.WPosZmm -= 100; Thread.Sleep(1000); Stacker.WPosZmm -= 100; Thread.Sleep(1000); } else if (zEnd == 4 || zEnd == 8) { Stacker.WPosZ = (int)EForkPos.货叉在左侧; Stacker.WPosZmm -= 100; Thread.Sleep(1000); Stacker.WPosZmm -= 100; Thread.Sleep(1000); Stacker.WPosZmm -= 100; Thread.Sleep(1000); Stacker.WPosZmm -= 100; Thread.Sleep(1000); } else if(zEnd == 0) { var delta = Stacker.WPosZmm > 0 ? -1 : 1; while(Stacker.WPosZmm != 0) { Stacker.WPosZmm += 100 * delta; Thread.Sleep(1000); } Stacker.WPosZ = (int)EForkPos.货叉原位; } ZFlag = true; } } }