TakeBoxFromShelfTask.cs
4.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using CtuDeviceLib;
using Mushiny;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DeviceLibrary.CtuService
{
/// <summary>
/// 从货架取满箱任务-OK
/// </summary>
public class TakeBoxFromShelfTask : TakeBoxBase
{
public TakeBoxFromShelfTask(CTU ctu, RobotTask robotTask) : base(ctu, robotTask)
{
Name = "出库货架取箱";
}
private void FindNextTaskAfterTakeFullBoxFromShelf()
{
//先看背篓是否有空箱子入库
var task = OutTaskHelper.GetPutEmptyBoxToCurShelf(ctu);
if (task != null)
{
ctu.CtuTask = task;
return;
}
//先找最近的取满箱任务或空箱上架
task = OutTaskHelper.GetNearestTakeBoxFromShelfOrPutBoxToShelfTask(ctu, out string resultMsg);
if (task != null)
{
ctu.CtuTask = task;
}
else
{
var basketToPutOnLine = ctu.GetFullBaskets()?.Find(s => Setting_Init.rawLine_in.Equals(s.DstName));
if (basketToPutOnLine != null)
{
ctu.CtuTask = new PutBoxToLineTask(ctu, Setting_Init.rawLine_in, basketToPutOnLine.BoxCode);
return;
}
//出库任务在死胡同中,回待机位放满箱
var standByForOutTask = new StandbyTask(ctu);
ctu.CtuTask = standByForOutTask;
}
}
public override void Excute()
{
//当前位置不是目的地,就重新规划路线
if (MoveInfo.MoveStep != RunStep.Wait && MoveInfo.MoveStep != RunStep.Outstore_TakeBoxFromShelf_01_MoveToDst)
{
if (ctu.CurLandMark != destination)
{
MoveInfo.NextMoveStep(RunStep.Wait);
MoveInfo.Info($"当前点位不在目标点【{DstName}】【{destination}】,重新进入从架位取满箱(出库)流程");
}
}
switch (MoveInfo.MoveStep)
{
case RunStep.Wait:
if (!CalcDst())
{
Msg.add($"规划去【{DstName}】失败,请检查", MsgLevel.warning);
return;
}
UpdateLocInfo(TaskStatus.EXECUTING, SmfTaskType.OutStore);
MoveInfo.NextMoveStep(RunStep.Outstore_TakeBoxFromShelf_01_MoveToDst);
MoveInfo.Info($"去【{DstName}】【{destination}】");
break;
case RunStep.Outstore_TakeBoxFromShelf_01_MoveToDst:
if (IsFinished)
{
MoveInfo.NextMoveStep(RunStep.Outstore_TakeBoxFromShelf_02_AtDst);
MoveInfo.Info($"到达【{DstName}】【{destination}】");
}
else
{
Move();
}
break;
case RunStep.Outstore_TakeBoxFromShelf_02_AtDst:
MoveInfo.NextMoveStep(RunStep.Outstore_TakeBoxFromShelf_03_TakeBox);
ShelfOrEquipToBasket();
MoveInfo.Info($"取料箱【{boxCode}】");
break;
case RunStep.Outstore_TakeBoxFromShelf_03_TakeBox:
if (IsFinished)
{
var rtn = SMFManager.boxOutFromShelf(boxCode);
if (!rtn)
{
MoveInfo.Error($"上报从货架【{DstName}】取料箱【{boxCode}】失败");
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
return;
}
MoveInfo.NextMoveStep(RunStep.Outstore_TakeBoxFromShelf_04_UpdateBoxLoc);
MoveInfo.Info($"料箱【{boxCode}】放入背篓完成");
UpdateLocInfo(TaskStatus.OUT_ON_AGV, SmfTaskType.OutStore);
UpdateBoxLoc(GenCtuLoc());
MoveInfo.Info($"上报已从【{DstName}】取料箱【{boxCode}】完成");
}
break;
case RunStep.Outstore_TakeBoxFromShelf_04_UpdateBoxLoc:
MoveInfo.NextMoveStep(RunStep.CtuTask_ProcessFinished);
break;
case RunStep.CtuTask_ProcessFinished:
FindNextTaskAfterTakeFullBoxFromShelf();
break;
}
}
}
}