Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张东亮
/
SO940-AGV
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit a11957e5
由
张东亮
编写于
2021-08-24 22:02:32 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
增加自动任务重发
1 个父辈
36baed89
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
149 行增加
和
12 行删除
DeviceLibrary/Control.cs
DeviceLibrary/bean/JobStep.cs
DeviceLibrary/bean/MiR_API.cs
DeviceLibrary/bean/TaskRunState.cs
DeviceLibrary/bean/job/GoWarehouseForOutStoreJob.cs
DeviceLibrary/bean/job/jobType/ChargeJobType.cs
DeviceLibrary/Control.cs
查看文件 @
a11957e
...
...
@@ -94,6 +94,19 @@ namespace DeviceLibrary
AGVManager
.
agvInfo
[
i
].
SetKanban
();
if
(!
CheckOnline
(
i
))
continue
;
bool
change
=
false
;
if
(!
AGVManager
.
agvInfo
[
i
].
TaskRunState
.
IsAllocatingTask
&&
AGVManager
.
agvInfo
[
i
].
IsUse
&&
AGVManager
.
agvInfo
[
i
].
CurJob
!=
null
&&
AGVManager
.
agvInfo
[
i
].
TaskRunState
.
TaskID
.
Equals
(-
1
))
{
if
(!
MiR_API
.
Get_MissionByDescrp
(
AGVManager
.
agvInfo
[
i
]))
{
AGVManager
.
agvInfo
[
i
].
CurJob
.
ResendTask
(
AGVManager
.
agvInfo
[
i
]);
log
.
Info
(
$
"{AGVManager.agvInfo[i].Name}:Task=-1处理,Fleet无任务,重发任务:{AGVManager.agvInfo[i].TaskRunState.Task.Name}"
);
}
else
{
log
.
Info
(
$
"{AGVManager.agvInfo[i].Name}:Task=-1处理,Fleet有任务,自动赋值FleetTaskID={AGVManager.agvInfo[i].TaskRunState.TaskID}"
);
}
}
MiR_API
.
Get_Task_State
(
AGVManager
.
agvInfo
[
i
]);
Thread
.
Sleep
(
50
);
MiR_API
.
Get_IO_Status
(
AGVManager
.
agvInfo
[
i
]);
...
...
DeviceLibrary/bean/JobStep.cs
查看文件 @
a11957e
...
...
@@ -22,7 +22,7 @@ namespace DeviceLibrary
//不为空,且与上一个消息不一样才打印
if
(!
value
.
Equals
(
msg
))
{
//
LogUtil.info(value);
LogUtil
.
info
(
value
);
}
}
msg
=
value
;
...
...
DeviceLibrary/bean/MiR_API.cs
查看文件 @
a11957e
...
...
@@ -185,6 +185,7 @@ namespace DeviceLibrary
{
try
{
info
.
TaskRunState
.
IsAllocatingTask
=
true
;
info
.
TaskRunState
.
ResetInfo
();
log
.
Debug
(
string
.
Format
(
"{0} Add_Mission [{1}]"
,
info
.
Name
,
info
.
TaskRunState
.
Task
.
Guid
));
...
...
@@ -192,14 +193,23 @@ namespace DeviceLibrary
Del_Mission
(
info
);
string
url
=
"http://"
+
info
.
IP
+
"/api/v2.0.0/mission_queue"
;
string
body
=
"{\"mission_id\":\""
+
info
.
TaskRunState
.
Task
.
Guid
+
"\"}"
;
//string body = "{\"mission_id\":\"" + info.TaskRunState.Task.Guid + "\"}";
System
.
DateTime
startTime
=
TimeZone
.
CurrentTimeZone
.
ToLocalTime
(
new
System
.
DateTime
(
2021
,
1
,
1
,
8
,
0
,
0
));
// 当地时区
long
timeStamp
=
(
long
)(
DateTime
.
Now
-
startTime
).
TotalSeconds
;
// 相差秒数
info
.
TaskRunState
.
TaskTimeStamp
=
timeStamp
.
ToString
();
string
body
=
"{\"mission_id\":\""
+
info
.
TaskRunState
.
Task
.
Guid
+
"\",\"robot_id\":"
+
info
.
ID
+
",\"description\":\""
+
$
"{info.TaskRunState.Task.Name}-{info.TaskRunState.TaskTimeStamp}-{info.ID}"
+
"\"}"
;
string
json
=
HttpPost
(
url
,
info
.
IP
,
info
.
Authorization
,
body
);
if
(
string
.
IsNullOrWhiteSpace
(
json
))
return
false
;
if
(
string
.
IsNullOrWhiteSpace
(
json
))
{
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
return
false
;
}
JavaScriptSerializer
serializer
=
new
JavaScriptSerializer
();
Dictionary
<
string
,
object
>
dic
=
(
Dictionary
<
string
,
object
>)
serializer
.
DeserializeObject
(
json
);
if
(
dic
==
null
)
{
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
return
false
;
}
log
.
Debug
(
"URL: "
+
url
+
"\n"
+
"Return: "
+
json
);
...
...
@@ -209,15 +219,20 @@ namespace DeviceLibrary
if
(
s
==
info
.
TaskRunState
.
Task
.
Guid
&&
!
string
.
IsNullOrEmpty
(
id
))
{
info
.
TaskRunState
.
TaskID
=
Convert
.
ToInt32
(
id
);
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
log
.
Debug
(
string
.
Format
(
"{0} Add_Mission [{1}]"
,
info
.
Name
,
info
.
TaskRunState
.
Task
.
Name
));
return
true
;
}
else
{
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
return
false
;
}
}
catch
(
Exception
ex
)
{
log
.
Error
(
"Add_Mission"
,
ex
);
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
return
false
;
}
}
...
...
@@ -232,21 +247,30 @@ namespace DeviceLibrary
{
try
{
info
.
TaskRunState
.
IsAllocatingTask
=
true
;
info
.
TaskRunState
.
ResetInfo
();
//防止上一个任务已执行但返回失败时,删除任务
Del_Mission
(
info
);
System
.
DateTime
startTime
=
TimeZone
.
CurrentTimeZone
.
ToLocalTime
(
new
System
.
DateTime
(
2021
,
1
,
1
,
8
,
0
,
0
));
// 当地时区
long
timeStamp
=
(
long
)(
DateTime
.
Now
-
startTime
).
TotalSeconds
;
// 相差秒数
info
.
TaskRunState
.
TaskTimeStamp
=
timeStamp
.
ToString
();
string
ip
=
AppConfigHelper
.
GetValue
(
SettingString
.
FLEET
);
string
url
=
"http://"
+
ip
+
"/api/v2.0.0/mission_scheduler"
;
string
body
=
"{\"mission_id\":\""
+
info
.
TaskRunState
.
Task
.
Guid
+
"\",\"robot_id\":"
+
info
.
ID
+
"}"
;
string
body
=
"{\"mission_id\":\""
+
info
.
TaskRunState
.
Task
.
Guid
+
"\",\"robot_id\":"
+
info
.
ID
+
"
,\"description\":\""
+
$
"{info.TaskRunState.Task.Name}-{info.TaskRunState.TaskTimeStamp}-{info.ID}"
+
"\"
}"
;
string
json
=
HttpPost
(
url
,
info
.
IP
,
info
.
Authorization
,
body
);
if
(
string
.
IsNullOrWhiteSpace
(
json
))
return
false
;
if
(
string
.
IsNullOrWhiteSpace
(
json
))
{
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
return
false
;
}
JavaScriptSerializer
serializer
=
new
JavaScriptSerializer
();
Dictionary
<
string
,
object
>
dic
=
(
Dictionary
<
string
,
object
>)
serializer
.
DeserializeObject
(
json
);
if
(
dic
==
null
)
{
log
.
Error
(
$
"{info.Name} Add_Mission_Fleet Fail URL: "
+
url
+
"\n"
+
"Return: "
+
json
);
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
return
false
;
}
string
s
=
dic
[
"mission_id"
].
ToString
();
...
...
@@ -255,14 +279,20 @@ namespace DeviceLibrary
{
info
.
TaskRunState
.
TaskID
=
Convert
.
ToInt32
(
id
);
log
.
Debug
(
string
.
Format
(
"{0} Add_Mission_Fleet [{1}]"
,
info
.
Name
,
info
.
TaskRunState
.
Task
.
Name
));
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
return
true
;
}
else
{
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
return
false
;
}
}
catch
(
Exception
ex
)
{
log
.
Error
(
"Add_Mission_Fleet"
,
ex
);
info
.
TaskRunState
.
IsAllocatingTask
=
false
;
return
false
;
}
}
...
...
@@ -279,7 +309,8 @@ namespace DeviceLibrary
try
{
string
url
=
"http://"
+
info
.
IP
+
"/api/v2.0.0/missions/search?whitelist=guid,name"
;
string
body
=
"{\"filters\" :[]}"
;
// string body = "{\"filters\" :[]}";
string
body
=
"{\"filters\" : [{\"fieldname\": \"description\", \"operator\": \"LIKE\", \"value\": \""
+
info
.
TaskRunState
.
Task
.
Name
+
"-"
+
info
.
TaskRunState
.
TaskTimeStamp
+
"-"
+
info
.
ID
+
"\"}]}"
;
string
json
=
HttpPost
(
url
,
info
.
IP
,
info
.
Authorization
,
body
);
if
(
string
.
IsNullOrWhiteSpace
(
json
))
return
false
;
...
...
@@ -302,6 +333,88 @@ namespace DeviceLibrary
}
}
public
static
bool
Get_MissionByDescrp
(
Agv_Info
info
)
{
if
(
info
.
UseFleet
)
return
Get_Fleet_Mission_Info
(
info
);
else
return
Get_Mission
(
info
);
}
/// <summary>
/// 获取所有任务列表
/// </summary>
/// <param name="info"></param>
/// <param name="mission">任务(名称,guid)</param>
/// <returns></returns>
public
static
bool
Get_Mission
(
Agv_Info
info
)
{
try
{
string
url
=
"http://"
+
info
.
IP
+
"/api/v2.0.0/missions/search?whitelist=guid,name"
;
// string body = "{\"filters\" :[]}";
string
body
=
"{\"filters\" : [{\"fieldname\": \"description\", \"operator\": \"LIKE\", \"value\": \""
+
info
.
TaskRunState
.
Task
.
Name
+
"-"
+
info
.
TaskRunState
.
TaskTimeStamp
+
"-"
+
info
.
ID
+
"\"}]}"
;
string
json
=
HttpPost
(
url
,
info
.
IP
,
info
.
Authorization
,
body
);
if
(
string
.
IsNullOrWhiteSpace
(
json
))
return
false
;
JavaScriptSerializer
serializer
=
new
JavaScriptSerializer
();
object
[]
obj
=
(
object
[])
serializer
.
DeserializeObject
(
json
);
if
(
obj
==
null
)
return
false
;
Dictionary
<
string
,
object
>
dic
;
if
(
obj
.
Length
>
0
)
{
dic
=
(
Dictionary
<
string
,
object
>)
obj
[
0
];
info
.
TaskRunState
.
TaskID
=
long
.
Parse
(
dic
[
"id"
].
ToString
());
if
(
info
.
TaskRunState
.
TaskID
==
-
1
)
return
false
;
return
true
;
}
return
false
;
}
catch
(
Exception
ex
)
{
log
.
Error
(
"Get_Mission"
,
ex
);
return
false
;
}
}
/// <summary>
/// 获取Fleet任务队列
/// </summary>
/// <param name="info"></param>
/// <param name="mission"></param>
/// <returns></returns>
public
static
bool
Get_Fleet_Mission_Info
(
Agv_Info
info
)
{
try
{
string
ip
=
AppConfigHelper
.
GetValue
(
SettingString
.
FLEET
);
string
url
=
"http://"
+
ip
+
"/api/v2.0.0/mission_scheduler/search"
;
string
body
=
"{\"filters\" : [{\"fieldname\": \"description\", \"operator\": \"LIKE\", \"value\": \""
+
info
.
TaskRunState
.
Task
.
Name
+
"-"
+
info
.
TaskRunState
.
TaskTimeStamp
+
"-"
+
info
.
ID
+
"\"}]}"
;
string
json
=
HttpPost
(
url
,
info
.
IP
,
info
.
Authorization
,
body
);
if
(
string
.
IsNullOrWhiteSpace
(
json
))
return
false
;
JavaScriptSerializer
serializer
=
new
JavaScriptSerializer
();
object
[]
obj
=
(
object
[])
serializer
.
DeserializeObject
(
json
);
if
(
obj
==
null
)
return
false
;
Dictionary
<
string
,
object
>
dic
;
if
(
obj
.
Length
>
0
)
{
dic
=
(
Dictionary
<
string
,
object
>)
obj
[
0
];
info
.
TaskRunState
.
TaskID
=
long
.
Parse
(
dic
[
"id"
].
ToString
());
if
(
info
.
TaskRunState
.
TaskID
==
-
1
)
return
false
;
return
true
;
}
return
false
;
}
catch
(
Exception
ex
)
{
log
.
Error
(
"Get_Fleet_Mission_Info"
,
ex
);
return
false
;
}
}
/// <summary>
/// 获取当前任务队列guid
/// </summary>
...
...
@@ -661,7 +774,7 @@ namespace DeviceLibrary
string
s
=
response
.
Content
;
s
=
s
.
Replace
(
"\n"
,
""
);
s
=
s
.
Replace
(
" "
,
""
);
log
.
Debug
(
string
.
Format
(
"HttpPost URL: {0}; Body: {1} Return: {2} [StatusCode={3},ResponseStatus={4},
]"
,
url
,
body
,
s
,
response
.
StatusCode
,
response
.
ResponseStatus
));
log
.
Info
(
string
.
Format
(
"HttpPost URL: {0}; Body: {1} Return: {2} [StatusCode={3},ResponseStatus={4}
]"
,
url
,
body
,
s
,
response
.
StatusCode
,
response
.
ResponseStatus
));
return
s
;
}
...
...
DeviceLibrary/bean/TaskRunState.cs
查看文件 @
a11957e
...
...
@@ -15,9 +15,17 @@ namespace DeviceLibrary
/// <summary>
/// AGV任务ID
/// </summary>
public
int
TaskID
{
get
;
set
;
}
=
-
1
;
public
long
TaskID
{
get
;
set
;
}
=
-
1
;
/// <summary>
/// 任务开始时间戳
/// </summary>
public
string
TaskTimeStamp
{
get
;
set
;
}
/// <summary>
/// 正在分配任务
/// </summary>
public
bool
IsAllocatingTask
=
false
;
/// <summary>
/// AGV任务
/// </summary>
public
AgvTask
Task
{
get
;
set
;
}
=
new
AgvTask
();
...
...
DeviceLibrary/bean/job/GoWarehouseForOutStoreJob.cs
查看文件 @
a11957e
...
...
@@ -101,6 +101,7 @@ namespace DeviceLibrary
if
(
agv
.
TaskRunState
.
CheckTaskFinished
(
agv
.
Name
))
{
JobRunStep
.
ToNextStep
(
RunStep
.
WAIT_AGV_REACH_A6
);
WarehouseSigManager
.
TargetWithFix
.
CurPlace
=
JobParam
.
TargetNode
.
Name
;
runInfo
=
$
"去{JobParam.TargetNode.Name}接料"
;
JobRunStep
.
Msg
=
runInfo
;
AllocateTask
(
agv
,
JobParam
.
TargetNode
.
Name
);
...
...
@@ -111,7 +112,6 @@ namespace DeviceLibrary
{
if
(
agv
.
TaskRunState
.
CheckTaskFinished
(
agv
.
Name
))
{
WarehouseSigManager
.
TargetWithFix
.
CurPlace
=
JobParam
.
TargetNode
.
Name
;
JobRunStep
.
ToNextStep
(
RunStep
.
WAIT_DOUBLE_LINE_RESPONSE
);
runInfo
=
"到达 "
+
JobParam
.
TargetNode
.
Name
+
",并发送出库请求"
;
JobRunStep
.
Msg
=
runInfo
;
...
...
DeviceLibrary/bean/job/jobType/ChargeJobType.cs
查看文件 @
a11957e
...
...
@@ -14,8 +14,11 @@ namespace DeviceLibrary
/// <returns></returns>
public
override
Job
GetNewJob
(
Agv_Info
agv
)
{
if
(
agv
.
Battery
<
ChargePileManager
.
GetChargePiles
().
BatteryMax
&&
ChargePileManager
.
HasEmpty
(
agv
,
out
string
chargename
))
return
new
ChargeJob
(
new
bean
.
JobParam
(
agv
.
Place
,
manager
.
NodeManager
.
GetNodeByType
(
NodeType
.
AutoCharge
)));
//Common.LogUtil.info($"{agv.Battery},{ChargePileManager.GetChargePiles().BatteryMax},{ChargePileManager.HasEmpty(agv, out string chargename)}");
if
(
agv
.
Battery
<
ChargePileManager
.
GetChargePiles
().
BatteryMax
&&
ChargePileManager
.
HasEmpty
(
agv
,
out
string
chargename1
))
{
return
new
ChargeJob
(
new
bean
.
JobParam
(
agv
.
Place
,
manager
.
NodeManager
.
GetNodeByType
(
NodeType
.
AutoCharge
)));
}
else
return
new
StandyJob
(
new
bean
.
JobParam
(
agv
.
Place
,
manager
.
NodeManager
.
GetNodeByType
(
NodeType
.
Standby
)));
}
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论