Commit a11957e5 张东亮

增加自动任务重发

1 个父辈 36baed89
...@@ -94,6 +94,19 @@ namespace DeviceLibrary ...@@ -94,6 +94,19 @@ namespace DeviceLibrary
AGVManager.agvInfo[i].SetKanban(); AGVManager.agvInfo[i].SetKanban();
if (!CheckOnline(i)) continue; if (!CheckOnline(i)) continue;
bool change = false; 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]); MiR_API.Get_Task_State(AGVManager.agvInfo[i]);
Thread.Sleep(50); Thread.Sleep(50);
MiR_API.Get_IO_Status(AGVManager.agvInfo[i]); MiR_API.Get_IO_Status(AGVManager.agvInfo[i]);
......
...@@ -22,7 +22,7 @@ namespace DeviceLibrary ...@@ -22,7 +22,7 @@ namespace DeviceLibrary
//不为空,且与上一个消息不一样才打印 //不为空,且与上一个消息不一样才打印
if (!value.Equals(msg)) if (!value.Equals(msg))
{ {
//LogUtil.info(value); LogUtil.info(value);
} }
} }
msg = value; msg = value;
......
...@@ -185,6 +185,7 @@ namespace DeviceLibrary ...@@ -185,6 +185,7 @@ namespace DeviceLibrary
{ {
try try
{ {
info.TaskRunState.IsAllocatingTask = true;
info.TaskRunState.ResetInfo(); info.TaskRunState.ResetInfo();
log.Debug(string.Format("{0} Add_Mission [{1}]", info.Name, info.TaskRunState.Task.Guid)); log.Debug(string.Format("{0} Add_Mission [{1}]", info.Name, info.TaskRunState.Task.Guid));
...@@ -192,14 +193,23 @@ namespace DeviceLibrary ...@@ -192,14 +193,23 @@ namespace DeviceLibrary
Del_Mission(info); Del_Mission(info);
string url = "http://" + info.IP + "/api/v2.0.0/mission_queue"; 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); 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(); JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json); Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) if (dic == null)
{ {
info.TaskRunState.IsAllocatingTask = false;
return false; return false;
} }
log.Debug("URL: " + url + "\n" + "Return: " + json); log.Debug("URL: " + url + "\n" + "Return: " + json);
...@@ -209,15 +219,20 @@ namespace DeviceLibrary ...@@ -209,15 +219,20 @@ namespace DeviceLibrary
if (s == info.TaskRunState.Task.Guid && !string.IsNullOrEmpty(id)) if (s == info.TaskRunState.Task.Guid && !string.IsNullOrEmpty(id))
{ {
info.TaskRunState.TaskID = Convert.ToInt32(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)); log.Debug(string.Format("{0} Add_Mission [{1}]", info.Name, info.TaskRunState.Task.Name));
return true; return true;
} }
else else
{
info.TaskRunState.IsAllocatingTask = false;
return false; return false;
}
} }
catch (Exception ex) catch (Exception ex)
{ {
log.Error("Add_Mission", ex); log.Error("Add_Mission", ex);
info.TaskRunState.IsAllocatingTask = false;
return false; return false;
} }
} }
...@@ -232,21 +247,30 @@ namespace DeviceLibrary ...@@ -232,21 +247,30 @@ namespace DeviceLibrary
{ {
try try
{ {
info.TaskRunState.IsAllocatingTask = true;
info.TaskRunState.ResetInfo(); info.TaskRunState.ResetInfo();
//防止上一个任务已执行但返回失败时,删除任务 //防止上一个任务已执行但返回失败时,删除任务
Del_Mission(info); 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 ip = AppConfigHelper.GetValue(SettingString.FLEET);
string url = "http://" + ip + "/api/v2.0.0/mission_scheduler"; 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); 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(); JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json); Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) if (dic == null)
{ {
log.Error($"{info.Name} Add_Mission_Fleet Fail URL: " + url + "\n" + "Return: " + json); log.Error($"{info.Name} Add_Mission_Fleet Fail URL: " + url + "\n" + "Return: " + json);
info.TaskRunState.IsAllocatingTask = false;
return false; return false;
} }
string s = dic["mission_id"].ToString(); string s = dic["mission_id"].ToString();
...@@ -255,14 +279,20 @@ namespace DeviceLibrary ...@@ -255,14 +279,20 @@ namespace DeviceLibrary
{ {
info.TaskRunState.TaskID = Convert.ToInt32(id); info.TaskRunState.TaskID = Convert.ToInt32(id);
log.Debug(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, info.TaskRunState.Task.Name)); log.Debug(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, info.TaskRunState.Task.Name));
info.TaskRunState.IsAllocatingTask = false;
return true; return true;
} }
else else
{
info.TaskRunState.IsAllocatingTask = false;
return false; return false;
}
} }
catch (Exception ex) catch (Exception ex)
{ {
log.Error("Add_Mission_Fleet", ex); log.Error("Add_Mission_Fleet", ex);
info.TaskRunState.IsAllocatingTask = false;
return false; return false;
} }
} }
...@@ -279,7 +309,8 @@ namespace DeviceLibrary ...@@ -279,7 +309,8 @@ namespace DeviceLibrary
try try
{ {
string url = "http://" + info.IP + "/api/v2.0.0/missions/search?whitelist=guid,name"; 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); string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false; if (string.IsNullOrWhiteSpace(json)) return false;
...@@ -302,6 +333,88 @@ namespace DeviceLibrary ...@@ -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> /// <summary>
/// 获取当前任务队列guid /// 获取当前任务队列guid
/// </summary> /// </summary>
...@@ -661,7 +774,7 @@ namespace DeviceLibrary ...@@ -661,7 +774,7 @@ namespace DeviceLibrary
string s = response.Content; string s = response.Content;
s = s.Replace("\n", ""); s = s.Replace("\n", "");
s = s.Replace(" ", ""); 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; return s;
} }
......
...@@ -15,9 +15,17 @@ namespace DeviceLibrary ...@@ -15,9 +15,17 @@ namespace DeviceLibrary
/// <summary> /// <summary>
/// AGV任务ID /// AGV任务ID
/// </summary> /// </summary>
public int TaskID { get; set; } = -1; public long TaskID { get; set; } = -1;
/// <summary> /// <summary>
/// 任务开始时间戳
/// </summary>
public string TaskTimeStamp { get; set; }
/// <summary>
/// 正在分配任务
/// </summary>
public bool IsAllocatingTask = false;
/// <summary>
/// AGV任务 /// AGV任务
/// </summary> /// </summary>
public AgvTask Task { get; set; } = new AgvTask(); public AgvTask Task { get; set; } = new AgvTask();
......
...@@ -101,6 +101,7 @@ namespace DeviceLibrary ...@@ -101,6 +101,7 @@ namespace DeviceLibrary
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.WAIT_AGV_REACH_A6); JobRunStep.ToNextStep(RunStep.WAIT_AGV_REACH_A6);
WarehouseSigManager.TargetWithFix.CurPlace = JobParam.TargetNode.Name;
runInfo = $"去{JobParam.TargetNode.Name}接料"; runInfo = $"去{JobParam.TargetNode.Name}接料";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, JobParam.TargetNode.Name); AllocateTask(agv, JobParam.TargetNode.Name);
...@@ -111,7 +112,6 @@ namespace DeviceLibrary ...@@ -111,7 +112,6 @@ namespace DeviceLibrary
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
WarehouseSigManager.TargetWithFix.CurPlace = JobParam.TargetNode.Name;
JobRunStep.ToNextStep(RunStep.WAIT_DOUBLE_LINE_RESPONSE); JobRunStep.ToNextStep(RunStep.WAIT_DOUBLE_LINE_RESPONSE);
runInfo = "到达 " + JobParam.TargetNode.Name + ",并发送出库请求"; runInfo = "到达 " + JobParam.TargetNode.Name + ",并发送出库请求";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
......
...@@ -14,8 +14,11 @@ namespace DeviceLibrary ...@@ -14,8 +14,11 @@ namespace DeviceLibrary
/// <returns></returns> /// <returns></returns>
public override Job GetNewJob(Agv_Info agv) public override Job GetNewJob(Agv_Info agv)
{ {
if (agv.Battery < ChargePileManager.GetChargePiles().BatteryMax && ChargePileManager.HasEmpty(agv,out string chargename)) //Common.LogUtil.info($"{agv.Battery},{ChargePileManager.GetChargePiles().BatteryMax},{ChargePileManager.HasEmpty(agv, out string chargename)}");
return new ChargeJob(new bean.JobParam(agv.Place,manager.NodeManager.GetNodeByType(NodeType.AutoCharge))); 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 else
return new StandyJob(new bean.JobParam(agv.Place, manager.NodeManager.GetNodeByType(NodeType.Standby))); return new StandyJob(new bean.JobParam(agv.Place, manager.NodeManager.GetNodeByType(NodeType.Standby)));
} }
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!