Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
顾剑亮
/
Camera
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
图表
网络
创建新的问题
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit a48bf027
由
张东亮
编写于
2020-08-08 17:17:44 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
0808
1 个父辈
81316f3e
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
898 行增加
和
139 行删除
.vs/AGVControl/v16/.suo
AGVControl/BLL/Control.cs
AGVControl/FrmMain.cs
.vs/AGVControl/v16/.suo
查看文件 @
a48bf02
此文件类型无法预览
AGVControl/BLL/Control.cs
查看文件 @
a48bf02
...
@@ -60,7 +60,20 @@ namespace BLL
...
@@ -60,7 +60,20 @@ namespace BLL
Marks
.
AddRange
(
arr
);
Marks
.
AddRange
(
arr
);
}
}
/// <summary>
/// 结构类型
/// </summary>
public
enum
ResultType
{
/// <summary>
/// 默认为无
/// </summary>
None
,
/// <summary>
/// 无空料架
/// </summary>
NoEmptyShelf
,
}
private
void
AgvCall
()
private
void
AgvCall
()
{
{
...
@@ -401,30 +414,28 @@ namespace BLL
...
@@ -401,30 +414,28 @@ namespace BLL
foreach
(
var
item
in
Common
.
nodeInfo
)
foreach
(
var
item
in
Common
.
nodeInfo
)
{
{
if
(
item
.
AgvName
.
Equals
(
agv
.
Name
))
if
(
item
.
AgvName
.
Equals
(
agv
.
Name
))
{
item
.
AgvName
=
""
;
item
.
AgvName
=
""
;
Common
.
log
.
OutInfo
(
"清除节点的AGV名称: 节点名:"
+
item
.
Name
+
";AGV名称:"
+
agv
.
Name
);
}
}
}
//B区域,需要出料,先拿料架
//B区域,需要出料,先拿料架
//Mark.Length>1防止Mark为0的情况,Mark=0是VMI的进料
//Mark.Length>1防止Mark为0的情况,Mark=0是VMI的进料
nodeIdx
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
Mark
.
Length
>
1
&&
s
.
IsUse
);
nodeIdx
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
Mark
.
Length
>
1
&&
s
.
IsUse
);
if
(
nodeIdx
==
-
1
)
if
(
nodeIdx
==
-
1
)
{
{
Common
.
log
.
OutInfo
(
"B区没有找到
新的
NeedEnter的节点"
);
Common
.
log
.
OutInfo
(
"B区没有找到NeedEnter的节点"
);
}
}
else
else
//B区域需要出料
{
{
//Mark没有被缓存
//Mark没有被缓存
int
n
=
Marks
.
FindIndex
(
t
=>
t
==
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
int
n
=
Marks
.
FindIndex
(
t
=>
t
==
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
if
(
n
==
-
1
)
if
(
n
==
-
1
)
//
{
{
//A4没有被占用
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A7"
&&
s
.
Action
==
ClientAction
.
NeedLeave
&&
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A4"
&&
s
.
Action
==
ClientAction
.
NeedLeave
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
IsUse
);
s
.
RFID
.
StartsWith
(
"A"
)
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
IsUse
);
if
(
n
==
-
1
)
if
(
n
>
-
1
)
{
nodeIdx
=
-
1
;
Common
.
log
.
OutInfo
(
"A4不是NeedLeave或被占用"
);
Common
.
log
.
OutTextBox
(
"A4没有架子或被占用"
);
}
else
{
{
agv
.
Place
=
Common
.
nodeInfo
[
n
].
Name
;
agv
.
Place
=
Common
.
nodeInfo
[
n
].
Name
;
agv
.
Mark
=
Common
.
nodeInfo
[
nodeIdx
].
Mark
;
agv
.
Mark
=
Common
.
nodeInfo
[
nodeIdx
].
Mark
;
...
@@ -456,29 +467,113 @@ namespace BLL
...
@@ -456,29 +467,113 @@ namespace BLL
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
log
.
OutTextBox
(
log
);
}
}
}
else
{
//A4没有被占用
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A4"
&&
s
.
Action
==
ClientAction
.
NeedLeave
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
IsUse
);
if
(
n
==
-
1
)
{
//nodeIdx = -1;
Common
.
log
.
OutInfo
(
"A4不是NeedLeave或被占用"
);
Common
.
log
.
OutTextBox
(
"A4没有架子或被占用"
);
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A8"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
IsUse
);
if
(
n
==
-
1
)
{
Common
.
log
.
OutInfo
(
"A8不是NeedEnter或被占用"
);
Common
.
log
.
OutTextBox
(
"A4、A7无空架子用与包装仓出库"
);
}
else
{
agv
.
Place
=
Common
.
nodeInfo
[
n
].
Name
;
agv
.
Mark
=
Common
.
nodeInfo
[
nodeIdx
].
Mark
;
//agv.CloseDoor = false;
rtn
=
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"Move"
+
agv
.
Place
]);
if
(
rtn
)
{
agv
.
CloseDoor
=
false
;
Common
.
nodeInfo
[
n
].
AgvName
=
agv
.
Name
;
agv
.
TaskSend
=
true
;
//_mark.Add(Common.nodeInfo[nodeIdx].Mark);
MarkAdd
(
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
Common
.
log
.
OutString
(
"Mark缓存 "
+
string
.
Join
(
","
,
Marks
.
ToArray
()));
log
=
string
.
Format
(
"{0} Move To {1}[{2}] [{3}]"
,
agv
.
Name
,
agv
.
Place
,
Common
.
nodeInfo
[
nodeIdx
].
Action
.
ToString
(),
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
mir
.
State_Ready
(
agv
);
Common
.
server
.
NodeRefresh
(
n
);
}
else
{
agv
.
TaskSend
=
false
;
log
=
string
.
Format
(
"{0} Move To {1} 失败"
,
agv
.
Name
,
agv
.
Place
);
//防止上一个任务已执行但返回失败时,删除任务
//Common.mir.Del_Mission(agv);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
}
}
}
else
{
agv
.
Place
=
Common
.
nodeInfo
[
n
].
Name
;
agv
.
Mark
=
Common
.
nodeInfo
[
nodeIdx
].
Mark
;
//agv.CloseDoor = false;
rtn
=
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"Move"
+
agv
.
Place
]);
if
(
rtn
)
{
agv
.
CloseDoor
=
false
;
Common
.
nodeInfo
[
n
].
AgvName
=
agv
.
Name
;
agv
.
TaskSend
=
true
;
//_mark.Add(Common.nodeInfo[nodeIdx].Mark);
MarkAdd
(
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
Common
.
log
.
OutString
(
"Mark缓存 "
+
string
.
Join
(
","
,
Marks
.
ToArray
()));
log
=
string
.
Format
(
"{0} Move To {1}[{2}] [{3}]"
,
agv
.
Name
,
agv
.
Place
,
Common
.
nodeInfo
[
nodeIdx
].
Action
.
ToString
(),
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
mir
.
State_Ready
(
agv
);
Common
.
server
.
NodeRefresh
(
n
);
}
else
{
agv
.
TaskSend
=
false
;
log
=
string
.
Format
(
"{0} Move To {1} 失败"
,
agv
.
Name
,
agv
.
Place
);
//防止上一个任务已执行但返回失败时,删除任务
//Common.mir.Del_Mission(agv);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
}
//_mark.Add(Common.nodeInfo[nodeIdx].Mark);
//Common.log.OutString("Mark缓存 " + string.Join(",", _mark.ToArray()));
//Common.nodeInfo[n].AgvName = agv.Name;
//agv.Place = Common.nodeInfo[n].Name;
//agv.Mark = Common.nodeInfo[nodeIdx].Mark;
//rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Move" + agv.Place]);
//log = string.Format("{0} Move {1} {2} {3}", agv.Name, agv.Place, Common.nodeInfo[nodeIdx].Action.ToString(), Common.nodeInfo[nodeIdx].Mark);
//_mark.Add(Common.nodeInfo[nodeIdx].Mark);
//Common.log.OutInfo(log);
//Common.log.OutString("Mark缓存 " + string.Join(",", _mark.ToArray()));
//Common.log.OutTextBox(log);
//rtn = Common.mir.State_Ready(agv);
//Common.nodeInfo[n].AgvName = agv.Name;
//Common.server.NodeRefresh(n);
//agv.Place = Common.nodeInfo[n].Name;
//agv.Mark = Common.nodeInfo[nodeIdx].Mark;
//rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Move" + agv.Place]);
AgvChanged
?.
Invoke
(
agvIdx
);
//log = string.Format("{0} Move {1} {2} {3}", agv.Name, agv.Place, Common.nodeInfo[nodeIdx].Action.ToString(), Common.nodeInfo[nodeIdx].Mark);
return
;
//Common.log.OutInfo(log);
//Common.log.OutTextBox(log);
//rtn = Common.mir.State_Ready(agv);
//Common.server.NodeRefresh(n);
AgvChanged
?.
Invoke
(
agvIdx
);
return
;
}
}
}
}
}
else
else
{
{
...
@@ -494,7 +589,7 @@ namespace BLL
...
@@ -494,7 +589,7 @@ namespace BLL
for
(
int
i
=
0
;
i
<
Common
.
nodeInfo
.
Count
;
i
++)
for
(
int
i
=
0
;
i
<
Common
.
nodeInfo
.
Count
;
i
++)
{
{
if
(
Common
.
nodeInfo
[
i
].
Action
==
ClientAction
.
NeedLeave
&&
Common
.
nodeInfo
[
i
].
Name
!=
"A4"
&&
if
(
Common
.
nodeInfo
[
i
].
Action
==
ClientAction
.
NeedLeave
&&
Common
.
nodeInfo
[
i
].
Name
!=
"A4"
&&
Common
.
nodeInfo
[
i
].
AgvName
==
""
&&
Common
.
nodeInfo
[
i
].
IsUse
)
Common
.
nodeInfo
[
i
].
Name
!=
"A7"
&&
Common
.
nodeInfo
[
i
].
AgvName
==
""
&&
Common
.
nodeInfo
[
i
].
IsUse
)
{
{
switch
(
Common
.
nodeInfo
[
i
].
Level
)
switch
(
Common
.
nodeInfo
[
i
].
Level
)
{
{
...
@@ -578,7 +673,17 @@ namespace BLL
...
@@ -578,7 +673,17 @@ namespace BLL
break
;
break
;
}
}
}
}
else
if
(
Common
.
nodeInfo
[
node
[
i
]].
Name
==
"C2"
||
Common
.
nodeInfo
[
node
[
i
]].
Name
==
"C4"
||
Common
.
nodeInfo
[
node
[
i
]].
Name
==
"C6"
)
//C2,4,6准备出料,C7,A2需要料
else
if
(
Common
.
nodeInfo
[
node
[
i
]].
Name
==
"A7"
&&
Common
.
nodeInfo
[
node
[
i
]].
RFID
.
StartsWith
(
"B"
))
//C7入料
{
int
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"C7"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
//入料口有一个没有占用
if
(
n
>
-
1
)
{
nodeIdx
=
node
[
i
];
break
;
}
}
else
if
(
Common
.
nodeInfo
[
node
[
i
]].
Name
==
"C2"
||
Common
.
nodeInfo
[
node
[
i
]].
Name
==
"C4"
||
Common
.
nodeInfo
[
node
[
i
]].
Name
==
"C6"
)
//C2,4,6准备出空架子,A2需要料
{
{
int
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"C7"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
int
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"C7"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
if
(
n
==
-
1
)
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A2"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
if
(
n
==
-
1
)
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A2"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
...
@@ -589,9 +694,9 @@ namespace BLL
...
@@ -589,9 +694,9 @@ namespace BLL
break
;
break
;
}
}
}
}
else
if
(
Common
.
nodeInfo
[
node
[
i
]].
Name
==
"C8"
)
//C8出往A
2
else
if
(
Common
.
nodeInfo
[
node
[
i
]].
Name
==
"C8"
)
//C8出往A
8
{
{
int
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A
2
"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
int
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A
8
"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
//入料口没有占用
//入料口没有占用
if
(
n
>
-
1
)
if
(
n
>
-
1
)
{
{
...
@@ -719,6 +824,7 @@ namespace BLL
...
@@ -719,6 +824,7 @@ namespace BLL
//小车进料
//小车进料
case
"A1"
:
case
"A1"
:
case
"A4"
:
case
"A4"
:
case
"A7"
:
case
"C2"
:
case
"C2"
:
case
"C4"
:
case
"C4"
:
case
"C6"
:
case
"C6"
:
...
@@ -752,6 +858,7 @@ namespace BLL
...
@@ -752,6 +858,7 @@ namespace BLL
//出料
//出料
case
"A2"
:
case
"A2"
:
case
"A3"
:
case
"A3"
:
case
"A8"
:
case
"C1"
:
case
"C1"
:
case
"C3"
:
case
"C3"
:
case
"C5"
:
case
"C5"
:
...
@@ -974,6 +1081,8 @@ namespace BLL
...
@@ -974,6 +1081,8 @@ namespace BLL
rtn
=
A1Enter
(
agv
);
break
;
rtn
=
A1Enter
(
agv
);
break
;
case
"A4"
:
case
"A4"
:
rtn
=
A4Enter
(
agv
);
break
;
rtn
=
A4Enter
(
agv
);
break
;
case
"A7"
:
rtn
=
A7Enter
(
agv
);
break
;
case
"B1"
:
case
"B1"
:
case
"B2"
:
case
"B2"
:
case
"B3"
:
case
"B3"
:
...
@@ -1009,6 +1118,10 @@ namespace BLL
...
@@ -1009,6 +1118,10 @@ namespace BLL
}
}
}
}
/// <summary>
/// 料架离开小车完成【空车】
/// </summary>
/// <param name="agvIdx"></param>
private
void
StatusFinishLeave
(
int
agvIdx
)
private
void
StatusFinishLeave
(
int
agvIdx
)
{
{
try
try
...
@@ -1027,6 +1140,8 @@ namespace BLL
...
@@ -1027,6 +1140,8 @@ namespace BLL
rtn
=
A2Leave
(
agv
);
break
;
rtn
=
A2Leave
(
agv
);
break
;
case
"A3"
:
case
"A3"
:
rtn
=
A3Leave
(
agv
);
break
;
rtn
=
A3Leave
(
agv
);
break
;
case
"A8"
:
rtn
=
A8Leave
(
agv
);
break
;
case
"C1"
:
case
"C1"
:
rtn
=
C1Leave
(
agv
);
break
;
rtn
=
C1Leave
(
agv
);
break
;
case
"C3"
:
case
"C3"
:
...
@@ -1129,7 +1244,7 @@ namespace BLL
...
@@ -1129,7 +1244,7 @@ namespace BLL
}
}
/// <summary>
/// <summary>
///
小车进入A1
///
【满车】VMI A1出带料的料架/料串
/// </summary>
/// </summary>
/// <param name="agv"></param>
/// <param name="agv"></param>
/// <returns></returns>
/// <returns></returns>
...
@@ -1141,7 +1256,7 @@ namespace BLL
...
@@ -1141,7 +1256,7 @@ namespace BLL
if
(
agv
.
RFID
.
Length
==
0
)
//读不到RFID的放到A2
if
(
agv
.
RFID
.
Length
==
0
)
//读不到RFID的放到A2
{
{
log
=
agv
.
Name
+
" 没有读到RFID MoveA2"
;
log
=
agv
.
Name
+
"
A7出料架,"
+
"
没有读到RFID MoveA2"
;
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
log
.
OutTextBox
(
log
);
rtn
=
FindNeedEnter
(
agv
,
"A2"
);
rtn
=
FindNeedEnter
(
agv
,
"A2"
);
...
@@ -1159,21 +1274,21 @@ namespace BLL
...
@@ -1159,21 +1274,21 @@ namespace BLL
}
}
}
}
}
}
else
if
(
agv
.
RFID
[
0
]
==
'A'
)
//包装料架
else
if
(
agv
.
RFID
[
0
]
==
'A'
)
//包装料
入库料
架
{
{
nodeIdx
=
FindAreaBEnter
();
nodeIdx
=
FindAreaBEnter
();
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
Common
.
log
.
OutInfo
(
agv
.
Name
+
" A料架,去B区"
);
rtn
=
MoveNode
(
agv
,
nodeIdx
);
rtn
=
MoveNode
(
agv
,
nodeIdx
);
if
(
rtn
)
if
(
rtn
)
{
{
agv
.
NextMission
=
""
;
agv
.
NextMission
=
""
;
Common
.
server
.
EnterShelf
(
agv
);
Common
.
server
.
EnterShelf
(
agv
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" A1出料架["
+
agv
.
RFID
+
"],去["
+
Common
.
nodeInfo
[
nodeIdx
].
Name
+
"]入库"
);
}
}
else
else
{
{
agv
.
NextMission
=
"B区"
;
agv
.
NextMission
=
Common
.
nodeInfo
[
nodeIdx
].
Name
;
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
}
}
}
}
...
@@ -1182,7 +1297,7 @@ namespace BLL
...
@@ -1182,7 +1297,7 @@ namespace BLL
if
(!
agv
.
StandbyTemp
)
if
(!
agv
.
StandbyTemp
)
{
{
agv
.
StandbyTemp
=
true
;
agv
.
StandbyTemp
=
true
;
log
=
agv
.
Name
+
" B区暂时没有位置"
;
log
=
agv
.
Name
+
"
A1出料架["
+
agv
.
RFID
+
"]
B区暂时没有位置"
;
agv
.
NextMission
=
"B区"
;
agv
.
NextMission
=
"B区"
;
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
...
@@ -1191,20 +1306,20 @@ namespace BLL
...
@@ -1191,20 +1306,20 @@ namespace BLL
}
}
}
}
else
if
(
agv
.
RFID
[
0
]
==
'B'
)
//料串
else
if
(
agv
.
RFID
[
0
]
==
'B'
)
//料串
入库
{
{
nodeIdx
=
FindAreaC
();
nodeIdx
=
FindAreaC
();
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
Common
.
log
.
OutInfo
(
agv
.
Name
+
" B料架,去C区"
);
rtn
=
MoveNode
(
agv
,
nodeIdx
);
rtn
=
MoveNode
(
agv
,
nodeIdx
);
if
(
rtn
)
if
(
rtn
)
{
{
agv
.
NextMission
=
""
;
agv
.
NextMission
=
""
;
Common
.
log
.
OutInfo
(
agv
.
Name
+
" A1出料串["
+
agv
.
RFID
+
"],去["
+
Common
.
nodeInfo
[
nodeIdx
].
Name
+
"]入库"
);
}
}
else
else
{
{
agv
.
NextMission
=
"C区"
;
agv
.
NextMission
=
Common
.
nodeInfo
[
nodeIdx
].
Name
;
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
}
}
}
}
...
@@ -1213,7 +1328,7 @@ namespace BLL
...
@@ -1213,7 +1328,7 @@ namespace BLL
if
(!
agv
.
StandbyTemp
)
if
(!
agv
.
StandbyTemp
)
{
{
agv
.
StandbyTemp
=
true
;
agv
.
StandbyTemp
=
true
;
log
=
agv
.
Name
+
" C区暂时没有位置"
;
log
=
agv
.
Name
+
"
A1出料串["
+
agv
.
RFID
+
"]
C区暂时没有位置"
;
agv
.
NextMission
=
"C区"
;
agv
.
NextMission
=
"C区"
;
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
...
@@ -1224,7 +1339,7 @@ namespace BLL
...
@@ -1224,7 +1339,7 @@ namespace BLL
}
}
else
else
{
{
log
=
agv
.
Name
+
" 没有读到RFID MoveA2"
;
log
=
agv
.
Name
+
"
A1出料架,"
+
"
没有读到RFID MoveA2"
;
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
log
.
OutTextBox
(
log
);
rtn
=
FindNeedEnter
(
agv
,
"A2"
);
rtn
=
FindNeedEnter
(
agv
,
"A2"
);
...
@@ -1249,7 +1364,188 @@ namespace BLL
...
@@ -1249,7 +1364,188 @@ namespace BLL
}
}
/// <summary>
/// <summary>
/// 小车进入A2
/// 【满车】分盘线A7出空料架/料串
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
A7Enter
(
Agv_Info
agv
)
{
string
log
;
int
nodeIdx
;
bool
rtn
=
false
;
if
(
agv
.
RFID
.
Length
==
0
)
//读不到RFID的放到A8
{
log
=
agv
.
Name
+
" A7出料架,"
+
"没有读到RFID MoveA8"
;
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
rtn
=
FindNeedEnter
(
agv
,
"A8"
);
if
(
rtn
)
{
agv
.
NextMission
=
""
;
}
else
{
if
(!
agv
.
StandbyTemp
)
{
agv
.
NextMission
=
"A8"
;
agv
.
StandbyTemp
=
true
;
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
}
}
}
else
if
(
agv
.
RFID
[
0
]
==
'A'
)
//包装料架
{
int
idx
=
Common
.
agvInfo
.
FindIndex
(
s
=>
s
.
Name
.
Equals
(
agv
.
Name
));
rtn
=
FindAreaBOutStore
(
idx
,
out
ResultType
resultType
);
if
(
rtn
)
{
Common
.
log
.
OutInfo
(
agv
.
Name
+
" A7出料架["
+
agv
.
RFID
+
"],去B区"
);
if
(
rtn
)
{
agv
.
NextMission
=
""
;
//Common.server.EnterShelf(agv);
}
else
{
agv
.
NextMission
=
"B区"
;
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
}
}
else
{
if
(!
agv
.
StandbyTemp
)
{
agv
.
StandbyTemp
=
true
;
log
=
agv
.
Name
+
" A7出料架["
+
agv
.
RFID
+
"] B区暂时没有位置"
;
agv
.
NextMission
=
"B区"
;
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
}
}
}
else
if
(
agv
.
RFID
[
0
]
==
'B'
)
//出空料串
{
nodeIdx
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
.
Equals
(
"C7"
)
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
if
(
nodeIdx
>
-
1
)
{
Common
.
log
.
OutInfo
(
agv
.
Name
+
"A7出料串["
+
agv
.
RFID
+
"],去C7"
);
rtn
=
MoveNode
(
agv
,
nodeIdx
);
if
(
rtn
)
{
agv
.
NextMission
=
""
;
}
else
{
agv
.
NextMission
=
"C7"
;
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
}
}
else
{
int
idx
=
Common
.
agvInfo
.
FindIndex
(
s
=>
s
.
Name
.
Equals
(
agv
.
Name
));
rtn
=
FindAreaBOutStore
(
idx
,
out
ResultType
resultType
);
if
(!
rtn
&&
resultType
.
Equals
(
ResultType
.
NoEmptyShelf
))
{
rtn
=
FindNeedEnter
(
agv
,
"A8"
);
if
(
rtn
)
{
agv
.
NextMission
=
""
;
Common
.
log
.
OutInfo
(
agv
.
Name
+
" A7出料串["
+
agv
.
RFID
+
"],C7不需要且B区有出库任务,去A8"
);
//Common.server.EnterShelf(agv);
}
else
{
ClientNode
a8Node
=
Common
.
nodeInfo
.
Find
(
s
=>
s
.
Name
.
Equals
(
"A8"
));
log
=
string
.
Format
(
"{0} A7出料串[{1}],C7不需要,B区有出库任务。{2}已满,不可将A7料串放到{2}[ClientAction={3}]。需要人工干预"
,
agv
.
Name
,
agv
.
RFID
,
a8Node
.
Name
,
a8Node
.
Action
.
ToString
());
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
//agv.NextMission = "C7";
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
}
}
else
if
(!
rtn
)
{
if
(!
agv
.
StandbyTemp
)
{
agv
.
StandbyTemp
=
true
;
log
=
agv
.
Name
+
" A7出料串["
+
agv
.
RFID
+
"] C7暂时没有位置"
;
agv
.
NextMission
=
"C7"
;
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
}
}
}
}
else
{
log
=
agv
.
Name
+
" A7出料架,"
+
"没有读到RFID MoveA8"
;
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
rtn
=
FindNeedEnter
(
agv
,
"A8"
);
if
(
rtn
)
{
agv
.
NextMission
=
""
;
}
else
{
if
(!
agv
.
StandbyTemp
)
{
agv
.
StandbyTemp
=
true
;
agv
.
NextMission
=
"A8"
;
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
}
}
}
//if (rtn) agv.NextMission = "";
return
rtn
;
}
/// <summary>
/// 【空车】分盘线A8进料架/料串
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
A8Leave
(
Agv_Info
agv
)
{
bool
rtn
=
false
;
//添加包装料仓优先
int
agvIdx
=
Common
.
agvInfo
.
FindIndex
(
s
=>
s
.
Name
==
agv
.
Name
);
rtn
=
FindAreaBOutStore
(
agvIdx
,
out
ResultType
resultType
);
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在A8送完料架,检测到B区有出库任务,开始执行"
);
if
(!
rtn
&&
resultType
.
Equals
(
ResultType
.
NoEmptyShelf
))
{
rtn
=
FindNeedEnter
(
agv
,
"A7"
);
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在A8送完料架,检测到B区有出库任务,去A7"
);
}
if
(!
rtn
)
{
rtn
=
FindNeedLeave
(
agv
,
"A1"
);
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在A8送完料架,检测到A1有出料架/任务,开始执行"
);
}
if
(!
rtn
)
{
rtn
=
MoveStandby
(
agv
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" MoveStandby "
+
rtn
.
ToString
());
}
return
rtn
;
}
/// <summary>
/// 【空车】料架离开小车,进入A2
/// </summary>
/// </summary>
/// <param name="agv"></param>
/// <param name="agv"></param>
/// <returns></returns>
/// <returns></returns>
...
@@ -1259,13 +1555,15 @@ namespace BLL
...
@@ -1259,13 +1555,15 @@ namespace BLL
//添加包装料仓优先
//添加包装料仓优先
int
agvIdx
=
Common
.
agvInfo
.
FindIndex
(
s
=>
s
.
Name
==
agv
.
Name
);
int
agvIdx
=
Common
.
agvInfo
.
FindIndex
(
s
=>
s
.
Name
==
agv
.
Name
);
rtn
=
FindAreaBLeave
(
agvIdx
);
rtn
=
FindAreaBOutStoreAndNeedLeave
(
agvIdx
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" B区 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在A2送完料架,检测到B区有出库/出料架任务,开始执行"
);
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"A1"
);
rtn
=
FindNeedLeave
(
agv
,
"A1"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" A1 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在A2送完料架,检测到A1有出料架/任务,开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
...
@@ -1277,30 +1575,50 @@ namespace BLL
...
@@ -1277,30 +1575,50 @@ namespace BLL
}
}
/// <summary>
/// 【空车】料架离开小车,进入A3
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
A3Leave
(
Agv_Info
agv
)
private
bool
A3Leave
(
Agv_Info
agv
)
{
{
bool
rtn
=
FindNeedLeave
(
agv
,
"C8"
);
bool
rtn
=
FindNeedLeave
(
agv
,
"C8"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C8 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在A3送完料架,检测到C8出料串任务,开始执行"
);
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C2"
);
rtn
=
FindNeedLeave
(
agv
,
"C2"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C2 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在A3送完料架,检测到C2出料串任务,开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
MoveStandby
(
agv
);
rtn
=
MoveStandby
(
agv
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" MoveStandby "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在A3送完料架,C8,C2暂无任务,回待机位"
);
}
}
return
rtn
;
return
rtn
;
}
}
/// <summary>
/// A4出料架,用于包装仓出库【满车】
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
A4Enter
(
Agv_Info
agv
)
private
bool
A4Enter
(
Agv_Info
agv
)
{
{
return
FindNeedEnterWithMark
(
agv
);
return
FindNeedEnterWithMark
(
agv
);
}
}
/// <summary>
/// B区域出料架,【满车】
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
B123456Enter
(
Agv_Info
agv
)
private
bool
B123456Enter
(
Agv_Info
agv
)
{
{
int
nodeIdx
;
int
nodeIdx
;
...
@@ -1321,10 +1639,10 @@ namespace BLL
...
@@ -1321,10 +1639,10 @@ namespace BLL
string
[]
ss
=
agv
.
Mark
.
Split
(
','
);
string
[]
ss
=
agv
.
Mark
.
Split
(
','
);
switch
(
ss
[
1
])
switch
(
ss
[
1
])
{
{
case
"urgent"
:
name
=
"A
2
"
;
break
;
//紧急
case
"urgent"
:
name
=
"A
8
"
;
break
;
//紧急
case
"cut"
:
name
=
"A
2
"
;
break
;
//分盘
case
"cut"
:
name
=
"A
8
"
;
break
;
//分盘
case
"pack"
:
name
=
"A3"
;
break
;
//包装
case
"pack"
:
name
=
"A3"
;
break
;
//包装
default
:
name
=
"A
2
"
;
break
;
default
:
name
=
"A
8
"
;
break
;
}
}
rtn
=
FindNeedEnter
(
agv
,
name
);
rtn
=
FindNeedEnter
(
agv
,
name
);
if
(
rtn
)
if
(
rtn
)
...
@@ -1392,35 +1710,49 @@ namespace BLL
...
@@ -1392,35 +1710,49 @@ namespace BLL
}
}
}
}
/// <summary>
/// B区域进料架,【空车】
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
B123456Leave
(
Agv_Info
agv
)
private
bool
B123456Leave
(
Agv_Info
agv
)
{
{
bool
rtn
=
false
;
bool
rtn
=
false
;
//添加包装料仓优先
//添加包装料仓优先
int
agvIdx
=
Common
.
agvInfo
.
FindIndex
(
s
=>
s
.
Name
==
agv
.
Name
);
int
agvIdx
=
Common
.
agvInfo
.
FindIndex
(
s
=>
s
.
Name
==
agv
.
Name
);
rtn
=
FindAreaBLeave
(
agvIdx
);
rtn
=
FindAreaBOutStoreAndNeedLeave
(
agvIdx
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" B区 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在B区域送完料架,检测到B区域有出库/出料架任务,开始执行"
);
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C8"
);
rtn
=
FindNeedLeave
(
agv
,
"C8"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C8 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在B区域送完料架,检测到C8出料串任务,开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C2"
);
rtn
=
FindNeedLeave
(
agv
,
"C2"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C2 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在B区域送完料架,检测到C2出料串任务,开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
MoveStandby
(
agv
);
rtn
=
MoveStandby
(
agv
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" MoveStandby "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在B区域送完料架,C8,C2暂无任务,回待机位"
);
}
}
return
rtn
;
return
rtn
;
}
}
/// <summary>
/// 【空车】料串离开小车,进入C1
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
C1Leave
(
Agv_Info
agv
)
private
bool
C1Leave
(
Agv_Info
agv
)
{
{
bool
rtn
=
false
;
bool
rtn
=
false
;
...
@@ -1428,11 +1760,13 @@ namespace BLL
...
@@ -1428,11 +1760,13 @@ namespace BLL
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C4"
);
rtn
=
FindNeedLeave
(
agv
,
"C4"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C4 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C1送完料串,检测到C4出料串任务[A2可以进料],开始执行"
);
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C6 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C1送完料串,检测到C6出料串任务[A2可以进料],开始执行"
);
}
}
}
}
...
@@ -1442,11 +1776,13 @@ namespace BLL
...
@@ -1442,11 +1776,13 @@ namespace BLL
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C4"
);
rtn
=
FindNeedLeave
(
agv
,
"C4"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C4 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C1送完料串,检测到C4出料串任务[A2不可以进料,C7可以进料],开始执行"
);
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C6 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C1送完料串,检测到C6出料串任务[A2不可以进料,C7可以进料],开始执行"
);
}
}
}
}
}
}
...
@@ -1454,22 +1790,30 @@ namespace BLL
...
@@ -1454,22 +1790,30 @@ namespace BLL
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"A1"
);
rtn
=
FindNeedLeave
(
agv
,
"A1"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" A1 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C1送完料串,检测到A1出料架/料串任务,开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"D2"
);
rtn
=
FindNeedLeave
(
agv
,
"D2"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" D2 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C1送完料串,检测到D2出料串任务[A1没有出料串任务],开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
MoveStandby
(
agv
);
rtn
=
MoveStandby
(
agv
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" MoveStandby "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C1送完料串,C4,C6,A1,D2暂无任务,回待机位"
);
}
}
return
rtn
;
return
rtn
;
}
}
/// <summary>
/// 【空车】料串离开小车,进入C3
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
C3Leave
(
Agv_Info
agv
)
private
bool
C3Leave
(
Agv_Info
agv
)
{
{
bool
rtn
=
false
;
bool
rtn
=
false
;
...
@@ -1477,11 +1821,13 @@ namespace BLL
...
@@ -1477,11 +1821,13 @@ namespace BLL
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C4"
);
rtn
=
FindNeedLeave
(
agv
,
"C4"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C4 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C3送完料串,检测到C4出料串任务[A2可以进料],开始执行"
);
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C6 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C3送完料串,检测到C6出料串任务[A2可以进料],开始执行"
);
}
}
}
}
...
@@ -1491,11 +1837,13 @@ namespace BLL
...
@@ -1491,11 +1837,13 @@ namespace BLL
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C4"
);
rtn
=
FindNeedLeave
(
agv
,
"C4"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C4 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C3送完料串,检测到C4出料串任务[A2不可以进料,C7可以进料],开始执行"
);
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C6 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C3送完料串,检测到C6出料串任务[A2不可以进料,C7可以进料],开始执行"
);
}
}
}
}
}
}
...
@@ -1504,17 +1852,20 @@ namespace BLL
...
@@ -1504,17 +1852,20 @@ namespace BLL
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"A1"
);
rtn
=
FindNeedLeave
(
agv
,
"A1"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" A1 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C3送完料串,检测到A1出料架/料串任务,开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"D2"
);
rtn
=
FindNeedLeave
(
agv
,
"D2"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" D2 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C3送完料串,检测到D2出料串任务[A1没有出料串任务],开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
MoveStandby
(
agv
);
rtn
=
MoveStandby
(
agv
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" MoveStandby "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C3送完料串,C4,C6,A1,D2暂无任务,回待机位"
);
}
}
...
@@ -1526,6 +1877,11 @@ namespace BLL
...
@@ -1526,6 +1877,11 @@ namespace BLL
return
rtn
;
return
rtn
;
}
}
/// <summary>
/// 【空车】料串离开小车,进入C5
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
C5Leave
(
Agv_Info
agv
)
private
bool
C5Leave
(
Agv_Info
agv
)
{
{
bool
rtn
=
false
;
bool
rtn
=
false
;
...
@@ -1533,7 +1889,8 @@ namespace BLL
...
@@ -1533,7 +1889,8 @@ namespace BLL
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C6 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C5送完料串,检测到C6出料串任务[A2可以进料],开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
...
@@ -1542,24 +1899,28 @@ namespace BLL
...
@@ -1542,24 +1899,28 @@ namespace BLL
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
rtn
=
FindNeedLeave
(
agv
,
"C6"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C6 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C5送完料串,检测到C6出料串任务[A2不可以进料,C7可以进料],开始执行"
);
}
}
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"A1"
);
rtn
=
FindNeedLeave
(
agv
,
"A1"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" A1 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C5送完料串,检测到A1出料架/料串任务,开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"D2"
);
rtn
=
FindNeedLeave
(
agv
,
"D2"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" D2 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C5送完料串,检测到D2出料串任务[A1没有出料串任务],开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
MoveStandby
(
agv
);
rtn
=
MoveStandby
(
agv
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" MoveStandby "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C3送完料串,C6,A1,D2暂无任务,回待机位"
);
}
}
//bool rtn = FindNeedLeave(agv, "C6");
//bool rtn = FindNeedLeave(agv, "C6");
...
@@ -1568,6 +1929,11 @@ namespace BLL
...
@@ -1568,6 +1929,11 @@ namespace BLL
return
rtn
;
return
rtn
;
}
}
/// <summary>
/// 【空车】料串离开小车,进入C7
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
C7Leave
(
Agv_Info
agv
)
private
bool
C7Leave
(
Agv_Info
agv
)
{
{
bool
rtn
=
false
;
bool
rtn
=
false
;
...
@@ -1575,17 +1941,20 @@ namespace BLL
...
@@ -1575,17 +1941,20 @@ namespace BLL
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C8"
);
rtn
=
FindNeedLeave
(
agv
,
"C8"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C8 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C7送完料串,检测到C8出料串任务[A2可以进料],开始执行"
);
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C2"
);
rtn
=
FindNeedLeave
(
agv
,
"C2"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C2 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C7送完料串,检测到C2出料串任务[A2可以进料,C8无出料串任务],开始执行"
);
}
}
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
MoveStandby
(
agv
);
rtn
=
MoveStandby
(
agv
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" MoveStandby "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C7送完料串,C8,C2暂无任务,回待机位"
);
}
}
//bool rtn = FindNeedLeave(agv, "C8");
//bool rtn = FindNeedLeave(agv, "C8");
...
@@ -1594,6 +1963,11 @@ namespace BLL
...
@@ -1594,6 +1963,11 @@ namespace BLL
return
rtn
;
return
rtn
;
}
}
/// <summary>
/// 【满车】料串进入小车,离开C2,4,6
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
C246Enter
(
Agv_Info
agv
)
private
bool
C246Enter
(
Agv_Info
agv
)
{
{
string
log
;
string
log
;
...
@@ -1604,6 +1978,7 @@ namespace BLL
...
@@ -1604,6 +1978,7 @@ namespace BLL
if
(
rtn
)
if
(
rtn
)
{
{
agv
.
NextMission
=
""
;
agv
.
NextMission
=
""
;
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C2/4/6进入空料串,检测到C7需要料串,开始执行"
);
return
true
;
return
true
;
}
}
...
@@ -1611,6 +1986,7 @@ namespace BLL
...
@@ -1611,6 +1986,7 @@ namespace BLL
if
(
rtn
)
if
(
rtn
)
{
{
agv
.
NextMission
=
""
;
agv
.
NextMission
=
""
;
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C2/4/6进入空料串,检测到D1需要料串,开始执行"
);
return
true
;
return
true
;
}
}
...
@@ -1618,6 +1994,7 @@ namespace BLL
...
@@ -1618,6 +1994,7 @@ namespace BLL
if
(
rtn
)
if
(
rtn
)
{
{
agv
.
NextMission
=
""
;
agv
.
NextMission
=
""
;
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C2/4/6进入空料串,检测到A2需要料串,开始执行"
);
return
true
;
return
true
;
}
}
...
@@ -1625,26 +2002,33 @@ namespace BLL
...
@@ -1625,26 +2002,33 @@ namespace BLL
{
{
agv
.
StandbyTemp
=
true
;
agv
.
StandbyTemp
=
true
;
agv
.
NextMission
=
"A2"
;
agv
.
NextMission
=
"A2"
;
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
rtn
=
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在C2/4/6进入空料串,C7,D1,A2不需要料串,回待机位"
);
return
false
;
return
false
;
}
}
return
false
;
return
false
;
}
}
/// <summary>
/// 【满车】料串进入小车,离开C8
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
C8Enter
(
Agv_Info
agv
)
private
bool
C8Enter
(
Agv_Info
agv
)
{
{
string
name
;
string
name
;
switch
(
agv
.
Mark
)
switch
(
agv
.
Mark
)
{
{
case
"urgent"
:
name
=
"A
2
"
;
break
;
//紧急
case
"urgent"
:
name
=
"A
8
"
;
break
;
//紧急
case
"cut"
:
name
=
"A
2
"
;
break
;
//分盘
case
"cut"
:
name
=
"A
8
"
;
break
;
//分盘
default
:
name
=
"A
2
"
;
break
;
default
:
name
=
"A
8
"
;
break
;
}
}
Common
.
log
.
OutInfo
(
"C8Enter Mark="
+
agv
.
Mark
);
Common
.
log
.
OutInfo
(
"C8Enter Mark="
+
agv
.
Mark
);
bool
rtn
=
FindNeedEnter
(
agv
,
name
);
bool
rtn
=
FindNeedEnter
(
agv
,
name
);
if
(
rtn
)
if
(
rtn
)
{
{
agv
.
NextMission
=
""
;
agv
.
NextMission
=
""
;
Common
.
log
.
OutInfo
(
"C8出满料串到A8 [Mark="
+
agv
.
Mark
+
"]"
);
}
}
else
else
{
{
...
@@ -1652,7 +2036,9 @@ namespace BLL
...
@@ -1652,7 +2036,9 @@ namespace BLL
{
{
agv
.
StandbyTemp
=
true
;
agv
.
StandbyTemp
=
true
;
agv
.
NextMission
=
name
;
agv
.
NextMission
=
name
;
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
rtn
=
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
if
(
rtn
)
Common
.
log
.
OutInfo
(
"C8出满料串 [Mark="
+
agv
.
Mark
+
"],A8暂时无法进入,先回待机位"
);
}
}
}
}
...
@@ -1660,34 +2046,47 @@ namespace BLL
...
@@ -1660,34 +2046,47 @@ namespace BLL
}
}
/// <summary>
/// 【空车】料串离开小车,进入D1(点料机入口)
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
D1Leave
(
Agv_Info
agv
)
private
bool
D1Leave
(
Agv_Info
agv
)
{
{
bool
rtn
=
false
;
bool
rtn
=
false
;
//添加包装料仓优先
//添加包装料仓优先
int
agvIdx
=
Common
.
agvInfo
.
FindIndex
(
s
=>
s
.
Name
==
agv
.
Name
);
int
agvIdx
=
Common
.
agvInfo
.
FindIndex
(
s
=>
s
.
Name
==
agv
.
Name
);
rtn
=
FindAreaBLeave
(
agvIdx
);
rtn
=
FindAreaBOutStoreAndNeedLeave
(
agvIdx
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" B区 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在D1送完料串,检测到B区域出库/出料架,开始执行"
);
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C8"
);
rtn
=
FindNeedLeave
(
agv
,
"C8"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C8 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在D1送完料串,检测到C8出料串,开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
FindNeedLeave
(
agv
,
"C2"
);
rtn
=
FindNeedLeave
(
agv
,
"C2"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C2 "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在D1送完料串,检测到C2出料串,开始执行"
);
}
}
if
(!
rtn
)
if
(!
rtn
)
{
{
rtn
=
MoveStandby
(
agv
);
rtn
=
MoveStandby
(
agv
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" MoveStandby "
+
rtn
.
ToString
());
if
(
rtn
)
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在D1送完料串,C8,C2无出料串任务,回待机位"
);
}
}
return
rtn
;
return
rtn
;
}
}
/// <summary>
/// 【满车】料串进入小车,离开D2(点料机出口)
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private
bool
D2Enter
(
Agv_Info
agv
)
private
bool
D2Enter
(
Agv_Info
agv
)
{
{
string
log
;
string
log
;
...
@@ -1697,11 +2096,11 @@ namespace BLL
...
@@ -1697,11 +2096,11 @@ namespace BLL
nodeIdx
=
FindAreaC
();
nodeIdx
=
FindAreaC
();
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
Common
.
log
.
OutInfo
(
agv
.
Name
+
" B料架,去C区"
);
rtn
=
MoveNode
(
agv
,
nodeIdx
);
rtn
=
MoveNode
(
agv
,
nodeIdx
);
if
(
rtn
)
if
(
rtn
)
{
{
agv
.
NextMission
=
""
;
agv
.
NextMission
=
""
;
Common
.
log
.
OutInfo
(
agv
.
Name
+
" 在D2进入料串,送往C区"
);
}
}
else
else
{
{
...
@@ -1714,7 +2113,7 @@ namespace BLL
...
@@ -1714,7 +2113,7 @@ namespace BLL
if
(!
agv
.
StandbyTemp
)
if
(!
agv
.
StandbyTemp
)
{
{
agv
.
StandbyTemp
=
true
;
agv
.
StandbyTemp
=
true
;
log
=
agv
.
Name
+
" C区暂时没有位置"
;
log
=
agv
.
Name
+
"
D2[点料机]出料架
C区暂时没有位置"
;
agv
.
NextMission
=
"C区"
;
agv
.
NextMission
=
"C区"
;
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"MoveStandbyTemp"
]);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
...
@@ -1725,6 +2124,7 @@ namespace BLL
...
@@ -1725,6 +2124,7 @@ namespace BLL
return
rtn
;
return
rtn
;
}
}
private
int
FindAreaC
()
private
int
FindAreaC
()
{
{
//int idx;
//int idx;
...
@@ -1790,7 +2190,7 @@ namespace BLL
...
@@ -1790,7 +2190,7 @@ namespace BLL
}
}
/// <summary>
/// <summary>
/// B区域入
料
/// B区域入
库
/// </summary>
/// </summary>
/// <returns></returns>
/// <returns></returns>
private
int
FindAreaBEnter
()
private
int
FindAreaBEnter
()
...
@@ -1846,54 +2246,287 @@ namespace BLL
...
@@ -1846,54 +2246,287 @@ namespace BLL
}
}
/// <summary>
/// <summary>
/// B区域出
料
/// B区域出
库/出料架
/// </summary>
/// </summary>
/// <param name="agvIdx"></param>
/// <param name="agvIdx"></param>
/// <returns></returns>
/// <returns></returns>
private
bool
FindAreaBLeave
(
int
agvIdx
)
private
bool
FindAreaBOutStoreAndNeedLeave
(
int
agvIdx
)
{
if
(
FindAreaBOutStore
(
agvIdx
,
out
ResultType
resultType
))
return
true
;
if
(
FindAreaBNeedLeave
(
agvIdx
))
return
true
;
return
false
;
#
region
老程序
-
不用
//string log;
//int nodeIdx = -1;
//bool rtn;
//Agv_Info agv = Common.agvInfo[agvIdx];
//List<int> node = new List<int>();
//ClientNode a7Node = Common.nodeInfo.Find(s => s.Name.Equals("A7"));
//ClientNode a4Node = Common.nodeInfo.Find(s => s.Name.Equals("A4"));
//#region B区域,需要出库,先拿料架
////Mark.Length>1防止Mark为0的情况,Mark=0是VMI的进料
//nodeIdx = Common.nodeInfo.FindIndex(s => s.Action == ClientAction.NeedEnter && s.AgvName.Equals("") && s.Mark.Length > 1 && s.IsUse);
//if (nodeIdx == -1)
//{
// Common.log.OutInfo("B区没有找到NeedEnter的节点");
//}
////B区域有料需要出库
//else
//{
// int n = Marks.FindIndex(t => t == Common.nodeInfo[nodeIdx].Mark);
// //Mark没有被缓存
// if (n == -1)
// {
// n = Common.nodeInfo.FindIndex(s => s.Name == "A7" && s.Action == ClientAction.NeedLeave &&
// s.RFID.StartsWith("A") && s.AgvName.Equals("") && s.IsUse);
// //A7有空料架用于包装仓出库
// if (n > -1)
// {
// agv.Place = Common.nodeInfo[n].Name;
// agv.Mark = Common.nodeInfo[nodeIdx].Mark;
// //agv.CloseDoor = false;
// rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Move" + agv.Place]);
// if (rtn)
// {
// agv.CloseDoor = false;
// Common.nodeInfo[n].AgvName = agv.Name;
// agv.TaskSend = true;
// //_mark.Add(Common.nodeInfo[nodeIdx].Mark);
// MarkAdd(Common.nodeInfo[nodeIdx].Mark);
// Common.log.OutString("Mark缓存 " + string.Join(",", Marks.ToArray()));
// log = string.Format("{0} Move To {1}[{2}] [{3}]", agv.Name, agv.Place,
// Common.nodeInfo[nodeIdx].Action.ToString(), Common.nodeInfo[nodeIdx].Mark);
// Common.log.OutInfo(log);
// Common.log.OutTextBox(log);
// Common.mir.State_Ready(agv);
// Common.server.NodeRefresh(n);
// AgvChanged?.Invoke(agvIdx);
// return true;
// }
// else
// {
// agv.TaskSend = false;
// log = string.Format("{0} Move To {1} 失败", agv.Name, agv.Place);
// //防止上一个任务已执行但返回失败时,删除任务
// //Common.mir.Del_Mission(agv);
// Common.log.OutInfo(log);
// Common.log.OutTextBox(log);
// }
// }
// else
// {
// log = string.Format("{0}无可用料架 [ClientAction={1}] [RFID={2}]", a7Node.Name, a7Node.Action.ToString(), a7Node.RFID);
// Common.log.OutInfo(log);
// Common.log.OutTextBox(log);
// n = Common.nodeInfo.FindIndex(s => s.Name == "A4" && s.Action == ClientAction.NeedLeave && s.AgvName.Equals("") && s.IsUse);
// //A4无空架子
// if (n == -1)
// {
// nodeIdx = -1;
// log = string.Format("{0}无可用料架 [ClientAction={1}] [RFID={2}]", a4Node.Name, a4Node.Action.ToString(), a4Node.RFID);
// Common.log.OutInfo(log);
// Common.log.OutTextBox(log);
// //n = Common.nodeInfo.FindIndex(s => s.Name == "A8" && s.Action == ClientAction.NeedEnter && s.AgvName.Equals("") && s.IsUse);
// //if (n == -1)
// //{
// // ClientNode a8Node = Common.nodeInfo.Find(s => s.Name.Equals("A8"));
// // log = string.Format("A4、A7均无空架用于包装仓出库,且{0}已满,不可将A7架子放到{0}。需要人工干预 [ClientAction={1}]", a8Node.Name, a8Node.Action.ToString());
// // Common.log.OutInfo(log);
// // Common.log.OutTextBox(log);
// //}
// ////A7,A4均无空架子,可将A7的架子移动到A8
// //else
// //{
// // agv.Place = "A7";
// // //agv.Mark = Common.nodeInfo[nodeIdx].Mark;
// // //agv.CloseDoor = false;
// // rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Move" + agv.Place]);
// // if (rtn)
// // {
// // agv.CloseDoor = false;
// // Common.nodeInfo[n].AgvName = agv.Name;
// // agv.TaskSend = true;
// // //_mark.Add(Common.nodeInfo[nodeIdx].Mark);
// // //MarkAdd(Common.nodeInfo[nodeIdx].Mark);
// // log = string.Format("{0} Move To {1}[{2}] ", agv.Name, agv.Place,
// // "A7,A4无料架用与包装仓");
// // Common.log.OutInfo(log);
// // Common.log.OutTextBox(log);
// // Common.mir.State_Ready(agv);
// // Common.server.NodeRefresh(n);
// // AgvChanged?.Invoke(agvIdx);
// // return true;
// // }
// // else
// // {
// // agv.TaskSend = false;
// // log = string.Format("{0} Move To {1}失败[{2}] ", agv.Name, agv.Place,
// // "A7,A4无料架用与包装仓");
// // //防止上一个任务已执行但返回失败时,删除任务
// // //Common.mir.Del_Mission(agv);
// // Common.log.OutInfo(log);
// // Common.log.OutTextBox(log);
// // }
// //}
// }
// //A4没有被占用
// else
// {
// agv.Place = Common.nodeInfo[n].Name;
// agv.Mark = Common.nodeInfo[nodeIdx].Mark;
// //agv.CloseDoor = false;
// rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Move" + agv.Place]);
// if (rtn)
// {
// agv.CloseDoor = false;
// Common.nodeInfo[n].AgvName = agv.Name;
// agv.TaskSend = true;
// //_mark.Add(Common.nodeInfo[nodeIdx].Mark);
// MarkAdd(Common.nodeInfo[nodeIdx].Mark);
// Common.log.OutString("Mark缓存 " + string.Join(",", Marks.ToArray()));
// log = string.Format("{0} Move To {1}[{2}] [{3}]", agv.Name, agv.Place,
// Common.nodeInfo[nodeIdx].Action.ToString(), Common.nodeInfo[nodeIdx].Mark);
// Common.log.OutInfo(log);
// Common.log.OutTextBox(log);
// Common.mir.State_Ready(agv);
// Common.server.NodeRefresh(n);
// AgvChanged?.Invoke(agvIdx);
// return true;
// }
// else
// {
// agv.TaskSend = false;
// log = string.Format("{0} Move To {1} 失败", agv.Name, agv.Place);
// //防止上一个任务已执行但返回失败时,删除任务
// //Common.mir.Del_Mission(agv);
// Common.log.OutInfo(log);
// Common.log.OutTextBox(log);
// }
// }
// }
// }
// else
// {
// Common.log.OutInfo("缓存中已存在 " + Common.nodeInfo[nodeIdx].Mark);
// nodeIdx = -1;
// }
//}
//#endregion
////搜索包装仓需要出料架的节点
//for (int i = 0; i < Common.nodeInfo.Count; i++)
//{
// if (Common.nodeInfo[i].Action == ClientAction.NeedLeave && Common.nodeInfo[i].Name.StartsWith("B") &&
// Common.nodeInfo[i].AgvName == "" && Common.nodeInfo[i].IsUse)
// {
// node.Add(i);
// }
//}
////测试,临时的
////for (int i = 0; i < node.Count; i++)
////{
//// Common.log.OutString(agv.Name + " Test " + node[i] + " Name=" + Common.nodeInfo[node[i]].Name + " Mark=" + Common.nodeInfo[node[i]].Mark);
////}
//nodeIdx = -1;
//if (node.Count == 0)
//{
// nodeIdx = -1;
// Common.log.OutInfo(agv.Name + " 包装仓没有需要出料架的");
//}
//else
//{
// //按顺序出包装仓的料架
// for (int i = 0; i < node.Count; i++)
// {
// if (Common.nodeInfo[node[i]].Mark == "0")
// {
// nodeIdx = node[i];
// break;
// }
// else
// {
// //在Mark缓存中,按照先后顺序出料,只有第一个出完才能出第二个
// int idx = Marks.FindIndex(s => s == Common.nodeInfo[node[i]].Mark);
// if (idx == 0)
// {
// nodeIdx = node[i];
// break;
// }
// }
// }
// if (nodeIdx > -1)
// {
// Common.log.OutInfo("包装仓出料架: " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name + "[Mark=" + Common.nodeInfo[nodeIdx].Mark + "]");
// MoveNode(agv, nodeIdx);
// return true;
// }
//}
//return false;
#
endregion
}
/// <summary>
/// B区域出库
/// </summary>
/// <param name="agvIdx"></param>
/// <returns>true:有出库任务,并拉空架子;false:无出库任务/有出库但无空架子</returns>
private
bool
FindAreaBOutStore
(
int
agvIdx
,
out
ResultType
resultType
)
{
{
string
log
;
string
log
;
int
nodeIdx
=
-
1
;
int
nodeIdx
=
-
1
;
bool
rtn
;
bool
rtn
;
resultType
=
ResultType
.
None
;
Agv_Info
agv
=
Common
.
agvInfo
[
agvIdx
];
Agv_Info
agv
=
Common
.
agvInfo
[
agvIdx
];
List
<
int
>
node
=
new
List
<
int
>();
List
<
int
>
node
=
new
List
<
int
>();
ClientNode
a7Node
=
Common
.
nodeInfo
.
Find
(
s
=>
s
.
Name
.
Equals
(
"A7"
));
ClientNode
a4Node
=
Common
.
nodeInfo
.
Find
(
s
=>
s
.
Name
.
Equals
(
"A4"
));
//
B区域,需要出料
,先拿料架
//
B区域,需要出库
,先拿料架
//Mark.Length>1防止Mark为0的情况,Mark=0是VMI的进料
//Mark.Length>1防止Mark为0的情况,Mark=0是VMI的进料
nodeIdx
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
Mark
.
Length
>
1
&&
s
.
IsUse
);
nodeIdx
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
Mark
.
Length
>
1
&&
s
.
IsUse
);
if
(
nodeIdx
==
-
1
)
if
(
nodeIdx
==
-
1
)
{
{
Common
.
log
.
OutInfo
(
agv
.
Name
+
" B区没有找到新的
NeedEnter的节点"
);
Common
.
log
.
OutInfo
(
"B区没有找到
NeedEnter的节点"
);
}
}
//B区域有料需要出库
else
else
{
{
//Mark没有被缓存
int
n
=
Marks
.
FindIndex
(
t
=>
t
==
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
int
n
=
Marks
.
FindIndex
(
t
=>
t
==
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
//Mark没有被缓存
if
(
n
==
-
1
)
if
(
n
==
-
1
)
{
{
//A4没有被占用
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A7"
&&
s
.
Action
==
ClientAction
.
NeedLeave
&&
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A4"
&&
s
.
Action
==
ClientAction
.
NeedLeave
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
IsUse
);
s
.
RFID
.
StartsWith
(
"A"
)
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
IsUse
);
if
(
n
==
-
1
)
//A7有空料架用于包装仓出库
if
(
n
>
-
1
)
{
{
nodeIdx
=
-
1
;
Common
.
log
.
OutInfo
(
"A4不是NeedLeave或被占用"
);
Common
.
log
.
OutTextBox
(
"A4没有架子或被占用"
);
}
else
{
//清除当前任务点
int
idx
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
agv
.
Place
);
if
(
idx
>
-
1
)
{
Common
.
nodeInfo
[
idx
].
AgvName
=
""
;
Common
.
server
.
NodeRefresh
(
idx
);
}
else
{
log
=
"清理AgvName,没有找到 "
+
agv
.
Name
;
Common
.
log
.
OutInfo
(
log
);
}
agv
.
Place
=
Common
.
nodeInfo
[
n
].
Name
;
agv
.
Place
=
Common
.
nodeInfo
[
n
].
Name
;
agv
.
Mark
=
Common
.
nodeInfo
[
nodeIdx
].
Mark
;
agv
.
Mark
=
Common
.
nodeInfo
[
nodeIdx
].
Mark
;
//agv.CloseDoor = false;
//agv.CloseDoor = false;
...
@@ -1908,26 +2541,123 @@ namespace BLL
...
@@ -1908,26 +2541,123 @@ namespace BLL
MarkAdd
(
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
MarkAdd
(
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
Common
.
log
.
OutString
(
"Mark缓存 "
+
string
.
Join
(
","
,
Marks
.
ToArray
()));
Common
.
log
.
OutString
(
"Mark缓存 "
+
string
.
Join
(
","
,
Marks
.
ToArray
()));
log
=
string
.
Format
(
"{0} Move {1} {2}"
,
agv
.
Name
,
agv
.
Place
,
Common
.
nodeInfo
[
nodeIdx
].
Action
.
ToString
());
log
=
string
.
Format
(
"{0} Move To {1}[{2}] [{3}]"
,
agv
.
Name
,
agv
.
Place
,
Common
.
nodeInfo
[
nodeIdx
].
Action
.
ToString
(),
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
mir
.
State_Ready
(
agv
);
Common
.
mir
.
State_Ready
(
agv
);
Common
.
server
.
NodeRefresh
(
n
);
Common
.
server
.
NodeRefresh
(
n
);
AgvChanged
?.
Invoke
(
agvIdx
);
AgvChanged
?.
Invoke
(
agvIdx
);
return
true
;
return
true
;
}
}
else
else
{
{
agv
.
TaskSend
=
false
;
agv
.
TaskSend
=
false
;
log
=
string
.
Format
(
"{0} Move {1} 失败"
,
agv
.
Name
,
agv
.
Place
);
log
=
string
.
Format
(
"{0} Move
To
{1} 失败"
,
agv
.
Name
,
agv
.
Place
);
//防止上一个任务已执行但返回失败时,删除任务
//防止上一个任务已执行但返回失败时,删除任务
//Common.mir.Del_Mission(agv);
//Common.mir.Del_Mission(agv);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
log
.
OutTextBox
(
log
);
//return false;
}
}
}
}
else
{
log
=
string
.
Format
(
"{0}无可用料架 [ClientAction={1}] [RFID={2}]"
,
a7Node
.
Name
,
a7Node
.
Action
.
ToString
(),
a7Node
.
RFID
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"A4"
&&
s
.
Action
==
ClientAction
.
NeedLeave
&&
s
.
AgvName
.
Equals
(
""
)
&&
s
.
IsUse
);
//A4无空架子
if
(
n
==
-
1
)
{
resultType
=
ResultType
.
NoEmptyShelf
;
log
=
string
.
Format
(
"{0}无可用料架 [ClientAction={1}] [RFID={2}]"
,
a4Node
.
Name
,
a4Node
.
Action
.
ToString
(),
a4Node
.
RFID
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
#
region
有出库任务,但
A7
,
A4
无空架子
//n = Common.nodeInfo.FindIndex(s => s.Name == "A8" && s.Action == ClientAction.NeedEnter && s.AgvName.Equals("") && s.IsUse);
//if (n == -1)
//{
// ClientNode a8Node = Common.nodeInfo.Find(s => s.Name.Equals("A8"));
// log = string.Format("A4、A7均无空架用于包装仓出库,且{0}已满,不可将A7架子放到{0}。需要人工干预 [ClientAction={1}]", a8Node.Name, a8Node.Action.ToString());
// Common.log.OutInfo(log);
// Common.log.OutTextBox(log);
//}
////A7,A4均无空架子,可将A7的架子移动到A8
//else
//{
// agv.Place = "A7";
// //agv.Mark = Common.nodeInfo[nodeIdx].Mark;
// //agv.CloseDoor = false;
// rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Move" + agv.Place]);
// if (rtn)
// {
// agv.CloseDoor = false;
// Common.nodeInfo[n].AgvName = agv.Name;
// agv.TaskSend = true;
// //_mark.Add(Common.nodeInfo[nodeIdx].Mark);
// //MarkAdd(Common.nodeInfo[nodeIdx].Mark);
// log = string.Format("{0} Move To {1}[{2}] ", agv.Name, agv.Place,
// "A7,A4无料架用于包装仓");
// Common.log.OutInfo(log);
// Common.log.OutTextBox(log);
// Common.mir.State_Ready(agv);
// Common.server.NodeRefresh(n);
// AgvChanged?.Invoke(agvIdx);
// }
// else
// {
// agv.TaskSend = false;
// log = string.Format("{0} Move To {1}失败[{2}] ", agv.Name, agv.Place,
// "A7,A4无料架用于包装仓");
// //防止上一个任务已执行但返回失败时,删除任务
// //Common.mir.Del_Mission(agv);
// Common.log.OutInfo(log);
// Common.log.OutTextBox(log);
// }
//}
#
endregion
}
//A4没有被占用
else
{
agv
.
Place
=
Common
.
nodeInfo
[
n
].
Name
;
agv
.
Mark
=
Common
.
nodeInfo
[
nodeIdx
].
Mark
;
//agv.CloseDoor = false;
rtn
=
Common
.
mir
.
Add_Mission_Fleet
(
agv
,
Common
.
agvMission
[
"Move"
+
agv
.
Place
]);
if
(
rtn
)
{
agv
.
CloseDoor
=
false
;
Common
.
nodeInfo
[
n
].
AgvName
=
agv
.
Name
;
agv
.
TaskSend
=
true
;
//_mark.Add(Common.nodeInfo[nodeIdx].Mark);
MarkAdd
(
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
Common
.
log
.
OutString
(
"Mark缓存 "
+
string
.
Join
(
","
,
Marks
.
ToArray
()));
log
=
string
.
Format
(
"{0} Move To {1}[{2}] [{3}]"
,
agv
.
Name
,
agv
.
Place
,
Common
.
nodeInfo
[
nodeIdx
].
Action
.
ToString
(),
Common
.
nodeInfo
[
nodeIdx
].
Mark
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
mir
.
State_Ready
(
agv
);
Common
.
server
.
NodeRefresh
(
n
);
AgvChanged
?.
Invoke
(
agvIdx
);
return
true
;
}
else
{
agv
.
TaskSend
=
false
;
log
=
string
.
Format
(
"{0} Move To {1} 失败"
,
agv
.
Name
,
agv
.
Place
);
//防止上一个任务已执行但返回失败时,删除任务
//Common.mir.Del_Mission(agv);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
}
}
}
}
}
else
else
{
{
...
@@ -1936,10 +2666,22 @@ namespace BLL
...
@@ -1936,10 +2666,22 @@ namespace BLL
}
}
}
}
return
false
;
//无任务/无空架子
}
//需要出料架,且没有被标记
/// <summary>
//A4是包装料仓的进料,不包含在内
/// B区域出料架
//根据优先级调用
/// </summary>
/// <param name="agvIdx"></param>
/// <returns>true:有料架要出</returns>
private
bool
FindAreaBNeedLeave
(
int
agvIdx
)
{
int
nodeIdx
=
-
1
;
Agv_Info
agv
=
Common
.
agvInfo
[
agvIdx
];
List
<
int
>
node
=
new
List
<
int
>();
//搜索包装仓需要出料架的节点
for
(
int
i
=
0
;
i
<
Common
.
nodeInfo
.
Count
;
i
++)
for
(
int
i
=
0
;
i
<
Common
.
nodeInfo
.
Count
;
i
++)
{
{
if
(
Common
.
nodeInfo
[
i
].
Action
==
ClientAction
.
NeedLeave
&&
Common
.
nodeInfo
[
i
].
Name
.
StartsWith
(
"B"
)
&&
if
(
Common
.
nodeInfo
[
i
].
Action
==
ClientAction
.
NeedLeave
&&
Common
.
nodeInfo
[
i
].
Name
.
StartsWith
(
"B"
)
&&
...
@@ -1952,17 +2694,17 @@ namespace BLL
...
@@ -1952,17 +2694,17 @@ namespace BLL
//测试,临时的
//测试,临时的
for
(
int
i
=
0
;
i
<
node
.
Count
;
i
++)
for
(
int
i
=
0
;
i
<
node
.
Count
;
i
++)
{
{
Common
.
log
.
OutString
(
agv
.
Name
+
"
Test "
+
node
[
i
]
+
" Name="
+
Common
.
nodeInfo
[
node
[
i
]].
Name
+
" Mark="
+
Common
.
nodeInfo
[
node
[
i
]].
Mark
);
Common
.
log
.
OutString
(
agv
.
Name
+
"
BAreaNeedLeave "
+
node
[
i
]
+
" [Name="
+
Common
.
nodeInfo
[
node
[
i
]].
Name
+
"] [Mark="
+
Common
.
nodeInfo
[
node
[
i
]].
Mark
+
"]"
);
}
}
if
(
node
.
Count
==
0
)
if
(
node
.
Count
==
0
)
{
{
nodeIdx
=
-
1
;
nodeIdx
=
-
1
;
Common
.
log
.
OutInfo
(
agv
.
Name
+
"
没有找到新的NeedLeave的节点
"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
"
包装仓没有需要出料架的
"
);
}
}
else
else
{
{
//按顺序
取符合要求的
//按顺序
出包装仓的料架
for
(
int
i
=
0
;
i
<
node
.
Count
;
i
++)
for
(
int
i
=
0
;
i
<
node
.
Count
;
i
++)
{
{
if
(
Common
.
nodeInfo
[
node
[
i
]].
Mark
==
"0"
)
if
(
Common
.
nodeInfo
[
node
[
i
]].
Mark
==
"0"
)
...
@@ -1985,19 +2727,23 @@ namespace BLL
...
@@ -1985,19 +2727,23 @@ namespace BLL
if
(
nodeIdx
>
-
1
)
if
(
nodeIdx
>
-
1
)
{
{
Common
.
log
.
OutInfo
(
agv
.
Name
+
" test2 "
+
agv
.
Name
+
" "
+
Common
.
nodeInfo
[
nodeIdx
].
Name
);
Common
.
log
.
OutInfo
(
"包装仓出料架: "
+
agv
.
Name
+
" "
+
Common
.
nodeInfo
[
nodeIdx
].
Name
+
"[Mark="
+
Common
.
nodeInfo
[
nodeIdx
].
Mark
+
"]"
);
MoveNode
(
agv
,
nodeIdx
);
MoveNode
(
agv
,
nodeIdx
);
return
true
;
return
true
;
}
}
}
}
return
false
;
return
false
;
}
}
/// <summary>
/// 搜索需要料架/料串的节点
/// </summary>
/// <param name="agv"></param>
/// <param name="name">节点名称</param>
/// <returns>true:有需要料架的节点并移动</returns>
private
bool
FindNeedEnter
(
Agv_Info
agv
,
string
name
)
private
bool
FindNeedEnter
(
Agv_Info
agv
,
string
name
)
{
{
//寻找下一个任务点
//寻找下一个任务点
...
@@ -2062,6 +2808,12 @@ namespace BLL
...
@@ -2062,6 +2808,12 @@ namespace BLL
}
}
}
}
/// <summary>
/// 寻找需要送出料架/料串的节点,并给小车发任务
/// </summary>
/// <param name="agv"></param>
/// <param name="name">节点名</param>
/// <returns></returns>
private
bool
FindNeedLeave
(
Agv_Info
agv
,
string
name
)
private
bool
FindNeedLeave
(
Agv_Info
agv
,
string
name
)
{
{
bool
rtn
;
bool
rtn
;
...
@@ -2081,7 +2833,7 @@ namespace BLL
...
@@ -2081,7 +2833,7 @@ namespace BLL
if
(
n
==
-
1
)
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"C1"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
if
(
n
==
-
1
)
n
=
Common
.
nodeInfo
.
FindIndex
(
s
=>
s
.
Name
==
"C1"
&&
s
.
Action
==
ClientAction
.
NeedEnter
&&
s
.
AgvName
==
""
&&
s
.
IsUse
);
if
(
n
==
-
1
)
if
(
n
==
-
1
)
{
{
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C1C3C5全部被占用"
);
Common
.
log
.
OutInfo
(
agv
.
Name
+
" C1C3C5全部被占用
,不去A1
"
);
return
false
;
//入料口全部被占用
return
false
;
//入料口全部被占用
}
}
}
}
...
@@ -2096,7 +2848,7 @@ namespace BLL
...
@@ -2096,7 +2848,7 @@ namespace BLL
}
}
else
else
{
{
log
=
agv
.
Name
+
" 清理AgvName,没有找到 "
+
agv
.
Name
;
log
=
"FindNeedLeave(): "
+
agv
.
Name
+
" 清理AgvName,没有找到 "
+
agv
.
Name
;
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
}
}
...
@@ -2138,6 +2890,12 @@ namespace BLL
...
@@ -2138,6 +2890,12 @@ namespace BLL
}
}
}
}
/// <summary>
/// 移动到目的地
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeIdx">节点索引</param>
/// <returns></returns>
private
bool
MoveNode
(
Agv_Info
agv
,
int
nodeIdx
)
private
bool
MoveNode
(
Agv_Info
agv
,
int
nodeIdx
)
{
{
string
log
;
string
log
;
...
@@ -2151,7 +2909,7 @@ namespace BLL
...
@@ -2151,7 +2909,7 @@ namespace BLL
}
}
else
else
{
{
log
=
"清理AgvName,没有找到 "
+
agv
.
Name
;
log
=
"清理
任务点的
AgvName,没有找到 "
+
agv
.
Name
;
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
}
}
...
@@ -2166,7 +2924,7 @@ namespace BLL
...
@@ -2166,7 +2924,7 @@ namespace BLL
agv
.
CloseDoor
=
false
;
agv
.
CloseDoor
=
false
;
Common
.
nodeInfo
[
nodeIdx
].
AgvName
=
agv
.
Name
;
Common
.
nodeInfo
[
nodeIdx
].
AgvName
=
agv
.
Name
;
agv
.
TaskSend
=
true
;
agv
.
TaskSend
=
true
;
log
=
string
.
Format
(
"{0} Move {1} {2}"
,
agv
.
Name
,
agv
.
Place
,
Common
.
nodeInfo
[
nodeIdx
].
Action
.
ToString
());
log
=
string
.
Format
(
"{0} Move
TtoNode
{1} {2}"
,
agv
.
Name
,
agv
.
Place
,
Common
.
nodeInfo
[
nodeIdx
].
Action
.
ToString
());
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
log
.
OutTextBox
(
log
);
Common
.
mir
.
State_Ready
(
agv
);
Common
.
mir
.
State_Ready
(
agv
);
...
@@ -2175,7 +2933,7 @@ namespace BLL
...
@@ -2175,7 +2933,7 @@ namespace BLL
else
else
{
{
agv
.
TaskSend
=
false
;
agv
.
TaskSend
=
false
;
log
=
string
.
Format
(
"{0} Move {1} 失败"
,
agv
.
Name
,
agv
.
Place
);
log
=
string
.
Format
(
"{0} Move
TtoNode
{1} 失败"
,
agv
.
Name
,
agv
.
Place
);
//防止上一个任务已执行但返回失败时,删除任务
//防止上一个任务已执行但返回失败时,删除任务
//Common.mir.Del_Mission(agv);
//Common.mir.Del_Mission(agv);
Common
.
log
.
OutInfo
(
log
);
Common
.
log
.
OutInfo
(
log
);
...
...
AGVControl/FrmMain.cs
查看文件 @
a48bf02
...
@@ -230,6 +230,7 @@ namespace AGVControl
...
@@ -230,6 +230,7 @@ namespace AGVControl
return
;
return
;
Common
.
agvInfo
[
idx
].
Place
=
""
;
Common
.
agvInfo
[
idx
].
Place
=
""
;
Common
.
agvInfo
[
idx
].
IsClearRunInfo
=
false
;
Common
.
agvInfo
[
idx
].
IsClearRunInfo
=
false
;
Common
.
log
.
OutInfo
(
"手动添加任务: "
+
LstAgvPlace
.
Text
);
//if (LstAgvPlace.Text.StartsWith("Move") && LstAgvPlace.Text.Length ==6)
//if (LstAgvPlace.Text.StartsWith("Move") && LstAgvPlace.Text.Length ==6)
//{
//{
// Common.agvInfo[idx].Place = LstAgvPlace.Text.Substring(4);
// Common.agvInfo[idx].Place = LstAgvPlace.Text.Substring(4);
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论