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;
|
|
}
|
|
|
|
}
|
}
|