Commit 85238ee5 张东亮

添加风淋门

1 个父辈 54be25c3
...@@ -24,6 +24,8 @@ namespace AGVControl ...@@ -24,6 +24,8 @@ namespace AGVControl
public const string CheckShelf = "CheckShelf"; public const string CheckShelf = "CheckShelf";
public const string DoorDToC = "DoorDToC"; public const string DoorDToC = "DoorDToC";
public const string DoorCToD = "DoorCToD"; public const string DoorCToD = "DoorCToD";
public const string DoorAirIn = "DoorAirIn";
public const string DoorAirOut = "DoorAirOut";
public const string DoubleLine_Name_Prefix = "A"; public const string DoubleLine_Name_Prefix = "A";
public const string Wait = "Wait"; public const string Wait = "Wait";
public const string Done = "Done"; public const string Done = "Done";
...@@ -67,6 +69,8 @@ namespace AGVControl ...@@ -67,6 +69,8 @@ namespace AGVControl
public const string IP_4D_Light = "IP_4D_Light"; public const string IP_4D_Light = "IP_4D_Light";
public const string IP_4C_Light = "IP_4C_Light"; public const string IP_4C_Light = "IP_4C_Light";
public const string Lines_In_Air_Door = "C8,C9,C10";
} }
...@@ -559,7 +563,15 @@ namespace AGVControl ...@@ -559,7 +563,15 @@ namespace AGVControl
agv.Place = doorName; agv.Place = doorName;
return Common.mir.Add_Mission_Fleet(agv, Common.agvMission[SettingString.Move + doorName]); return Common.mir.Add_Mission_Fleet(agv, Common.agvMission[SettingString.Move + doorName]);
} }
/// <summary>
/// 检查是否在4C风淋门内
/// </summary>
/// <param name="nodeName"></param>
/// <returns></returns>
public static bool CheckIsInAirDoor(string nodeName)
{
return SettingString.Lines_In_Air_Door.Contains(nodeName);
}
/// <summary> /// <summary>
/// 检查当前任务是否结束 /// 检查当前任务是否结束
/// </summary> /// </summary>
...@@ -596,11 +608,10 @@ namespace AGVControl ...@@ -596,11 +608,10 @@ namespace AGVControl
/// <param name="nodeName">出空料架的节点名</param> /// <param name="nodeName">出空料架的节点名</param>
/// <param name="emptyAGVbACK">agv空车返回,带一个料架</param> /// <param name="emptyAGVbACK">agv空车返回,带一个料架</param>
/// <returns></returns> /// <returns></returns>
public static bool FindEmptyShelfNode(Agv_Info agv, out string nodeName, out string rfid, bool emptyAGVbACK = false) public static bool FindEmptyShelfNode(Agv_Info agv, out string nodeName, bool emptyAGVbACK = false)
{ {
nodeName = ""; nodeName = "";
rfid = "";
if (!Common.CheckCanExecuteMission(agv)) if (!Common.CheckCanExecuteMission(agv))
return false; return false;
...@@ -614,14 +625,6 @@ namespace AGVControl ...@@ -614,14 +625,6 @@ namespace AGVControl
idx = nodeInfo.FindIndex(s => s.Name.Equals(FullShelfDestInfo.location) && s.EmptyShelfCnt > 0); idx = nodeInfo.FindIndex(s => s.Name.Equals(FullShelfDestInfo.location) && s.EmptyShelfCnt > 0);
if (idx > -1) if (idx > -1)
{ {
if (!Common.missionManager.GetUnlockRfids(Common.nodeInfo[idx].Name).Contains(nodeInfo[idx].RFID))
{
warnMsg = string.Format("料架{0}在接驳台{1}最外侧,但没有解绑信息,请检查", nodeInfo[idx].RFID, nodeInfo[idx].Name);
Common.LogInfo(warnMsg);
return true;
}
rfid = nodeInfo[idx].RFID;
warnMsg = "";
if (FullShelfDestInfo.location.StartsWith(SettingString.C4_Name_Prefix) && SettingString.C4_AGV_IPs.Contains(agv.IP)) if (FullShelfDestInfo.location.StartsWith(SettingString.C4_Name_Prefix) && SettingString.C4_AGV_IPs.Contains(agv.IP))
{ {
nodeName = FullShelfDestInfo.location; nodeName = FullShelfDestInfo.location;
...@@ -661,14 +664,6 @@ namespace AGVControl ...@@ -661,14 +664,6 @@ namespace AGVControl
if (idx > -1) if (idx > -1)
{ {
if (!Common.missionManager.GetUnlockRfids(Common.nodeInfo[idx].Name).Contains(nodeInfo[idx].RFID))
{
warnMsg = string.Format("料架{0}在接驳台{1}最外侧,但没有解绑信息,请检查", nodeInfo[idx].RFID, nodeInfo[idx].Name);
Common.LogInfo(warnMsg);
return true;
}
rfid = nodeInfo[idx].RFID;
warnMsg = "";
if (loc.StartsWith(SettingString.C4_Name_Prefix) && SettingString.C4_AGV_IPs.Contains(agv.IP)) if (loc.StartsWith(SettingString.C4_Name_Prefix) && SettingString.C4_AGV_IPs.Contains(agv.IP))
{ {
nodeName = loc; nodeName = loc;
...@@ -701,15 +696,6 @@ namespace AGVControl ...@@ -701,15 +696,6 @@ namespace AGVControl
{ {
return false; return false;
} }
idx = nodeInfo.FindIndex(s => s.Name.Equals(nearNodeName));
if (!Common.missionManager.GetUnlockRfids(Common.nodeInfo[idx].Name).Contains(nodeInfo[idx].RFID))
{
warnMsg = string.Format("料架{0}在接驳台{1}最外侧,但没有解绑信息,请检查", nodeInfo[idx].RFID, nodeInfo[idx].Name);
Common.LogInfo(warnMsg);
return true;
}
rfid = nodeInfo[idx].RFID;
warnMsg = "";
nodeName = nearNodeName; nodeName = nearNodeName;
Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4C-" + nearNodeName); Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4C-" + nearNodeName);
return true; return true;
...@@ -723,15 +709,6 @@ namespace AGVControl ...@@ -723,15 +709,6 @@ namespace AGVControl
{ {
return false; return false;
} }
idx = nodeInfo.FindIndex(s => s.Name.Equals(nearNodeName));
if (!Common.missionManager.GetUnlockRfids(Common.nodeInfo[idx].Name).Contains(nodeInfo[idx].RFID))
{
warnMsg = string.Format("料架{0}在接驳台{1}最外侧,但没有解绑信息,请检查", nodeInfo[idx].RFID, nodeInfo[idx].Name);
Common.LogInfo(warnMsg);
return true;
}
rfid = nodeInfo[idx].RFID;
warnMsg = "";
nodeName = nearNodeName; nodeName = nearNodeName;
Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4D-" + nearNodeName); Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4D-" + nearNodeName);
return true; return true;
...@@ -753,15 +730,6 @@ namespace AGVControl ...@@ -753,15 +730,6 @@ namespace AGVControl
string nearNodeName = CalculateNearNode(agv, SettingString.C4_Name_Prefix); string nearNodeName = CalculateNearNode(agv, SettingString.C4_Name_Prefix);
if (!nearNodeName.Equals("")) if (!nearNodeName.Equals(""))
{ {
idx = nodeInfo.FindIndex(s => s.Name.Equals(nearNodeName));
if (!Common.missionManager.GetUnlockRfids(Common.nodeInfo[idx].Name).Contains(nodeInfo[idx].RFID))
{
warnMsg = string.Format("料架{0}在接驳台{1}最外侧,但没有解绑信息,请检查", nodeInfo[idx].RFID, nodeInfo[idx].Name);
Common.LogInfo(warnMsg);
return true;
}
rfid = nodeInfo[idx].RFID;
warnMsg = "";
nodeName = nearNodeName; nodeName = nearNodeName;
Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4C-" + nearNodeName); Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4C-" + nearNodeName);
return true; return true;
...@@ -775,15 +743,6 @@ namespace AGVControl ...@@ -775,15 +743,6 @@ namespace AGVControl
string nearNodeName = CalculateNearNode(agv, SettingString.D4_Name_Prefix); string nearNodeName = CalculateNearNode(agv, SettingString.D4_Name_Prefix);
if (!nearNodeName.Equals("")) if (!nearNodeName.Equals(""))
{ {
idx = nodeInfo.FindIndex(s => s.Name.Equals(nearNodeName));
if (!Common.missionManager.GetUnlockRfids(Common.nodeInfo[idx].Name).Contains(nodeInfo[idx].RFID))
{
warnMsg = string.Format("料架{0}在接驳台{1}最外侧,但没有解绑信息,请检查", nodeInfo[idx].RFID, nodeInfo[idx].Name);
Common.LogInfo(warnMsg);
return true;
}
rfid = nodeInfo[idx].RFID;
warnMsg = "";
nodeName = nearNodeName; nodeName = nearNodeName;
Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4D-" + nearNodeName); Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4D-" + nearNodeName);
return true; return true;
...@@ -802,8 +761,6 @@ namespace AGVControl ...@@ -802,8 +761,6 @@ namespace AGVControl
int idx1 = agvInfo.FindIndex(s => s.CurJob is EnterLeaveShelfJob && ((EnterLeaveShelfJob)s.CurJob).LineName.Equals(SettingString.C4FeederOut)); int idx1 = agvInfo.FindIndex(s => s.CurJob is EnterLeaveShelfJob && ((EnterLeaveShelfJob)s.CurJob).LineName.Equals(SettingString.C4FeederOut));
if (idx1 == -1) if (idx1 == -1)
{ {
rfid = nodeInfo[idx].RFID;
warnMsg = "";
nodeName = nodeInfo[idx].Name; nodeName = nodeInfo[idx].Name;
Common.log.Debug(agv.Name + " 双层线右侧需要料架,准备去4C-" + nodeName); Common.log.Debug(agv.Name + " 双层线右侧需要料架,准备去4C-" + nodeName);
return true; return true;
...@@ -814,11 +771,9 @@ namespace AGVControl ...@@ -814,11 +771,9 @@ namespace AGVControl
//4D车间备料区寻找 //4D车间备料区寻找
if (!SettingString.C4_AGV_IPs.Contains(agv.IP)) if (!SettingString.C4_AGV_IPs.Contains(agv.IP))
{ {
idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.D4FeederOut) && !s.RFID.StartsWith("0")&& s.IsUse); idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.D4FeederOut) && !s.RFID.StartsWith("0") && s.IsUse);
if (idx > -1) if (idx > -1)
{ {
rfid = nodeInfo[idx].RFID;
warnMsg = "";
nodeName = nodeInfo[idx].Name; nodeName = nodeInfo[idx].Name;
Common.log.Debug(agv.Name + " 双层线右侧需要料架,准备去4D-" + nodeName); Common.log.Debug(agv.Name + " 双层线右侧需要料架,准备去4D-" + nodeName);
return true; return true;
...@@ -879,10 +834,9 @@ namespace AGVControl ...@@ -879,10 +834,9 @@ namespace AGVControl
/// </summary> /// </summary>
/// <param name="agv"></param> /// <param name="agv"></param>
/// <returns></returns> /// <returns></returns>
public static bool FindEmptyShelfBeforeSendFullShelf(out string nodeName, out string rfid) public static bool FindEmptyShelfBeforeSendFullShelf(out string nodeName)
{ {
nodeName = ""; nodeName = "";
rfid = "";
int idx = nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A6) int idx = nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A6)
&& (s.StateEquals(eNodeStatus.NeedEnterLeave) || (s.StateEquals(eNodeStatus.NeedLeave))) && !s.RFID.Equals("") && s.IsUse); && (s.StateEquals(eNodeStatus.NeedEnterLeave) || (s.StateEquals(eNodeStatus.NeedLeave))) && !s.RFID.Equals("") && s.IsUse);
if (idx > -1) if (idx > -1)
...@@ -892,14 +846,6 @@ namespace AGVControl ...@@ -892,14 +846,6 @@ namespace AGVControl
idx = nodeInfo.FindIndex(s => s.Name.Equals(FullShelfDestInfo.location) && s.EmptyShelfCnt > 0 && s.IsUse); idx = nodeInfo.FindIndex(s => s.Name.Equals(FullShelfDestInfo.location) && s.EmptyShelfCnt > 0 && s.IsUse);
if (idx > -1) if (idx > -1)
{ {
if (!Common.missionManager.GetUnlockRfids(Common.nodeInfo[idx].Name).Contains(nodeInfo[idx].RFID))
{
warnMsg = string.Format("料架{0}在接驳台{1}最外侧,但没有解绑信息,请检查", nodeInfo[idx].RFID, nodeInfo[idx].Name);
Common.LogInfo(warnMsg);
return true;
}
rfid = nodeInfo[idx].RFID;
warnMsg = "";
nodeName = FullShelfDestInfo.location; nodeName = FullShelfDestInfo.location;
Common.GetLineNameByNodeName(nodeName, out string line); Common.GetLineNameByNodeName(nodeName, out string line);
Common.log.Debug("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line)); Common.log.Debug("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line));
...@@ -918,6 +864,26 @@ namespace AGVControl ...@@ -918,6 +864,26 @@ namespace AGVControl
return false; return false;
} }
/// <summary> /// <summary>
/// 检查接驳台状态
/// </summary>
/// <returns></returns>
public static bool CheckStationState(ClientNode clientNode, out string rfid)
{
rfid = "";
if (!Common.missionManager.GetUnlockRfids(clientNode.Name).Contains(clientNode.RFID))
{
// if (warnMsg.Equals(""))
{
warnMsg = string.Format("料架[{0}]在接驳台[{1}]最外侧,但没有解绑信息,请检查", clientNode.RFID, clientNode.Name);
Common.LogInfo(warnMsg);
}
return false;
}
rfid = clientNode.RFID;
warnMsg = "";
return true;
}
/// <summary>
/// 计算当前小车距离最近的任务点(只针对产线) /// 计算当前小车距离最近的任务点(只针对产线)
/// </summary> /// </summary>
/// <param name="agv"></param> /// <param name="agv"></param>
......
...@@ -49,23 +49,29 @@ namespace AGVControl ...@@ -49,23 +49,29 @@ namespace AGVControl
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
runInfo = ""; agv.Msg = "充电任务:"+runInfo;
agv.Msg = runInfo; //runInfo = "充电任务:";
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (ChargeStep.IsStep(CHARGE_STEP.NONE)) if (ChargeStep.IsStep(CHARGE_STEP.NONE))
{ {
if (agv.Battery > Common.chargeStatus.chargeMax) if (agv.Battery > Common.chargeStatus.chargeMax)
{ {
if (agv.Place.Equals(SettingString.Standby))//在待机位不操作 if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(""))//在待机位不操作
{ {
ChargeStep.ToNextStep(CHARGE_STEP.END); ChargeStep.ToNextStep(CHARGE_STEP.END);
runInfo = "在待机位,电量充足[" + agv.Battery + "%],等待任务"; runInfo = "在待机位,电量充足[" + agv.Battery + "%],等待任务";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; ChargeStep.Msg = msg;
} }
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlace))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位,先过4C风淋门";
msg += runInfo;
ChargeStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix)) else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR); ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
...@@ -89,7 +95,17 @@ namespace AGVControl ...@@ -89,7 +95,17 @@ namespace AGVControl
} }
else else
{ {
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix)) if (agvPlace.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlace))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先过4C风淋门";
msg += runInfo;
ChargeStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR); ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先到4D门"; runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先到4D门";
...@@ -123,7 +139,18 @@ namespace AGVControl ...@@ -123,7 +139,18 @@ namespace AGVControl
} }
} }
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位,先到4D门";
msg += runInfo;
ChargeStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR)) else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR))
{ {
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
...@@ -166,7 +193,7 @@ namespace AGVControl ...@@ -166,7 +193,7 @@ namespace AGVControl
if (Common.CheckTaskFinished(agv, CurTaskName)) if (Common.CheckTaskFinished(agv, CurTaskName))
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK); ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
runInfo = "充电任务分配完成,去充电等待任务"; runInfo = "充电任务分配完成,去充电等待任务";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; ChargeStep.Msg = msg;
} }
...@@ -213,20 +240,12 @@ namespace AGVControl ...@@ -213,20 +240,12 @@ namespace AGVControl
Job job = Common.control.GetJob(agv); Job job = Common.control.GetJob(agv);
if (job != null && !(job is ChargeJob)) if (job != null && !(job is ChargeJob))
{ {
runInfo = "充电过程检测到任务,电量[" + agv.Battery + "%]大于最小电量[" + Common.chargeStatus.chargeMin + "%],中断充电执行任务"; runInfo = "充电过程检测到任务,电量[" + agv.Battery + "%]大于最小电量[" + Common.chargeStatus.chargeMin + "%],中断充电执行任务";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; ChargeStep.Msg = msg;
Common.chargeStatus.ClearRandomChargeInfo(agv); Common.chargeStatus.ClearRandomChargeInfo(agv);
return job; return job;
} }
//else if (job == null && agv.Battery < Common.chargeStatus.chargeMax / 2)
//{
// ChargeStep.ToNextStep(CHARGE_STEP.NONE);
// runInfo = "在待机位暂无任务,且当前电量小于" + Common.chargeStatus.chargeMax / 2 + "%,去充电位";
// msg += runInfo;
// ChargeStep.Msg = msg;
// Common.chargeStatus.ClearRandomChargeInfo(agv);
//}
} }
} }
...@@ -291,7 +310,10 @@ namespace AGVControl ...@@ -291,7 +310,10 @@ namespace AGVControl
/// ///
/// </summary> /// </summary>
NONE, NONE,
/// <summary>
/// 等待到达风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary> /// <summary>
/// 等待到达4D门 /// 等待到达4D门
/// </summary> /// </summary>
......
...@@ -51,30 +51,71 @@ namespace AGVControl ...@@ -51,30 +51,71 @@ namespace AGVControl
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.Msg = runInfo; agv.Msg = "返回任务:"+runInfo;
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st)) // runInfo = "返回任务:";
// CurTaskState = st;
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.NONE)) if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.NONE))
{ {
if (Common.FindEmptyShelfNode(agv, out string nodeName,out string rfid, true)) if (Common.FindEmptyShelfNode(agv, out string nodeName, true))
{ {
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(nodeName)); int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(nodeName));
if(i==-1) if (i == -1)
{ {
runInfo= "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架"; ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(nodeName));
msg += runInfo; if (Common.CheckStationState(clientNode, out string rfid))
EmptyAGVBackStep.Msg = msg; {
return new GoEmptyShelfLineJob(agvPlace, nodeName,rfid); runInfo = "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
return new GoEmptyShelfLineJob(agvPlace, nodeName, rfid);
}
else
{
if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
} }
else else
{ {
if (Common.CheckIsInAirDoor(agvPlace))
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix)) {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo= "从产线" + agvPlace + "回待机位,先到4D门"; runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD); Common.DoorMission(agv, SettingString.DoorCToD);
...@@ -83,22 +124,30 @@ namespace AGVControl ...@@ -83,22 +124,30 @@ namespace AGVControl
else else
{ {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo= "从产线" + agvPlace + "回待机位"; runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby); Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
} }
//EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.END);
} }
else else
{ {
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix)) if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo= "从产线" + agvPlace + "回待机位,先到4D门"; runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD); Common.DoorMission(agv, SettingString.DoorCToD);
...@@ -107,7 +156,7 @@ namespace AGVControl ...@@ -107,7 +156,7 @@ namespace AGVControl
else else
{ {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo= "从产线" + agvPlace + "回待机位"; runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby); Common.MoveToNode(agv, SettingString.Standby);
...@@ -118,19 +167,19 @@ namespace AGVControl ...@@ -118,19 +167,19 @@ namespace AGVControl
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY)) else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.Standby,CurTaskState)) if (Common.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
{ {
Job job = Common.control.GetJob(agv); Job job = Common.control.GetJob(agv);
if (job == null && agv.Battery < Common.chargeStatus.chargeMax) if (job == null && agv.Battery < Common.chargeStatus.chargeMax)
{ {
runInfo= "到达待机位,电量[" + agv.Battery + "]小于最大电量[" + Common.chargeStatus.chargeMax + "],暂无任务,去充电"; runInfo = "到达待机位,电量[" + agv.Battery + "]小于最大电量[" + Common.chargeStatus.chargeMax + "],暂无任务,去充电";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
return new ChargeJob(""); return new ChargeJob("");
} }
else else
{ {
runInfo= "到达待机位,检测到新任务,执行任务"; runInfo = "到达待机位,检测到新任务,执行任务";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
return job; return job;
...@@ -141,31 +190,27 @@ namespace AGVControl ...@@ -141,31 +190,27 @@ namespace AGVControl
{ {
if (Common.FindFullShelfTask(agv)) if (Common.FindFullShelfTask(agv))
{ {
runInfo= "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6"; runInfo = "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
return new GoFullShelfStationJob(SettingString.Standby); return new GoFullShelfStationJob(SettingString.Standby);
} }
//else
//{
// msg = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
// EmptyAGVBackStep.Msg = msg;
// return new ChargeJob(SettingString.D4_DOOR_Name);
//}
} }
} }
//else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR)) else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
//{ {
// CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
// if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
// { {
// EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
// runInfo = "从产线" + agvPlace + "回待机位"; runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
// msg += runInfo; msg += runInfo;
// EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
// } Common.DoorMission(agv, SettingString.DoorCToD);
//} UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR)) else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
...@@ -180,7 +225,7 @@ namespace AGVControl ...@@ -180,7 +225,7 @@ namespace AGVControl
} }
else else
{ {
runInfo = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位"; runInfo = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
return new ChargeJob(SettingString.DoorCToD); return new ChargeJob(SettingString.DoorCToD);
...@@ -189,8 +234,6 @@ namespace AGVControl ...@@ -189,8 +234,6 @@ namespace AGVControl
} }
return this; return this;
} }
/// <summary> /// <summary>
/// AGV回收空料架流程 /// AGV回收空料架流程
/// </summary> /// </summary>
...@@ -200,7 +243,10 @@ namespace AGVControl ...@@ -200,7 +243,10 @@ namespace AGVControl
/// 查询任务 /// 查询任务
/// </summary> /// </summary>
NONE, NONE,
/// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary> /// <summary>
/// 等待到达4D门 /// 等待到达4D门
/// </summary> /// </summary>
......
...@@ -62,16 +62,23 @@ namespace AGVControl ...@@ -62,16 +62,23 @@ namespace AGVControl
{ {
string msg = agv.Name+ " "; string msg = agv.Name+ " ";
bool rtn = false; bool rtn = false;
agv.Msg = runInfo; agv.Msg = "空料架返回:"+runInfo;
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st)) //runInfo = "空料架返回:";
// CurTaskState = st;
if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE)) if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE))
{ {
if (EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间 if (Common.CheckIsInAirDoor(EmptyShelfPlace))//4C车间
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线[" + EmptyShelfPlace + "]前往4C风淋门";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{ {
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo= "空料架从产线" + EmptyShelfPlace + "前往4D门"; runInfo = "从产线[" + EmptyShelfPlace + "]前往4D门";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD); Common.DoorMission(agv, SettingString.DoorCToD);
...@@ -83,7 +90,7 @@ namespace AGVControl ...@@ -83,7 +90,7 @@ namespace AGVControl
{ {
EmptyShelfTargetPlace = nodeName; EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo= "空料架从产线 [" + EmptyShelfPlace + "] 送往双层线" + EmptyShelfTargetPlace; runInfo = "从产线 [" + EmptyShelfPlace + "]送往双层线" + EmptyShelfTargetPlace;
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
if (!EmptyShelfTargetPlace.Equals("")) if (!EmptyShelfTargetPlace.Equals(""))
...@@ -91,12 +98,12 @@ namespace AGVControl ...@@ -91,12 +98,12 @@ namespace AGVControl
Common.MoveToNode(agv, EmptyShelfTargetPlace); Common.MoveToNode(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
} }
else else
{ {
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo= "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位"; runInfo = "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby); Common.MoveToNode(agv, SettingString.Standby);
...@@ -104,6 +111,19 @@ namespace AGVControl ...@@ -104,6 +111,19 @@ namespace AGVControl
} }
} }
} }
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "出风淋门,前往4D门";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR)) else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
...@@ -113,7 +133,7 @@ namespace AGVControl ...@@ -113,7 +133,7 @@ namespace AGVControl
{ {
EmptyShelfTargetPlace = nodeName; EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo= "空料架从产线 [" + EmptyShelfPlace + "] 送往双层线" + EmptyShelfTargetPlace; runInfo = "进4D门,送往双层线" + EmptyShelfTargetPlace;
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfTargetPlace); Common.MoveToNode(agv, EmptyShelfTargetPlace);
...@@ -122,7 +142,7 @@ namespace AGVControl ...@@ -122,7 +142,7 @@ namespace AGVControl
else else
{ {
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo= "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位"; runInfo = "进4D门,双层线暂不需要空料架,到待机位";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby); Common.MoveToNode(agv, SettingString.Standby);
...@@ -137,7 +157,7 @@ namespace AGVControl ...@@ -137,7 +157,7 @@ namespace AGVControl
{ {
EmptyShelfTargetPlace = nodeName; EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo= "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace; runInfo = "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace;
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfTargetPlace); Common.MoveToNode(agv, EmptyShelfTargetPlace);
...@@ -149,11 +169,8 @@ namespace AGVControl ...@@ -149,11 +169,8 @@ namespace AGVControl
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState) && EmptyShelfTargetPlace.StartsWith("A")) if (Common.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState) && EmptyShelfTargetPlace.StartsWith("A"))
{ {
//msg = "AGV到达 " + EmptyShelfTargetPlace;
//EmptyBackStep.Msg = msg;
//return new EnterLeaveShelfJob(EmptyShelfTargetPlace,eEnterLeaveType.Leave,shelfType);
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE);
runInfo= "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]"; runInfo = "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.server.ReadyEnter(EmptyShelfTargetPlace); Common.server.ReadyEnter(EmptyShelfTargetPlace);
...@@ -165,7 +182,7 @@ namespace AGVControl ...@@ -165,7 +182,7 @@ namespace AGVControl
ClientNode node = Common.nodeInfo[id]; ClientNode node = Common.nodeInfo[id];
if (node.StateEquals(eNodeStatus.MayEnter)) if (node.StateEquals(eNodeStatus.MayEnter))
{ {
if(!agv.CurTaskName.Equals("Leave")) if (!agv.CurTaskName.Equals("Leave"))
{ {
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE);
runInfo = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行"; runInfo = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行";
...@@ -179,57 +196,34 @@ namespace AGVControl ...@@ -179,57 +196,34 @@ namespace AGVControl
else if (EmptyBackStep.IsTimeOut(15000, out double timeOutValue)) else if (EmptyBackStep.IsTimeOut(15000, out double timeOutValue))
{ {
tryTimes++; tryTimes++;
if (tryTimes < 5) if (tryTimes < 3)
return this; return this;
// if(EmptyShelfTargetPlace.Equals(SettingString.A6)) tryTimes = 0;
// { EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
tryTimes = 0; runInfo = "双层线" + EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY); msg += runInfo;
runInfo = "双层线"+ EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位"; EmptyBackStep.Msg = msg;
msg += runInfo; Common.MoveToNode(agv, SettingString.Standby);
EmptyBackStep.Msg = msg; UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
// }
//else if(EmptyShelfTargetPlace.Equals(SettingString.A5))
//{
// tryTimes = 0;
// EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
// runInfo = "双层线A5暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
// msg += runInfo;
// EmptyBackStep.Msg = msg;
// Common.MoveToNode(agv, SettingString.Standby);
// UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
//}
//else
//{
// EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
//}
// EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
//runInfo= "AGV到达 " + EmptyShelfTargetPlace + ",15秒后重新向双层线发送入料架请求[ReadyEnter]";
//msg += runInfo;
//EmptyBackStep.Msg = msg;
} }
} }
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE)) else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv,"Leave",CurTaskState)) if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
{ {
//EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.END);
agv.RFID = ""; agv.RFID = "";
Job job = Common.control.GetJob(agv); Job job = Common.control.GetJob(agv);
if (job != null) if (job != null)
{ {
runInfo= "在双层线检测到任务,执行任务"; runInfo = "在双层线检测到任务,执行任务";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
return job; return job;
} }
else else
{ {
runInfo= "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位"; runInfo = "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
agv.RFID = ""; agv.RFID = "";
...@@ -240,10 +234,7 @@ namespace AGVControl ...@@ -240,10 +234,7 @@ namespace AGVControl
} }
else if (EmptyBackStep.IsTimeOut(60000, out double timeOutValue)) else if (EmptyBackStep.IsTimeOut(60000, out double timeOutValue))
{ {
//链条停止 runInfo = "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
runInfo= "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
//msg += runInfo;
//EmptyBackStep.Msg = msg;
} }
} }
...@@ -264,6 +255,10 @@ namespace AGVControl ...@@ -264,6 +255,10 @@ namespace AGVControl
/// </summary> /// </summary>
NONE, NONE,
/// <summary> /// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待AGV到达门 /// 等待AGV到达门
/// </summary> /// </summary>
WAIT_AGV_REACH_DOOR, WAIT_AGV_REACH_DOOR,
......
...@@ -57,56 +57,184 @@ namespace AGVControl ...@@ -57,56 +57,184 @@ namespace AGVControl
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.Msg = runInfo; agv.Msg = "回收空料架任务:"+runInfo;
//runInfo = "回收空料架任务:";
int nodeIdx = Common.FindNode(EmptyShelfPlace); int nodeIdx = Common.FindNode(EmptyShelfPlace);
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.NONE)) if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.NONE))
{ {
if (nodeIdx == -1) if (agvPlae.StartsWith(SettingString.C4_Name_Prefix)&& Common.CheckIsInAirDoor(agvPlae) && !Common.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门内->风淋门外
return null;
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR);
runInfo = "去空料架产线" + EmptyShelfPlace + ",先前往4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD); Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
else if ((agvPlae.StartsWith(SettingString.D4_Name_Prefix) || agvPlae.StartsWith("A") || agvPlae.Equals(SettingString.Standby) || agvPlae.Equals(SettingString.AutoCharge)) else if (!Common.CheckIsInAirDoor(agvPlae) && Common.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门外->风淋门内
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR); if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C->4C
runInfo = "去空料架产线" + EmptyShelfPlace + ",先前往4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; {
msg += runInfo; if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
TakeEmptyStep.Msg = msg; {
Common.DoorMission(agv, SettingString.DoorDToC); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if ((agvPlae.StartsWith(SettingString.D4_Name_Prefix) || agvPlae.StartsWith("A") || agvPlae.Equals(SettingString.Standby) ||
agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
} }
else if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix)) else//起始与目的地在风淋门同一侧
{ {
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用 if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlae) && Common.CheckIsInAirDoor(EmptyShelfPlace))//都在风淋门内
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE); if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]"; {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先过风淋门,再到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
else if(agvPlae.Equals("")|| (!Common.CheckIsInAirDoor(agvPlae)) && !Common.CheckIsInAirDoor(EmptyShelfPlace))//都在风淋门外
{
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C->4C
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
else if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if ((agvPlae.StartsWith(SettingString.D4_Name_Prefix) || agvPlae.StartsWith("A") || agvPlae.Equals(SettingString.Standby) ||
agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else//4D->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
//4C风淋门内->风淋门外,到达风淋门外
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C->4C
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "到风淋门外,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
else if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "到风淋门外,去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv); Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
//都在风淋门内,到达风淋门外
else else
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
} }
else }
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{ {
//4C风淋门外->风淋门内
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "到达风淋门内,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
} }
...@@ -127,10 +255,22 @@ namespace AGVControl ...@@ -127,10 +255,22 @@ namespace AGVControl
} }
else else
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); if(Common.CheckIsInAirDoor(EmptyShelfPlace))
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; {
msg += runInfo; TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR);
TakeEmptyStep.Msg = msg; runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
} }
} }
} }
...@@ -316,6 +456,14 @@ namespace AGVControl ...@@ -316,6 +456,14 @@ namespace AGVControl
/// </summary> /// </summary>
NONE, NONE,
/// <summary> /// <summary>
/// 等待到达4C风淋门内
/// </summary>
WAIT_AGV_REACH_AIR_IN_DOOR,
/// <summary>
/// 等待到达4C风淋门外
/// </summary>
WAIT_AGV_REACH_AIR_OUT_DOOR,
/// <summary>
/// 等待到达4C门 /// 等待到达4C门
/// </summary> /// </summary>
WAIT_AGV_REACH_4C_DOOR, WAIT_AGV_REACH_4C_DOOR,
......
...@@ -56,7 +56,8 @@ namespace AGVControl ...@@ -56,7 +56,8 @@ namespace AGVControl
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.Msg = runInfo; agv.Msg = "去云仓接满料任务:"+runInfo;
//runInfo = "去云仓接满料任务:";
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st)) //if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st; // CurTaskState = st;
if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE)) if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE))
...@@ -89,7 +90,7 @@ namespace AGVControl ...@@ -89,7 +90,7 @@ namespace AGVControl
} }
else if (input != null && !input[3]) else if (input != null && !input[3])
{ {
if (agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务 if (agvPlace.Equals("") || agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务
{ {
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6); GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace; runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace;
...@@ -98,6 +99,15 @@ namespace AGVControl ...@@ -98,6 +99,15 @@ namespace AGVControl
Common.MoveToNode(agv, FullShelfStationPlace); Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
else if (Common.CheckIsInAirDoor(agvPlace))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "在4C风淋门内,先过风淋门";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间 else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{ {
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR); GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
...@@ -132,6 +142,15 @@ namespace AGVControl ...@@ -132,6 +142,15 @@ namespace AGVControl
Common.MoveToNode(agv, FullShelfStationPlace); Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
else if(Common.CheckIsInAirDoor(agvPlace))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "在4C风淋门内,先过风淋门";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间 else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{ {
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR); GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
...@@ -147,6 +166,20 @@ namespace AGVControl ...@@ -147,6 +166,20 @@ namespace AGVControl
} }
} }
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "过风淋门,向4D门运行,再到双层线入料口" + FullShelfStationPlace;
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
Common.MoveToNode(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR)) else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
...@@ -278,7 +311,7 @@ namespace AGVControl ...@@ -278,7 +311,7 @@ namespace AGVControl
else if (GoFullShelfStationStep.IsTimeOut(60000, out double timeOutValue)) else if (GoFullShelfStationStep.IsTimeOut(60000, out double timeOutValue))
{ {
//链条停止 //链条停止
runInfo= "满料架在[" + FullShelfStationPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况"; runInfo = "满料架在[" + FullShelfStationPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
//msg +=runInfo; //msg +=runInfo;
//GoFullShelfStationStep.Msg = msg; //GoFullShelfStationStep.Msg = msg;
} }
...@@ -303,6 +336,10 @@ namespace AGVControl ...@@ -303,6 +336,10 @@ namespace AGVControl
/// </summary> /// </summary>
WAIT_CHECK_RESULT, WAIT_CHECK_RESULT,
/// <summary> /// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待AGV到达门 /// 等待AGV到达门
/// </summary> /// </summary>
WAIT_AGV_REACH_DOOR, WAIT_AGV_REACH_DOOR,
......
...@@ -60,7 +60,8 @@ namespace AGVControl ...@@ -60,7 +60,8 @@ namespace AGVControl
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.RFID = RFID; agv.RFID = RFID;
agv.Msg = runInfo; agv.Msg = "送满料任务:"+runInfo;
//runInfo = "送满料任务:";
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st)) //if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st; // CurTaskState = st;
if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.NONE)) if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.NONE))
...@@ -69,7 +70,7 @@ namespace AGVControl ...@@ -69,7 +70,7 @@ namespace AGVControl
if (FullShelfPlace.StartsWith(SettingString.C4_Name_Prefix)) if (FullShelfPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR); SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "满料架前往4C门,从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]"; runInfo = "前往4C门,从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
SendFullShelfStep.Msg = msg; SendFullShelfStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC); Common.DoorMission(agv, SettingString.DoorDToC);
...@@ -78,7 +79,7 @@ namespace AGVControl ...@@ -78,7 +79,7 @@ namespace AGVControl
else else
{ {
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "满料架从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]"; runInfo = "从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
SendFullShelfStep.Msg = msg; SendFullShelfStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace); Common.MoveToNode(agv, FullShelfPlace);
...@@ -86,7 +87,6 @@ namespace AGVControl ...@@ -86,7 +87,6 @@ namespace AGVControl
} }
} }
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR)) else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
...@@ -103,14 +103,39 @@ namespace AGVControl ...@@ -103,14 +103,39 @@ namespace AGVControl
} }
else else
{ {
if(Common.CheckIsInAirDoor(FullShelfPlace))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "到达4C门,过风淋门[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "满料架从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]"; runInfo = "送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
SendFullShelfStep.Msg = msg; SendFullShelfStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace); Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
} }
} }
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE)) else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE))
...@@ -121,7 +146,7 @@ namespace AGVControl ...@@ -121,7 +146,7 @@ namespace AGVControl
if (!Common.Check4CTarget(agv, FullShelfPlace))//未占用 if (!Common.Check4CTarget(agv, FullShelfPlace))//未占用
{ {
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "满料架从临时待机位送往[" + FullShelfPlace + "][RFID=" + RFID + "]"; runInfo = "从临时待机位送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
SendFullShelfStep.Msg = msg; SendFullShelfStep.Msg = msg;
Common.DeleteStandyInfo(agv); Common.DeleteStandyInfo(agv);
...@@ -226,7 +251,7 @@ namespace AGVControl ...@@ -226,7 +251,7 @@ namespace AGVControl
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState)) if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
{ {
runInfo = "满料进入" + FullShelfPlace + "完成 [RFID=" + RFID + "] [" + agv.BoxDestInfo + "]"; runInfo = "满料进入" + FullShelfPlace + "完成 [RFID=" + RFID + "] [" + agv.BoxDestInfo + "]";
msg += runInfo; msg += runInfo;
SendFullShelfStep.Msg = msg; SendFullShelfStep.Msg = msg;
agv.RFID = ""; agv.RFID = "";
...@@ -237,7 +262,7 @@ namespace AGVControl ...@@ -237,7 +262,7 @@ namespace AGVControl
else if (SendFullShelfStep.IsTimeOut(60000, out double timeOutValue)) else if (SendFullShelfStep.IsTimeOut(60000, out double timeOutValue))
{ {
//链条停止 //链条停止
runInfo = "满料在[" + FullShelfPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况"; runInfo = "满料在[" + FullShelfPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
//msg += runInfo; //msg += runInfo;
//SendFullShelfStep.Msg = msg; //SendFullShelfStep.Msg = msg;
} }
...@@ -270,6 +295,10 @@ namespace AGVControl ...@@ -270,6 +295,10 @@ namespace AGVControl
/// </summary> /// </summary>
WAIT_REACH_TEMP_PLACE, WAIT_REACH_TEMP_PLACE,
/// <summary> /// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待小车到达目的地 /// 等待小车到达目的地
/// </summary> /// </summary>
WAIT_AGV_REACH_LINE, WAIT_AGV_REACH_LINE,
......
...@@ -35,14 +35,14 @@ namespace AGVControl ...@@ -35,14 +35,14 @@ namespace AGVControl
{ {
if (!SettingString.C4_AGV_IPs.Contains(agv.IP)) if (!SettingString.C4_AGV_IPs.Contains(agv.IP))
continue; continue;
if (agv.CurJob is GoEmptyShelfLineJob)//|| agv.CurJob is EmptyShelfBackJob if (agv.CurJob is GoEmptyShelfLineJob|| (agv.CurJob is EmptyShelfBackJob))
{ {
emptyJobCnt++; emptyJobCnt++;
} }
} }
//出工单料的目的地是否有空料架 //出工单料的目的地是否有空料架
if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName,out rfid)) if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName))
{ {
if (nodeName.StartsWith(SettingString.C4_Name_Prefix) && SettingString.C4_AGV_IPs.Contains(currentAgv.IP)) if (nodeName.StartsWith(SettingString.C4_Name_Prefix) && SettingString.C4_AGV_IPs.Contains(currentAgv.IP))
{ {
...@@ -58,29 +58,24 @@ namespace AGVControl ...@@ -58,29 +58,24 @@ namespace AGVControl
} }
if (cnt < clientNode.EmptyShelfCnt) if (cnt < clientNode.EmptyShelfCnt)
{ {
if ((SettingString.AGVCNT / 2 - emptyJobCnt).Equals(2))//保留1辆小车出满料架 if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
{ return new GoEmptyShelfLineJob(currentAgv.Place, nodeName, rfid);
return null;
}
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName,rfid);
} }
} }
} }
//回收空料架 //回收空料架
if (Common.FindEmptyShelfNode(currentAgv, out string emptyNodeName,out rfid)) if (Common.FindEmptyShelfNode(currentAgv, out string emptyNodeName))
{ {
if (SettingString.C4_AGV_IPs.Contains(currentAgv.IP)) if (SettingString.C4_AGV_IPs.Contains(currentAgv.IP))
{ {
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName)); int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName));
if (i == -1) if (i == -1)
{ {
if ((SettingString.AGVCNT / 2 - emptyJobCnt).Equals(2))//保留1辆小车出满料架 ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(emptyNodeName));
{ if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return null; return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName, rfid);
}
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName, rfid);
} }
} }
} }
...@@ -92,12 +87,25 @@ namespace AGVControl ...@@ -92,12 +87,25 @@ namespace AGVControl
if (SettingString.C4_AGV_IPs.Contains(currentAgv.IP)) if (SettingString.C4_AGV_IPs.Contains(currentAgv.IP))
{ {
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoFullShelfStationJob && !s.IP.Equals(currentAgv.IP)); int i = Common.agvInfo.FindIndex(s => s.CurJob is GoFullShelfStationJob && !s.IP.Equals(currentAgv.IP));
if (i == -1) if (i == -1)
return new GoFullShelfStationJob(currentAgv.Place); return new GoFullShelfStationJob(currentAgv.Place);
} }
} }
return null; return null;
} }
/// <summary>
/// 控制出空架小车数量
/// </summary>
/// <param name="emptytASKAGV"></param>
/// <returns></returns>
private bool CanEmptyTask(int emptytASKAGV)
{
if ((SettingString.AGVCNT / 2 - emptytASKAGV).Equals(2))//保留1辆小车出满料架
{
return false;
}
return true;
}
} }
} }
...@@ -38,13 +38,13 @@ namespace AGVControl ...@@ -38,13 +38,13 @@ namespace AGVControl
{ {
if (SettingString.C4_AGV_IPs.Contains(agv.IP)) if (SettingString.C4_AGV_IPs.Contains(agv.IP))
continue; continue;
if (agv.CurJob is GoEmptyShelfLineJob)//|| agv.CurJob is EmptyShelfBackJob if (agv.CurJob is GoEmptyShelfLineJob || agv.CurJob is EmptyShelfBackJob)//
{ {
emptyJobCnt++; emptyJobCnt++;
} }
} }
//出工单料的目的地是否有空料架 //出工单料的目的地是否有空料架
if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName,out rfid)) if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName))
{ {
if (nodeName.StartsWith(SettingString.D4_Name_Prefix) && !SettingString.C4_AGV_IPs.Contains(currentAgv.IP)) if (nodeName.StartsWith(SettingString.D4_Name_Prefix) && !SettingString.C4_AGV_IPs.Contains(currentAgv.IP))
{ {
...@@ -62,28 +62,24 @@ namespace AGVControl ...@@ -62,28 +62,24 @@ namespace AGVControl
} }
if (cnt < clientNode.EmptyShelfCnt) if (cnt < clientNode.EmptyShelfCnt)
{ {
if ((SettingString.AGVCNT / 2 - emptyJobCnt).Equals(1))//保留1辆小车出满料架
{ if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return null; return new GoEmptyShelfLineJob(currentAgv.Place, nodeName, rfid);
}
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName,rfid);
} }
} }
} }
//回收空料架 //回收空料架
if (Common.FindEmptyShelfNode(currentAgv, out string emptyNodeName,out rfid)) if (Common.FindEmptyShelfNode(currentAgv, out string emptyNodeName))
{ {
if (!SettingString.C4_AGV_IPs.Contains(currentAgv.IP)) if (!SettingString.C4_AGV_IPs.Contains(currentAgv.IP))
{ {
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName)); int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName));
if (i == -1) if (i == -1)
{ {
if ((SettingString.AGVCNT / 2 - emptyJobCnt).Equals(1))//保留1辆小车出满料架 ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(emptyNodeName));
{ if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return null; return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName, rfid);
}
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName, rfid);
} }
} }
} }
...@@ -121,5 +117,18 @@ namespace AGVControl ...@@ -121,5 +117,18 @@ namespace AGVControl
return null; return null;
} }
/// <summary>
/// 控制出空架小车数量
/// </summary>
/// <param name="emptytASKAGV"></param>
/// <returns></returns>
private bool CanEmptyTask(int emptytASKAGV)
{
if ((SettingString.AGVCNT / 2 - emptytASKAGV).Equals(1))//保留1辆小车出满料架
{
return false;
}
return true;
}
} }
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!