Commit 4a17d764 张东亮

1号车只运C5,C6

1 个父辈 33d7371d
......@@ -40,7 +40,7 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net">
<HintPath>..\..\..\..\DLL\log4net.dll</HintPath>
<HintPath>dll\log4net.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
......
......@@ -407,137 +407,168 @@ namespace BLL
bool rtn;
string log;
Agv_Info agv = Common.agvInfo[agvIdx];
//检测IO信号
rtn = Common.mir.Get_IO_Status(agv, out bool[] input, out bool[] output);
if (rtn)
if(agv.IP.Equals(Common.No1_IP))
{
if (input[3])
{
agv.IsUse = false;
AgvChanged?.Invoke(agvIdx);
//System.Windows.Forms.MessageBox.Show("关闭小车调用,因检测到车上有料架/料串,不执行任务!请将料架移除再打开调用。");
Common.log.Info("关闭小车调用,因检测到车上有料架/料串,不执行任务!请将料架移除再打开调用。");
return;
}
int nodeIdx = -1;
int high = 0, middle = 0, low = 0;
List<int> node = new List<int>();
//清除节点AGV的名称
foreach (var item in Common.nodeInfo)
//检测IO信号
rtn = Common.mir.Get_IO_Status(agv, out bool[] input, out bool[] output);
if (rtn)
{
if (item.AgvName.Equals(agv.Name))
if (input[3])
{
item.AgvName = "";
Common.log.Info("清除节点的AGV名称: 节点名:" + item.Name + ";AGV名称:" + agv.Name);
agv.IsUse = false;
AgvChanged?.Invoke(agvIdx);
//System.Windows.Forms.MessageBox.Show("关闭小车调用,因检测到车上有料架/料串,不执行任务!请将料架移除再打开调用。");
Common.log.Info("关闭小车调用,因检测到车上有料架/料串,不执行任务!请将料架移除再打开调用。");
return;
}
}
//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.Info("B区没有找到NeedEnter的节点");
}
else//B区域需要出料
{
//Mark没有被缓存
int n = Marks.FindIndex(t => t == Common.nodeInfo[nodeIdx].Mark);
if (n == -1)//
int nodeIdx = -1;
int high = 0, middle = 0, low = 0;
List<int> node = new List<int>();
//清除节点AGV的名称
foreach (var item in Common.nodeInfo)
{
n = Common.nodeInfo.FindIndex(s => s.Name == "A7" && s.Action == ClientAction.NeedLeave &&
s.RFID.StartsWith("A") && s.AgvName.Equals("") && s.IsUse);
if (n > -1)
if (item.AgvName.Equals(agv.Name))
{
agv.Place = Common.nodeInfo[n].Name;
agv.Mark = Common.nodeInfo[nodeIdx].Mark;
//agv.CloseDoor = false;
item.AgvName = "";
Common.log.Info("清除节点的AGV名称: 节点名:" + item.Name + ";AGV名称:" + agv.Name);
}
rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Move" + agv.Place]);
if (rtn)
}
//需要出料架,且没有被标记
//A4是包装料仓的进料,不包含在内
//根据优先级调用
for (int i = 0; i < Common.nodeInfo.Count; i++)
{
if (Common.nodeInfo[i].Action == ClientAction.NeedLeave && Common.nodeInfo[i].Name != "A4" &&
Common.nodeInfo[i].AgvName == "" && Common.nodeInfo[i].IsUse)
{
switch (Common.nodeInfo[i].Level)
{
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()));
case ClientLevel.High:
node.Insert(high++, i);
middle++;
low++;
break;
case ClientLevel.Middle:
node.Insert(middle++, i);
low++;
break;
case ClientLevel.Low:
node.Insert(low++, i);
break;
}
}
}
log = string.Format("{0} Move To {1}[{2}] [{3}]", agv.Name, agv.Place,
Common.nodeInfo[nodeIdx].Action.ToString(), Common.nodeInfo[nodeIdx].Mark);
Common.log.Info(log);
Common.ShowLog(log);
Common.mir.State_Ready(agv);
Common.server.NodeRefresh(n);
if (node.Count == 0)
{
nodeIdx = -1;
}
else
{
//按顺序取符合要求的
for (int i = 0; i < node.Count; i++)
{
if (Common.nodeInfo[node[i]].Name == "A1" && Common.nodeInfo[node[i]].RFID.StartsWith("B"))//A1出料串,检查C5是否需要
{
int n = Common.nodeInfo.FindIndex(s => s.Name == "C5" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
if (n > -1)
{
nodeIdx = node[i];
break;
}
}
else
else if (agv.IP.Equals(Common.No1_IP) && Common.nodeInfo[node[i]].Name == "C6")//C6准备出空架子,A2需要料
{
agv.TaskSend = false;
log = string.Format("{0} Move To {1} 失败", agv.Name, agv.Place);
//防止上一个任务已执行但返回失败时,删除任务
//Common.mir.Del_Mission(agv);
Common.log.Info(log);
Common.ShowLog(log);
int n = Common.nodeInfo.FindIndex(s => s.Name == "A2" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
//入料口有一个没有占用
if (n > -1)
{
nodeIdx = node[i];
break;
}
}
}
else
if (nodeIdx > -1)
{
//A4没有被占用
n = Common.nodeInfo.FindIndex(s => s.Name == "A4" && s.Action == ClientAction.NeedLeave && s.AgvName.Equals("") && s.IsUse);
if (n == -1)
if (Common.nodeInfo[nodeIdx].Name == "A1")
{
nodeIdx = -1;
Common.log.Info("A7,A4不是NeedLeave或被占用");
//Common.log.OutTextBox("A7,A4没有架子或被占用");
#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.Info(log);
// Common.ShowLog(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.Info(log);
// Common.ShowLog(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.Info(log);
// Common.ShowLog(log);
// }
//}
#endregion
if (Common.nodeInfo[nodeIdx].RFID.Length == 0 || Common.nodeInfo[nodeIdx].RFID == "00")
{
Common.log.Info("A1 RFID 错误");
//Common.log.OutTextBox("A1 RFID 错误");
return;
}
else
{
Common.log.Info("[StatusNone Assign Mission A1] " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
MoveNode(agv, nodeIdx);
return;
}
}
else
{
Common.log.Info("[StatusNone Assign Mission other] " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
MoveNode(agv, nodeIdx);
return;
}
}
}
}
}
else //除1号小车
{
//检测IO信号
rtn = Common.mir.Get_IO_Status(agv, out bool[] input, out bool[] output);
if (rtn)
{
if (input[3])
{
agv.IsUse = false;
AgvChanged?.Invoke(agvIdx);
//System.Windows.Forms.MessageBox.Show("关闭小车调用,因检测到车上有料架/料串,不执行任务!请将料架移除再打开调用。");
Common.log.Info("关闭小车调用,因检测到车上有料架/料串,不执行任务!请将料架移除再打开调用。");
return;
}
int nodeIdx = -1;
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 = "";
Common.log.Info("清除节点的AGV名称: 节点名:" + item.Name + ";AGV名称:" + agv.Name);
}
}
//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.Info("B区没有找到NeedEnter的节点");
}
else//B区域需要出料
{
//Mark没有被缓存
int n = Marks.FindIndex(t => t == Common.nodeInfo[nodeIdx].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);
if (n > -1)
{
agv.Place = Common.nodeInfo[n].Name;
agv.Mark = Common.nodeInfo[nodeIdx].Mark;
//agv.CloseDoor = false;
......@@ -550,7 +581,7 @@ namespace BLL
agv.TaskSend = true;
//_mark.Add(Common.nodeInfo[nodeIdx].Mark);
MarkAdd(Common.nodeInfo[nodeIdx].Mark);
Common.log.Info("Mark缓存 " + string.Join(",", Marks.ToArray()));
//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);
......@@ -568,146 +599,243 @@ namespace BLL
Common.log.Info(log);
Common.ShowLog(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.Info("A7,A4不是NeedLeave或被占用");
//Common.log.OutTextBox("A7,A4没有架子或被占用");
#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.Info(log);
// Common.ShowLog(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.Info(log);
// Common.ShowLog(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.Info(log);
// Common.ShowLog(log);
// }
//}
#endregion
}
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.Info("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.Info(log);
Common.ShowLog(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.Info(log);
Common.ShowLog(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]);
//_mark.Add(Common.nodeInfo[nodeIdx].Mark);
////Common.log.OutString("Mark缓存 " + string.Join(",", _mark.ToArray()));
//log = string.Format("{0} Move {1} {2} {3}", agv.Name, agv.Place, Common.nodeInfo[nodeIdx].Action.ToString(), Common.nodeInfo[nodeIdx].Mark);
//Common.log.Info(log);
//Common.ShowLog(log);
//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]);
//rtn = Common.mir.State_Ready(agv);
//Common.server.NodeRefresh(n);
//log = string.Format("{0} Move {1} {2} {3}", agv.Name, agv.Place, Common.nodeInfo[nodeIdx].Action.ToString(), Common.nodeInfo[nodeIdx].Mark);
//Common.log.Info(log);
//Common.ShowLog(log);
AgvChanged?.Invoke(agvIdx);
return;
//rtn = Common.mir.State_Ready(agv);
//Common.server.NodeRefresh(n);
AgvChanged?.Invoke(agvIdx);
return;
}
}
}
}
else
{
Common.log.Info("缓存中已存在 " + Common.nodeInfo[nodeIdx].Mark);
nodeIdx = -1;
}
}
else
{
Common.log.Info("缓存中已存在 " + Common.nodeInfo[nodeIdx].Mark);
nodeIdx = -1;
}
}
//需要出料架,且没有被标记
//A4是包装料仓的进料,不包含在内
//根据优先级调用
for (int i = 0; i < Common.nodeInfo.Count; i++)
{
if (Common.nodeInfo[i].Action == ClientAction.NeedLeave && Common.nodeInfo[i].Name != "A4" &&
Common.nodeInfo[i].AgvName == "" && Common.nodeInfo[i].IsUse)
//需要出料架,且没有被标记
//A4是包装料仓的进料,不包含在内
//根据优先级调用
for (int i = 0; i < Common.nodeInfo.Count; i++)
{
switch (Common.nodeInfo[i].Level)
if (Common.nodeInfo[i].Action == ClientAction.NeedLeave && Common.nodeInfo[i].Name != "A4" &&
Common.nodeInfo[i].AgvName == "" && Common.nodeInfo[i].IsUse)
{
case ClientLevel.High:
node.Insert(high++, i);
middle++;
low++;
break;
case ClientLevel.Middle:
node.Insert(middle++, i);
low++;
break;
case ClientLevel.Low:
node.Insert(low++, i);
break;
switch (Common.nodeInfo[i].Level)
{
case ClientLevel.High:
node.Insert(high++, i);
middle++;
low++;
break;
case ClientLevel.Middle:
node.Insert(middle++, i);
low++;
break;
case ClientLevel.Low:
node.Insert(low++, i);
break;
}
}
}
}
//测试,临时的
//for (int i = 0; i < node.Count; i++)
//{
// //Common.log.OutString("Test " + node[i] + " Name=" + Common.nodeInfo[node[i]].Name + " Mark=" + Common.nodeInfo[node[i]].Mark);
//}
//测试,临时的
//for (int i = 0; i < node.Count; i++)
//{
// //Common.log.OutString("Test " + node[i] + " Name=" + Common.nodeInfo[node[i]].Name + " Mark=" + Common.nodeInfo[node[i]].Mark);
//}
if (node.Count == 0)
{
nodeIdx = -1;
Common.log.Info("没有找到新的NeedLeave的节点");
}
else
{
//按顺序取符合要求的
for (int i = 0; i < node.Count; i++)
if (node.Count == 0)
{
nodeIdx = -1;
Common.log.Info("没有找到新的NeedLeave的节点");
}
else
{
//B区域出料架
if (Common.nodeInfo[node[i]].Name.StartsWith("B"))
//按顺序取符合要求的
for (int i = 0; i < node.Count; i++)
{
if (Common.nodeInfo[node[i]].Mark == "0" && Common.nodeInfo[node[i]].RFID.StartsWith("A"))//料仓读取到RFID的才获取锁定信息
//B区域出料架
if (Common.nodeInfo[node[i]].Name.StartsWith("B"))
{
//获取料架锁定信息
AGVManager.GetShelfLockInfo(Common.nodeInfo[node[i]].Name, Common.nodeInfo[node[i]].RFID, shelfLockedNodeNames);
nodeIdx = node[i];
break;
}
else
{
//在Mark缓存中,按照先后顺序出料,只有第一个出完才能出第二个
int idx = Marks.FindIndex(s => s == Common.nodeInfo[node[i]].Mark);
if (idx == 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);
nodeIdx = node[i];
break;
}
else if (idx == -1) //缓存中没有这个mark,可能是软件重启了
else
{
//_mark.Add(Common.nodeInfo[node[i]].Mark);
MarkAdd(Common.nodeInfo[node[i]].Mark);
nodeIdx = node[i];
break;
//在Mark缓存中,按照先后顺序出料,只有第一个出完才能出第二个
int idx = Marks.FindIndex(s => s == Common.nodeInfo[node[i]].Mark);
if (idx == 0)
{
nodeIdx = node[i];
break;
}
else if (idx == -1) //缓存中没有这个mark,可能是软件重启了
{
//_mark.Add(Common.nodeInfo[node[i]].Mark);
MarkAdd(Common.nodeInfo[node[i]].Mark);
nodeIdx = node[i];
break;
}
}
}
}
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);
if (n == -1) n = Common.nodeInfo.FindIndex(s => s.Name == "C5" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
//入料口有一个没有占用
if (n > -1)
else if (Common.nodeInfo[node[i]].Name == "A1" && Common.nodeInfo[node[i]].RFID.StartsWith("B"))//A1出料串,检查C1,3,5是否需要
{
nodeIdx = node[i];
break;
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);
//入料口有一个没有占用
if (n > -1)
{
nodeIdx = node[i];
break;
}
}
}
else if (Common.nodeInfo[node[i]].Name == "A1" && Common.nodeInfo[node[i]].RFID.StartsWith("A"))//B区域入料
{
if (FindAreaBEnter() > -1)
else if (Common.nodeInfo[node[i]].Name == "A1" && Common.nodeInfo[node[i]].RFID.StartsWith("A"))//B区域入料
{
nodeIdx = node[i];
break;
if (FindAreaBEnter() > -1)
{
nodeIdx = node[i];
break;
}
}
}
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)
else if (Common.nodeInfo[node[i]].Name == "A7" && Common.nodeInfo[node[i]].RFID.StartsWith("B"))//C7入料
{
nodeIdx = node[i];
break;
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 == "A7" && Common.nodeInfo[node[i]].RFID.StartsWith("A"))//A7有空料架
{
int n = Common.nodeInfo.FindIndex(s => s.Name == "A4" && s.Action == ClientAction.None && s.IsUse);
if (n > -1)//B区域无出库任务,A4无料架,往A3送一个空架子,便于出料串
else if (Common.nodeInfo[node[i]].Name == "A7" && Common.nodeInfo[node[i]].RFID.StartsWith("A"))//A7有空料架
{
n = Common.nodeInfo.FindIndex(s => s.Name == "A3" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
int n = Common.nodeInfo.FindIndex(s => s.Name == "A4" && s.Action == ClientAction.None && s.IsUse);
if (n > -1)//B区域无出库任务,A4无料架,往A3送一个空架子,便于出料串
{
n = Common.nodeInfo.FindIndex(s => s.Name == "A3" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
//入料口有一个没有占用
if (n > -1)
{
nodeIdx = node[i];
break;
}
}
n = Common.nodeInfo.FindIndex(s => s.Name == "C7" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
//入料口有一个没有占用
if (n > -1)
{
......@@ -715,86 +843,80 @@ namespace BLL
break;
}
}
n = Common.nodeInfo.FindIndex(s => s.Name == "C7" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
//入料口有一个没有占用
if (n > -1)
else if (Common.nodeInfo[node[i]].Name == "C2" || Common.nodeInfo[node[i]].Name == "C4")//C2,4准备出空架子,A2需要料
{
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);
if (n == -1) n = Common.nodeInfo.FindIndex(s => s.Name == "A2" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
//入料口有一个没有占用
if (n > -1)
{
nodeIdx = node[i];
break;
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)
{
nodeIdx = node[i];
break;
}
}
}
else if (Common.nodeInfo[node[i]].Name == "C8")//C8出往A8
{
int n = Common.nodeInfo.FindIndex(s => s.Name == "A8" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
//入料口没有占用
if (n > -1)
else if (Common.nodeInfo[node[i]].Name == "C8")//C8出往A8
{
nodeIdx = node[i];
break;
int n = Common.nodeInfo.FindIndex(s => s.Name == "A8" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
//入料口没有占用
if (n > -1)
{
nodeIdx = node[i];
break;
}
}
//else if(!Common.nodeInfo[node[i]].Equals("C5") || !Common.nodeInfo[node[i]].Equals("C6"))
//{
// nodeIdx = node[i];
// break;
//}
}
else
{
nodeIdx = node[i];
break;
}
}
if (nodeIdx > -1)
{
if (Common.nodeInfo[nodeIdx].Name == "A1")
if (nodeIdx > -1)
{
if (Common.nodeInfo[nodeIdx].RFID.Length == 0 || Common.nodeInfo[nodeIdx].RFID == "00")
if (Common.nodeInfo[nodeIdx].Name == "A1")
{
Common.log.Info("A1 RFID 错误");
//Common.log.OutTextBox("A1 RFID 错误");
return;
if (Common.nodeInfo[nodeIdx].RFID.Length == 0 || Common.nodeInfo[nodeIdx].RFID == "00")
{
Common.log.Info("A1 RFID 错误");
//Common.log.OutTextBox("A1 RFID 错误");
return;
}
else
{
Common.log.Info("[StatusNone Assign Mission A1] " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
MoveNode(agv, nodeIdx);
return;
}
}
else
{
Common.log.Info("[StatusNone Assign Mission A1] " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
Common.log.Info("[StatusNone Assign Mission other] " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
MoveNode(agv, nodeIdx);
return;
}
}
else
{
Common.log.Info("[StatusNone Assign Mission other] " + agv.Name + " " + Common.nodeInfo[nodeIdx].Name);
MoveNode(agv, nodeIdx);
return;
}
}
//Common.nodeInfo[nodeIdx].AgvName = agv.Name;
//agv.Place = Common.nodeInfo[nodeIdx].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}", agv.Name, agv.Place, Common.nodeInfo[nodeIdx].Action.ToString());
//Common.log.Info(log);
//Common.ShowLog(log);
//rtn = Common.mir.State_Ready(agv);
//Common.nodeInfo[nodeIdx].AgvName = agv.Name;
//agv.Place = Common.nodeInfo[nodeIdx].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}", agv.Name, agv.Place, Common.nodeInfo[nodeIdx].Action.ToString());
//Common.log.Info(log);
//Common.ShowLog(log);
//rtn = Common.mir.State_Ready(agv);
//AgvChanged?.Invoke(agvIdx);
//Common.server.NodeRefresh(nodeIdx);
//return;
//AgvChanged?.Invoke(agvIdx);
//Common.server.NodeRefresh(nodeIdx);
//return;
}
}
}
}
}
catch (Exception ex)
{
......@@ -1147,8 +1269,9 @@ namespace BLL
rtn = B123456Enter(agv); break;
case "C2":
case "C4":
rtn = C24Enter(agv); break;
case "C6":
rtn = C246Enter(agv); break;
rtn = C6Enter(agv); break;
case "C8":
rtn = C8Enter(agv); break;
case "D2":
......@@ -1402,16 +1525,46 @@ namespace BLL
nodeIdx = FindAreaC();
if (nodeIdx > -1)
{
rtn = MoveNode(agv, nodeIdx);
if (rtn)
string nodeName = Common.nodeInfo[nodeIdx].Name;
if (nodeName.Equals("C5") && agv.IP.Equals(Common.No1_IP))
{
agv.NextMission = "";
Common.log.Info(agv.Name + " A1出料串[" + agv.RFID + "],去[" + Common.nodeInfo[nodeIdx].Name + "]入库");
rtn = MoveNode(agv, nodeIdx);
if (rtn)
{
agv.NextMission = "";
Common.log.Info(agv.Name + " A1出料串[" + agv.RFID + "],去[" + Common.nodeInfo[nodeIdx].Name + "]入库");
}
else
{
agv.NextMission = Common.nodeInfo[nodeIdx].Name;
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
}
}
else if (!nodeName.Equals("C5") && !agv.IP.Equals(Common.No1_IP))
{
rtn = MoveNode(agv, nodeIdx);
if (rtn)
{
agv.NextMission = "";
Common.log.Info(agv.Name + " A1出料串[" + agv.RFID + "],去[" + Common.nodeInfo[nodeIdx].Name + "]入库");
}
else
{
agv.NextMission = Common.nodeInfo[nodeIdx].Name;
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
}
}
else
{
agv.NextMission = Common.nodeInfo[nodeIdx].Name;
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
if (!agv.StandbyTemp)
{
agv.StandbyTemp = true;
log = agv.Name + " A1出料串[" + agv.RFID + "] C区暂时没有位置";
agv.NextMission = "C区";
Common.mir.Add_Mission_Fleet(agv, Common.agvMission["MoveStandbyTemp"]);
Common.log.Info(log);
Common.ShowLog(log);
}
}
}
else
......@@ -1882,12 +2035,12 @@ namespace BLL
rtn = FindNeedLeave(agv, "C4");
if (rtn)
Common.log.Info(agv.Name + " 在C1送完料串,检测到C4出料串任务[A2可以进料],开始执行");
if (!rtn)
{
rtn = FindNeedLeave(agv, "C6");
if (rtn)
Common.log.Info(agv.Name + " 在C1送完料串,检测到C6出料串任务[A2可以进料],开始执行");
}
//if (!rtn)
//{
// rtn = FindNeedLeave(agv, "C6");
// if (rtn)
// Common.log.Info(agv.Name + " 在C1送完料串,检测到C6出料串任务[A2可以进料],开始执行");
//}
}
if (!rtn)
......@@ -1898,12 +2051,12 @@ namespace BLL
rtn = FindNeedLeave(agv, "C4");
if (rtn)
Common.log.Info(agv.Name + " 在C1送完料串,检测到C4出料串任务[A2不可以进料,C7可以进料],开始执行");
if (!rtn)
{
rtn = FindNeedLeave(agv, "C6");
if (rtn)
Common.log.Info(agv.Name + " 在C1送完料串,检测到C6出料串任务[A2不可以进料,C7可以进料],开始执行");
}
//if (!rtn)
//{
// rtn = FindNeedLeave(agv, "C6");
// if (rtn)
// Common.log.Info(agv.Name + " 在C1送完料串,检测到C6出料串任务[A2不可以进料,C7可以进料],开始执行");
//}
}
}
......@@ -1923,7 +2076,7 @@ namespace BLL
{
rtn = MoveStandby(agv);
if (rtn)
Common.log.Info(agv.Name + " 在C1送完料串,C4,C6,A1,D2暂无任务,回待机位");
Common.log.Info(agv.Name + " 在C1送完料串,C4,A1,D2暂无任务,回待机位");
}
return rtn;
......@@ -1943,12 +2096,12 @@ namespace BLL
rtn = FindNeedLeave(agv, "C4");
if (rtn)
Common.log.Info(agv.Name + " 在C3送完料串,检测到C4出料串任务[A2可以进料],开始执行");
if (!rtn)
{
rtn = FindNeedLeave(agv, "C6");
if (rtn)
Common.log.Info(agv.Name + " 在C3送完料串,检测到C6出料串任务[A2可以进料],开始执行");
}
//if (!rtn)
//{
// rtn = FindNeedLeave(agv, "C6");
// if (rtn)
// Common.log.Info(agv.Name + " 在C3送完料串,检测到C6出料串任务[A2可以进料],开始执行");
//}
}
if (!rtn)
......@@ -1959,12 +2112,12 @@ namespace BLL
rtn = FindNeedLeave(agv, "C4");
if (rtn)
Common.log.Info(agv.Name + " 在C3送完料串,检测到C4出料串任务[A2不可以进料,C7可以进料],开始执行");
if (!rtn)
{
rtn = FindNeedLeave(agv, "C6");
if (rtn)
Common.log.Info(agv.Name + " 在C3送完料串,检测到C6出料串任务[A2不可以进料,C7可以进料],开始执行");
}
//if (!rtn)
//{
// rtn = FindNeedLeave(agv, "C6");
// if (rtn)
// Common.log.Info(agv.Name + " 在C3送完料串,检测到C6出料串任务[A2不可以进料,C7可以进料],开始执行");
//}
}
}
......@@ -1985,7 +2138,7 @@ namespace BLL
{
rtn = MoveStandby(agv);
if (rtn)
Common.log.Info(agv.Name + " 在C3送完料串,C4,C6,A1,D2暂无任务,回待机位");
Common.log.Info(agv.Name + " 在C3送完料串,C4,A1,D2暂无任务,回待机位");
}
......@@ -2013,16 +2166,16 @@ namespace BLL
Common.log.Info(agv.Name + " 在C5送完料串,检测到C6出料串任务[A2可以进料],开始执行");
}
if (!rtn)
{
nodeIdx = Common.nodeInfo.FindIndex(s => s.Name == "C7" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
if (nodeIdx > -1)
{
rtn = FindNeedLeave(agv, "C6");
if (rtn)
Common.log.Info(agv.Name + " 在C5送完料串,检测到C6出料串任务[A2不可以进料,C7可以进料],开始执行");
}
}
//if (!rtn)
//{
// nodeIdx = Common.nodeInfo.FindIndex(s => s.Name == "C7" && s.Action == ClientAction.NeedEnter && s.AgvName == "" && s.IsUse);
// if (nodeIdx > -1)
// {
// rtn = FindNeedLeave(agv, "C6");
// if (rtn)
// Common.log.Info(agv.Name + " 在C5送完料串,检测到C6出料串任务[A2不可以进料,C7可以进料],开始执行");
// }
//}
if (!rtn)
{
......@@ -2040,7 +2193,7 @@ namespace BLL
{
rtn = MoveStandby(agv);
if (rtn)
Common.log.Info(agv.Name + " 在C3送完料串,C6,A1,D2暂无任务,回待机位");
Common.log.Info(agv.Name + " 在C5送完料串,C6,A1,D2暂无任务,回待机位");
}
//bool rtn = FindNeedLeave(agv, "C6");
......@@ -2084,11 +2237,11 @@ namespace BLL
}
/// <summary>
/// 【满车】料串进入小车,离开C2,4,6
/// 【满车】料串进入小车,离开C2,4
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
private bool C246Enter(Agv_Info agv)
private bool C24Enter(Agv_Info agv)
{
string log;
bool rtn;
......@@ -2098,7 +2251,7 @@ namespace BLL
if (rtn)
{
agv.NextMission = "";
Common.log.Info(agv.Name + " 在C2/4/6进入空料串,检测到C7需要料串,开始执行");
Common.log.Info(agv.Name + " 在C2/4进入空料串,检测到C7需要料串,开始执行");
return true;
}
......@@ -2106,7 +2259,7 @@ namespace BLL
if (rtn)
{
agv.NextMission = "";
Common.log.Info(agv.Name + " 在C2/4/6进入空料串,检测到D1需要料串,开始执行");
Common.log.Info(agv.Name + " 在C2/4进入空料串,检测到D1需要料串,开始执行");
return true;
}
......@@ -2114,7 +2267,7 @@ namespace BLL
if (rtn)
{
agv.NextMission = "";
Common.log.Info(agv.Name + " 在C2/4/6进入空料串,检测到A2需要料串,开始执行");
Common.log.Info(agv.Name + " 在C2/4进入空料串,检测到A2需要料串,开始执行");
return true;
}
......@@ -2124,7 +2277,33 @@ namespace BLL
agv.NextMission = "A2";
rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["MoveStandbyTemp"]);
if (rtn)
Common.log.Info(agv.Name + " 在C2/4/6进入空料串,C7,D1,A2不需要料串,回待机位");
Common.log.Info(agv.Name + " 在C2/4进入空料串,C7,D1,A2不需要料串,回待机位");
return false;
}
return false;
}
private bool C6Enter(Agv_Info agv)
{
string log;
bool rtn;
//C7紧急料优先放架子
rtn = FindNeedEnter(agv, "A2");
if (rtn)
{
agv.NextMission = "";
Common.log.Info(agv.Name + " 在C6进入空料串,检测到A2需要料串,开始执行");
return true;
}
if (!agv.StandbyTemp)
{
agv.StandbyTemp = true;
agv.NextMission = "A2";
rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["MoveStandbyTemp"]);
if (rtn)
Common.log.Info(agv.Name + " 在C6进入空料串,A2不需要料串,回待机位");
return false;
}
return false;
......@@ -2216,16 +2395,48 @@ namespace BLL
nodeIdx = FindAreaC();
if (nodeIdx > -1)
{
rtn = MoveNode(agv, nodeIdx);
if (rtn)
string nodeName = Common.nodeInfo[nodeIdx].Name;
if (nodeName.Equals("C5") && agv.IP.Equals(Common.No1_IP))
{
agv.NextMission = "";
Common.log.Info(agv.Name + " 在D2进入料串,送往C区");
rtn = MoveNode(agv, nodeIdx);
if (rtn)
{
agv.NextMission = "";
Common.log.Info(agv.Name + " 在D2进入料串,送往C区");
}
else
{
agv.NextMission = "C区";
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
}
}
else if (!nodeName.Equals("C5") && !agv.IP.Equals(Common.No1_IP))
{
rtn = MoveNode(agv, nodeIdx);
if (rtn)
{
agv.NextMission = "";
Common.log.Info(agv.Name + " 在D2进入料串,送往C区");
}
else
{
agv.NextMission = "C区";
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
}
}
else
{
agv.NextMission = "C区";
//Common.mir.Add_Mission_Fleet(agv, "Common.agvMission["MoveStandbyTemp"]");
if (!agv.StandbyTemp)
{
agv.StandbyTemp = true;
log = agv.Name + " D2[点料机]出料架 C区暂时没有位置";
agv.NextMission = "C区";
Common.mir.Add_Mission_Fleet(agv, Common.agvMission["MoveStandbyTemp"]);
Common.log.Info(log);
Common.ShowLog(log);
}
}
}
else
......@@ -3129,7 +3340,7 @@ namespace BLL
agv.CloseDoor = false;
Common.nodeInfo[nodeIdx].AgvName = agv.Name;
agv.TaskSend = true;
log = string.Format("{0} MoveTtoNode {1} {2}", agv.Name, agv.Place, Common.nodeInfo[nodeIdx].Action.ToString());
log = string.Format("{0} MoveToNode {1} {2}", agv.Name, agv.Place, Common.nodeInfo[nodeIdx].Action.ToString());
Common.log.Info(log);
Common.ShowLog(log);
Common.mir.State_Ready(agv);
......@@ -3138,7 +3349,7 @@ namespace BLL
else
{
agv.TaskSend = false;
log = string.Format("{0} MoveTtoNode {1} 失败", agv.Name, agv.Place);
log = string.Format("{0} MoveToNode {1} 失败", agv.Name, agv.Place);
//防止上一个任务已执行但返回失败时,删除任务
//Common.mir.Del_Mission(agv);
Common.log.Info(log);
......
......@@ -385,7 +385,7 @@ namespace BLL
string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text";
string json = HttpGet(url, info.IP, info.Authorization);
Common.log.Info("URL: " + url+"\n"+"Return: " + json);
Common.log.Debug("URL: " + url+"\n"+"Return: " + json);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
......
......@@ -22,6 +22,7 @@ namespace AGVControl
public static readonly string LOG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Log";
public static readonly string CONFIG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Config\\";
public static string No1_IP = "10.85.199.67";
public static void ShowLog(string s)
{
if (txtLog == null) return;
......
此文件类型无法预览
6e0a935f2fc071fe41a8b4e4966fbe7ca4dacc89
8da7a79df2cfe73788bf4aeb9a8db9dab2618e7c
......@@ -94,3 +94,20 @@ C:\ZDL\Gitee\AGVControl\AGVControl\obj\Debug\AGVControl.csprojAssemblyReference.
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl\AGVControl\bin\Debug\Newtonsoft.Json.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl\AGVControl\bin\Debug\log4net.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl\AGVControl\obj\Debug\AGVControl.csprojAssemblyReference.cache
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\bin\Debug\AGVControl.exe.config
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\bin\Debug\AGVControl.exe
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\bin\Debug\AGVControl.pdb
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\bin\Debug\log4net.dll
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\bin\Debug\Newtonsoft.Json.dll
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\bin\Debug\RestSharp.dll
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\bin\Debug\RestSharp.xml
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\Interop.IWshRuntimeLibrary.dll
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\AGVControl.csproj.ResolveComReference.cache
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\AGVControl.FrmMain.resources
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\AGVControl.Properties.Resources.resources
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\AGVControl.csproj.GenerateResource.cache
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\AGVControl.csproj.CoreCompileInputs.cache
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\AGVControl.csproj.CopyComplete
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\AGVControl.exe
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\AGVControl.pdb
C:\Users\dolen\Desktop\AGVControl-Temp\AGVControl\obj\Debug\AGVControl.csprojAssemblyReference.cache
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!