Commit 0658470f 张东亮

更改在A4出料后停止不动情况

1 个父辈 34358720
......@@ -81,20 +81,12 @@ namespace BLL
continue;
}
Common.log.OutInfo(Common.agvInfo[i].Name + " " + Common.agvInfo[i].MissionStatus);
Common.log.OutInfo("AgvCall " + Common.agvInfo[i].Name + " " + Common.agvInfo[i].MissionStatus);
switch (Common.agvInfo[i].MissionStatus)
{
case Mission_Status.None: //有空闲车辆
if (!Common.agvInfo[i].TaskSend)
{
//if (Common.chargeStatus.AutoCharge && Common.agvInfo[i].Battery < 70 &&
// Common.agvInfo[i].WaitTime >= Common.chargeStatus.chargeWait * 60000)
//{
// Common.log.OutInfo(Common.agvInfo[i].Name + " 闲置时间超过" + Common.chargeStatus.chargeWait + "分钟");
// if (StatusCharge(Common.agvInfo[i]))
// break;
//}
if (Common.chargeStatus.AutoCharge)
{
if (Common.agvInfo[i].Battery <= Common.chargeStatus.chargeMin)
......@@ -112,7 +104,6 @@ namespace BLL
}
StatusNone(i);
}
break;
......@@ -206,6 +197,8 @@ namespace BLL
for (int i = 0; i < Common.agvInfo.Count; i++)
{
try
{
if (!loop) break;
change = false;
......@@ -215,7 +208,7 @@ namespace BLL
//获取AGV状态
log = Common.agvInfo[i].Name;
Thread.Sleep(50);
rtn = Common.mir.Get_State(Common.agvInfo[i], out int stateID, out string stateText, out int battery,out string mission_text);
rtn = Common.mir.Get_State(Common.agvInfo[i], out int stateID, out string stateText, out int battery, out string mission_text);
if (rtn)
{
if (Common.agvInfo[i].StateID != stateID)
......@@ -255,10 +248,10 @@ namespace BLL
isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "agv." + Common.agvInfo[i].Name + ".battery", "电量 " + battery.ToString() + "%"));
}
if (stateText.Equals("Error") || stateText.Equals("EmergencyStop")|| stateText.Equals("Pause"))
if (stateText.Equals("Error") || stateText.Equals("EmergencyStop") || stateText.Equals("Pause"))
{
isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "agv." + Common.agvInfo[i].Name + ".Error.EmergencyStop", "agv状态 "+stateText));
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "agv." + Common.agvInfo[i].Name + ".Error.EmergencyStop", "agv状态 " + stateText));
}
if (isAlarm)
BLL.AGVManager.updateDeviceAlarmMsg(msglist);
......@@ -292,11 +285,14 @@ namespace BLL
log += " Get_Register调用失败";
}
if(change)
if (change)
AgvChanged?.Invoke(i);
Common.log.OutInfo(log);
}
catch (Exception ex)
{
Common.log.OutError(ex);
}
......@@ -331,9 +327,9 @@ namespace BLL
string log;
double sp = (DateTime.Now.Ticks - Common.chargeStatus.chargeInterval) / 10000000.0;
//防止两车同时充电卡住的情况
if ( sp< 60)
if (sp < 60)
{
Common.log.OutInfo(agv.Name+" 与上一辆车的充电时间间隔为" + sp.ToString() +",小于60s,不能充电。");
Common.log.OutInfo(agv.Name + " 与上一辆车的充电时间间隔为" + sp.ToString() + ",小于60s,不能充电。");
return false;
}
......@@ -401,7 +397,12 @@ namespace BLL
Agv_Info agv = Common.agvInfo[agvIdx];
int high = 0, middle = 0, low = 0;
List<int> node = new List<int>();
//清除节点AGV的名称
foreach (var item in Common.nodeInfo)
{
if (item.AgvName.Equals(agv.Name))
item.AgvName = "";
}
//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);
......@@ -532,10 +533,10 @@ namespace BLL
//B区域出料架
if (Common.nodeInfo[node[i]].Name.StartsWith("B"))
{
if (Common.nodeInfo[node[i]].Mark == "0")
if (Common.nodeInfo[node[i]].Mark == "0" && Common.nodeInfo[node[i]].RFID.StartsWith("A"))//料仓读取到RFID的才获取锁定信息
{
//获取料架锁定信息
AGVManager.GetShelfLockInfo(Common.nodeInfo[node[i]].Name, Common.nodeInfo[node[i]].RFID,shelfLockedNodeNames);
AGVManager.GetShelfLockInfo(Common.nodeInfo[node[i]].Name, Common.nodeInfo[node[i]].RFID, shelfLockedNodeNames);
nodeIdx = node[i];
break;
}
......@@ -557,7 +558,7 @@ namespace BLL
}
}
}
else if (Common.nodeInfo[node[i]].Name == "A1" && Common.nodeInfo[node[i]].RFID.StartsWith("B"))
else if (Common.nodeInfo[node[i]].Name == "A1" && Common.nodeInfo[node[i]].RFID.StartsWith("B"))//A1出料串,检查C1,3,5是否需要
{
int 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 == "C3" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
......@@ -569,7 +570,7 @@ namespace BLL
break;
}
}
else if (Common.nodeInfo[node[i]].Name == "A1" && Common.nodeInfo[node[i]].RFID.StartsWith("A"))
else if (Common.nodeInfo[node[i]].Name == "A1" && Common.nodeInfo[node[i]].RFID.StartsWith("A"))//B区域入料
{
if (FindAreaBEnter() > -1)
{
......@@ -577,7 +578,7 @@ namespace BLL
break;
}
}
else if(Common.nodeInfo[node[i]].Name == "C2" || Common.nodeInfo[node[i]].Name == "C4" || Common.nodeInfo[node[i]].Name == "C6")
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需要料
{
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);
......@@ -588,7 +589,7 @@ namespace BLL
break;
}
}
else if (Common.nodeInfo[node[i]].Name == "C8")
else if (Common.nodeInfo[node[i]].Name == "C8")//C8出往A2
{
int n = Common.nodeInfo.FindIndex(s => s.Name == "A2" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
//入料口没有占用
......@@ -617,14 +618,14 @@ namespace BLL
}
else
{
Common.log.OutInfo("test1 " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
Common.log.OutInfo("[StatusNone Assign Mission A1] " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
MoveNode(agv, nodeIdx);
return;
}
}
else
{
Common.log.OutInfo("test2 " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
Common.log.OutInfo("[StatusNone Assign Mission other] " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
MoveNode(agv, nodeIdx);
return;
}
......@@ -1308,7 +1309,7 @@ namespace BLL
if (agv.Mark.Length > 1)
{
rtn = FindNeedEnterWithMark(agv);
rtn = FindNeedEnterWithMark(agv, true);
if (!rtn)
{
//这个料架可以送走了
......@@ -1345,11 +1346,11 @@ namespace BLL
}
else
{
if(shelfLockedNodeNames !=null && shelfLockedNodeNames.Count>0)
if (shelfLockedNodeNames != null && shelfLockedNodeNames.Count > 0)
{
foreach (string item in shelfLockedNodeNames)
{
nodeIdx = Common.nodeInfo.FindIndex(s => s.Name == item && s.Action == ClientAction.NeedEnter && (s.AgvName == "" || s.AgvName ==agv.Name) && s.IsUse);
nodeIdx = Common.nodeInfo.FindIndex(s => s.Name == item && s.Action == ClientAction.NeedEnter && (s.AgvName == "" || s.AgvName == agv.Name) && s.IsUse);
if (nodeIdx > -1)
{
agv.NextMission = "";
......@@ -1360,7 +1361,7 @@ namespace BLL
{
int idx = Common.nodeInfo.FindIndex(s => s.Name == item);
log = string.Format("[{0}] [ClientAction={1}] [IsUse={2}],不能搬运锁定的料架,到待机位等待"
,item,Common.nodeInfo[idx].Action,Common.nodeInfo[idx].IsUse);
, item, Common.nodeInfo[idx].Action, Common.nodeInfo[idx].IsUse);
Common.log.OutInfo(log);
if (!agv.StandbyTemp)
{
......@@ -1796,7 +1797,7 @@ namespace BLL
{
try
{
string url = ConfigAppSettings.GetValue(Setting_Init.http_server)+"rest/api/qisda/device/emptyStoragePosCount";
string url = ConfigAppSettings.GetValue(Setting_Init.http_server) + "rest/api/qisda/device/emptyStoragePosCount";
Common.log.OutInfo("URL:" + url);
var client = new RestClient(url) { Timeout = -1 };
var request = new RestRequest(Method.GET);
......@@ -2014,7 +2015,7 @@ namespace BLL
}
}
private bool FindNeedEnterWithMark(Agv_Info agv)
private bool FindNeedEnterWithMark(Agv_Info agv, bool BAreaLeaveCheck = false)
{
//寻找下一个任务点
int nodeIdx = Common.nodeInfo.FindIndex(s => s.Action == ClientAction.NeedEnter && s.Mark == agv.Mark && s.AgvName == "" && s.IsUse);
......@@ -2024,15 +2025,27 @@ namespace BLL
}
else
{
bool rtn = AGVManager.LeaveCheck(agv,out int taskCount);
if (!BAreaLeaveCheck)
{
string log = agv.Name + " A4 FindNeedEnterWithMark [Mark=" + agv.Mark + "]";
Common.log.OutInfo(log);
return true;
}
bool rtn = AGVManager.LeaveCheck(agv, out int taskCount);
Thread.Sleep(3000);
if(!rtn)//出库任务还未完成
if (!rtn)//出库任务还未完成
{
//MoveStandby(agv);
if (!agv.StandbyTemp)
{
agv.StandbyTemp = true;
string log = agv.Name+ " [Mark=" + agv.Mark + "] 出库任务未完成,[taskCount=" + taskCount.ToString() + "] 移动到StandBy";
foreach (var item in Common.nodeInfo)
{
if (item.AgvName.Equals(agv.Name))
item.AgvName = "";
}
string log = agv.Name + " [Mark=" + agv.Mark + "] 出库任务未完成,[taskCount=" + taskCount.ToString() + "] 移动到StandBy";
Common.log.OutInfo(log);
Common.mir.Add_Mission_Fleet(agv, Common.agvMission["MoveStandbyTemp"]);
}
......@@ -2040,7 +2053,7 @@ namespace BLL
}
else
{
string log = agv.Name + " [Mark=" + agv.Mark +"] [taskCount = " + taskCount.ToString() + "] 出库任务完成";
string log = agv.Name + " [Mark=" + agv.Mark + "] [taskCount = " + taskCount.ToString() + "] 出库任务完成";
Common.log.OutInfo(log);
//Common.log.OutTextBox(log);
return false;
......
......@@ -345,6 +345,11 @@ namespace AGVControl
/// </summary>
public bool StandbyTemp { set; get; }
/// <summary>
/// 是否清除任务缓存
/// </summary>
public bool IsClearRunInfo = false;
public struct DockingStru
{
public DateTime startTime;
......
......@@ -44,7 +44,13 @@ namespace AGVControl
}
LstAgvPlace.Items.Clear();
LstAgvPlace.Items.AddRange(Common.agvMission.Keys.ToArray());
foreach (var item in Common.agvMission.Keys.ToArray())
{
if (item.Length.Equals(6))
continue;
LstAgvPlace.Items.Add(item);
}
LstAgvPlace.SelectedIndex = 0;
}
......@@ -175,6 +181,7 @@ namespace AGVControl
Common.agvInfo[e.RowIndex].Place = "";
Common.agvInfo[e.RowIndex].RFID = "";
Common.agvInfo[e.RowIndex].NextMission = "";
Common.agvInfo[e.RowIndex].IsClearRunInfo = true;
DgvAgv.Rows[e.RowIndex].SetValues(Common.agvInfo[e.RowIndex].ToRow());
//清除节点缓存
......@@ -228,11 +235,32 @@ namespace AGVControl
private void BtnMissionAdd_Click(object sender, EventArgs e)
{
try
{
if (DgvAgv.SelectedCells.Count == 0) return;
int idx = DgvAgv.SelectedCells[0].RowIndex;
if (idx < 0) return;
if (Common.agvInfo[idx].IsCon)
Common.mir.Add_Mission_Fleet(Common.agvInfo[idx], Common.agvMission[LstAgvPlace.Text]);
{
if(!Common.agvInfo[idx].IsClearRunInfo)
{
MessageBox.Show("请先清除当前小车的任务缓存!");
return;
}
bool rtn = Common.mir.Add_Mission_Fleet(Common.agvInfo[idx], Common.agvMission[LstAgvPlace.Text]);
if (!rtn)
return;
Common.agvInfo[idx].Place = "";
Common.agvInfo[idx].IsClearRunInfo = false;
//if (LstAgvPlace.Text.StartsWith("Move") && LstAgvPlace.Text.Length ==6)
//{
// Common.agvInfo[idx].Place = LstAgvPlace.Text.Substring(4);
//}
}
}
catch(Exception ex){ Common.log.OutInfo("手动添加任务失败: " + ex.Message + ex.StackTrace); };
}
private void BtnClearError_Click(object sender, EventArgs e)
......
......@@ -90,5 +90,5 @@ C:\ZDL\Gitee\AGVControl\AGVControl\obj\Debug\AGVControl.csproj.GenerateResource.
C:\ZDL\Gitee\AGVControl\AGVControl\obj\Debug\AGVControl.csproj.CopyComplete
C:\ZDL\Gitee\AGVControl\AGVControl\obj\Debug\AGVControl.exe
C:\ZDL\Gitee\AGVControl\AGVControl\obj\Debug\AGVControl.pdb
C:\ZDL\Gitee\AGVControl\AGVControl\obj\Debug\AGVControl.csprojAssemblyReference.cache
C:\ZDL\Gitee\AGVControl\AGVControl\obj\Debug\AGVControl.csproj.CoreCompileInputs.cache
C:\ZDL\Gitee\AGVControl\AGVControl\obj\Debug\AGVControl.csprojAssemblyReference.cache
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!