TakeBoxFromLineTask.cs
10.9 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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
using AGVLib;
using CtuDeviceLib;
using Mushiny;
using OnlineStore.Common;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace DeviceLibrary.CtuService
{
/// <summary>
/// 手动线取空箱-v1
/// </summary>
public class TakeBoxFromLineTask : TakeBoxBase
{
public TakeBoxFromLineTask(CTU ctu) : base(ctu)
{
Name = "入库线体取料箱";
setDstName(Setting_Init.rawLine_out);
}
int ctuWaitSeconds { get { return ConfigAppSettings.GetIntValue("ManualNextInTaskWaitSeconds", 30); } }
public override void Excute()
{
//当前位置不是目的地,就重新规划路线
if (MoveInfo.MoveStep != RunStep.Wait && MoveInfo.MoveStep != RunStep.Instore_TakeBoxFromLine_01_MoveToSrc)
{
if (ctu.CurLandMark != destination)
{
MoveInfo.NextMoveStep(RunStep.Wait);
MoveInfo.Info($"当前点位不在目标点【{DstName}】【{destination}】,重新进入入库线体取料箱");
}
}
switch (MoveInfo.MoveStep)
{
case RunStep.Wait:
if (targetIsCurPos)
{
MoveInfo.NextMoveStep(RunStep.Instore_TakeBoxFromLine_02_AtSrc);
MoveInfo.Info($"已在【{DstName}】【{destination}】");
return;
}
if (!CalcDst())
{
Msg.add($"规划去【{DstName}】失败,请检查", MsgLevel.warning);
return;
}
MoveInfo.NextMoveStep(RunStep.Instore_TakeBoxFromLine_01_MoveToSrc);
MoveInfo.Info($"去【{DstName}】【{destination}】");
break;
case RunStep.Instore_TakeBoxFromLine_01_MoveToSrc:
if (IsFinished)
{
MoveInfo.NextMoveStep(RunStep.Instore_TakeBoxFromLine_02_AtSrc);
MoveInfo.Info($"到达【{DstName}】【{destination}】");
}
else
{
Move();
}
break;
case RunStep.Instore_TakeBoxFromLine_02_AtSrc:
if (CurTask != null)
{
TaskManager.SetTaskState(CurTask, RobotTaskState.执行中);
MoveInfo.NextMoveStep(RunStep.Instore_TakeBoxFromLine_03_RequestLeave);
setBoxCode(CurTask.BoxCode);
UpdateLocInfo(TaskStatus.EXECUTING, SmfTaskType.Instore);
RequestLeave();
MoveInfo.Info($"请求取料箱【{boxCode}】");
return;
}
if (TaskManager.HasInstoreBoxReady(out RobotTask robotTask))
{
CurTask = robotTask;
TaskManager.SetTaskState(robotTask, RobotTaskState.执行中);
var dstPosInfo = PosInfos.GetPosInfoByName(CurTask.DestPoint);
if (dstPosInfo != null)
{
if (TaskUtil.disabledLancode.Contains(dstPosInfo.Lanway))
{
Msg.add($"【{DstName}】处的料箱【{boxCode}】所在库位巷道【{dstPosInfo.Lanway}】被屏蔽,请手动处理", MsgLevel.warning);
return;
}
}
MoveInfo.NextMoveStep(RunStep.Instore_TakeBoxFromLine_03_RequestLeave);
setBoxCode(CurTask.BoxCode);
UpdateLocInfo(TaskStatus.EXECUTING, SmfTaskType.Instore);
RequestLeave();
MoveInfo.Info($"请求取料箱【{boxCode}】");
}
else if (MoveInfo.IsTimeOut(ctuWaitSeconds)) //超时未等到下一个任务
{
if (ctu.AllBasketIsEmpty())
{
ctu.CtuTask = null;
MoveInfo.Info($"背篓为空,等待[{ctuWaitSeconds}s]超时无下一入库任务,结束");
}
else //有背篓不为空
{
MoveInfo.Info($"背篓不为空,等待[{ctuWaitSeconds}s]超时无下一入库任务");
var task = OutTaskHelper.GetNearestPutBoxToShelfTask(ctu, out _);
if (task != null)
{
ctu.CtuTask = task;
MoveInfo.Info($"找到任务【{task.Name}】【{task.DstName}】【{task.destination}】");
return;
}
task = new StandbyTask(ctu);
ctu.CtuTask = task;
MoveInfo.Info($"未找到入库任务,去待命点【{task.Name}】【{task.DstName}】【{task.destination}】");
}
}
break;
case RunStep.Instore_TakeBoxFromLine_03_RequestLeave:
if (TaskManager.InstoreBoxReady(boxCode))
{
MoveInfo.NextMoveStep(RunStep.Instore_TakeBoxFromLine_04_GetContainer);
ShelfOrEquipToBasket();
MoveInfo.Info($"取料箱【{boxCode}】");
}
else
{
Msg.add($"等待料箱【{boxCode}】到达", MsgLevel.info);
}
break;
case RunStep.Instore_TakeBoxFromLine_04_GetContainer:
if (IsFinished)
{
MoveInfo.NextMoveStep(RunStep.Instore_TakeBoxFromLine_05_FinishLeave);
FinishLeave();
MoveInfo.Info($"取料箱【{boxCode}】完成");
}
break;
case RunStep.Instore_TakeBoxFromLine_05_FinishLeave:
if (Complete())
{
MoveInfo.NextMoveStep(RunStep.Instore_TakeBoxFromLine_06_CheckComplete);
MoveInfo.Info("收到Complete,出料完成");
}
else
{
Msg.add($"等待料箱【{boxCode}】放入线体通知完成", MsgLevel.info);
}
break;
case RunStep.Instore_TakeBoxFromLine_06_CheckComplete:
if (UpdateLocInfo(TaskStatus.IN_ON_AGV, SmfTaskType.Instore))
{
MoveInfo.NextMoveStep(RunStep.Instore_TakeBoxFromLine_07_UpdateContainerLoc);
MoveInfo.Info($"料箱【{boxCode}】放入背篓完成"); ;
UpdateBoxLoc(GenCtuLoc());
MoveInfo.Info($"上报已从【{DstName}】取料箱【{boxCode}】");
}
else
{
Msg.add($"等待料箱【{boxCode}】放入背篓通知完成", MsgLevel.info);
}
break;
case RunStep.Instore_TakeBoxFromLine_07_UpdateContainerLoc:
MoveInfo.NextMoveStep(RunStep.CtuTask_ProcessFinished);
break;
case RunStep.CtuTask_ProcessFinished:
if (ctu.HasEmptyBasket())
{
ctu.CtuTask = new TakeBoxFromLineTask(ctu);
MoveInfo.Info($"等待下一空箱入库任务");
}
else //无空背篓
{
var task = OutTaskHelper.GetNearestPutBoxToShelfTask(ctu, out _);
if (task != null)
{
ctu.CtuTask = task;
MoveInfo.Info($"无空余背篓,去放空箱");
}
else
{
ctu.CtuTask = new StandbyTask(ctu);
MoveInfo.Info($"无空余背篓,未找到去放空箱,去待机点");
}
}
break;
}
}
//protected override bool FindNearInTaskInPath()
//{
// var pointCodes = new List<PointCode>(planedPoints);
// var map = new Dictionary<int, byte>();//key=编号,value=层
// foreach (var item in ctu.Baskets)
// {
// if (string.IsNullOrEmpty(item.BoxCode)) continue;
// if (item.BoxCode == boxCode) continue;
// if (string.IsNullOrEmpty(item.DstName))
// {
// if (SMFManager.GetBoxTarget(item.BoxCode, out string dst))
// {
// item.DstName = dst;
// }
// else
// {
// continue;
// }
// }
// var pos = PosInfos.GetPosInfoByName(item.DstName);
// if (pos != null)
// {
// if (pos.Name == pos.ShelveCode)//库位号
// {
// var findIdx = pointCodes.FindIndex(s => s.Id.Equals(pos.PointCode));
// if (findIdx != -1)
// {
// map[findIdx] = item.Row;
// }
// }
// }
// }
// if (map.Count > 0)
// {
// var minIdx = map.Keys.Min();
// var basket = ctu.GetBasket(map[minIdx]);
// CurTask = TaskManager.GenRobotTask(basket);
// setBoxCode(basket.BoxCode);
// setDstName(basket.DstName);
// CalcDst();
// return true;
// }
// return false;
//}
//protected override bool FindNearOutTaskInPath()
//{
// var pointCodes = new List<PointCode>(planedPoints);
// var outTask = TaskUtil.Outlet_GetNearestOutBoxInPath(pointCodes);
// if (outTask != null)
// {
// CurTask = TaskManager.GenRobotTask(outTask);
// setBoxCode(CurTask.BoxCode);
// setDstName(CurTask.SrcPoint);
// CalcDst();
// return true;
// }
// return false;
//}
}
}