Commit c0fb8714 张东亮

日志记录格式变更

1 个父辈 810d0935
...@@ -14,7 +14,6 @@ namespace DeviceLibrary ...@@ -14,7 +14,6 @@ namespace DeviceLibrary
public class Control public class Control
{ {
private static log4net.ILog log = log4net.LogManager.GetLogger("Control"); private static log4net.ILog log = log4net.LogManager.GetLogger("Control");
static log4net.ILog runLog = log4net.LogManager.GetLogger("RunLog");
static Dictionary<string, RunInfo> runInfoMap = new Dictionary<string, RunInfo>(); static Dictionary<string, RunInfo> runInfoMap = new Dictionary<string, RunInfo>();
private System.Timers.Timer AgvCallTimer; private System.Timers.Timer AgvCallTimer;
...@@ -124,7 +123,7 @@ namespace DeviceLibrary ...@@ -124,7 +123,7 @@ namespace DeviceLibrary
bool rtn; bool rtn;
if (AgvStateInProcess) return; if (AgvStateInProcess) return;
AgvStateInProcess = true; AgvStateInProcess = true;
List<AlarmMsg> msglist = new List<AlarmMsg>(); //List<AlarmMsg> msglist = new List<AlarmMsg>();
for (int i = 0; i < AGVManager.agvInfo.Count; i++) for (int i = 0; i < AGVManager.agvInfo.Count; i++)
{ {
//上报异常 //上报异常
...@@ -144,44 +143,6 @@ namespace DeviceLibrary ...@@ -144,44 +143,6 @@ namespace DeviceLibrary
{ {
AgvChanged?.Invoke(i); AgvChanged?.Invoke(i);
} }
Thread.Sleep(50);
if (stateText.Equals("Error") || stateText.Equals("EmergencyStop") || stateText.Equals("Pause"))
{
isAlarm = true;
msglist.Add(new AlarmMsg(AGVManager.agvInfo[i].Name, "lineAgv." + AGVManager.agvInfo[i].Name + ".Msg", "状态:" + stateText + ""));
}
if (!isAlarm && AGVManager.agvInfo[i].StandTimeOut)
{
isAlarm = true;
msglist.Add(new AlarmMsg(AGVManager.agvInfo[i].Name, "lineAgv." + AGVManager.agvInfo[i].Name + ".Msg", "在" + AGVManager.agvInfo[i].PlaceAliceName + "停留超时" + (DateTime.Now - AGVManager.agvInfo[i].StandStartTime).TotalMinutes.ToString("f2") + "分钟"));
}
if (!isAlarm)
{
try
{
if (!AGVManager.agvInfo[i].Msg.Equals(""))
{
RunLogInfo(new RunInfo(AGVManager.agvInfo[i].Name, AGVManager.agvInfo[i].Msg));
msglist.Add(new AlarmMsg(AGVManager.agvInfo[i].Name, "lineAgv." + AGVManager.agvInfo[i].Name + ".Msg", AGVManager.agvInfo[i].Msg, 1));
}
else
{
if ((AGVManager.agvInfo[i].Place.Contains(SettingString.AutoCharge) || AGVManager.agvInfo[i].Place.Contains(SettingString.Standby)))
{
msglist.Add(new AlarmMsg(AGVManager.agvInfo[i].Name, "lineAgv." + AGVManager.agvInfo[i].Name + ".Place", AGVManager.agvInfo[i].Place, 1));
}
}
}
catch (Exception ex)
{
log.Error(AGVManager.agvInfo[i].Name + "上报小车运行步骤失败" + ex.Message + ex.StackTrace);
}
}
HttpManager.updateDeviceAlarmMsg(msglist);
} }
catch (Exception ex) catch (Exception ex)
{ {
...@@ -191,23 +152,6 @@ namespace DeviceLibrary ...@@ -191,23 +152,6 @@ namespace DeviceLibrary
AgvStateInProcess = false; AgvStateInProcess = false;
} }
public static void RunLogInfo(RunInfo info)
{
if (runInfoMap == null)
return;
if (runInfoMap.Keys.Contains(info.AGVNum))
{
if (!runInfoMap[info.AGVNum].Equals(info))
{
runLog.Info(info.ToString());
}
}
else
{
runInfoMap.Add(info.AGVNum, info);
runLog.Info(info.ToString());
}
}
/// <summary> /// <summary>
/// 从节点获取任务 /// 从节点获取任务
/// </summary> /// </summary>
......
...@@ -144,7 +144,30 @@ namespace DeviceLibrary ...@@ -144,7 +144,30 @@ namespace DeviceLibrary
/// 当前料架的工单信息 /// 当前料架的工单信息
/// </summary> /// </summary>
public string BoxDestInfo { get; set; } = ""; public string BoxDestInfo { get; set; } = "";
/// <summary>
/// 错误消息
/// </summary>
public string ErrorMsg { get; set; } = "";
public string ErrorLastTime { get; set; } = "";
/// <summary>
/// 任务期间是否有错误
/// </summary>
public bool HasError { get; set; } = false;
public DateTime errStartTime = DateTime.Now;
public void SetErrorMsg(string msg, string lastTime)
{
if (ErrorMsg.Equals(""))
{
ErrorMsg = msg;
ErrorLastTime = lastTime;
errStartTime = DateTime.Now;
}
}
public void ClearErrorMsg()
{
ErrorLastTime = "";
ErrorMsg = "";
}
/// <summary> /// <summary>
/// 任务重发 /// 任务重发
/// </summary> /// </summary>
...@@ -266,10 +289,68 @@ namespace DeviceLibrary ...@@ -266,10 +289,68 @@ namespace DeviceLibrary
MissionText = missionText; MissionText = missionText;
StateKanban.ShowInfo("AGV运行信息", missionText); StateKanban.ShowInfo("AGV运行信息", missionText);
} }
CheckErrorState();
CheckOfflineTimeOut();
CheckStandTimeOut(position); CheckStandTimeOut(position);
UpdateDisplayBoard();
return isChange; return isChange;
} }
DateTime agvErrorStartTime = DateTime.MaxValue;
DateTime offlineStartTime = DateTime.MaxValue;
bool errorState = false;
int OfflineLastTimeSeconds = 30;
/// <summary>
/// 检查小车是否报错
/// </summary>
/// <returns></returns>
private void CheckErrorState()
{
if (StateID.Equals(eAGVState.Error) || StateID.Equals(eAGVState.EmergencyStop) || StateID.Equals(eAGVState.Pause))
{
//满足条件,计算持续时间
if (agvErrorStartTime == DateTime.MaxValue)
{
agvErrorStartTime = DateTime.Now;
}
TimeSpan lastTimeSpan = DateTime.Now - agvErrorStartTime;
errorState = (lastTimeSpan.TotalSeconds >= OfflineLastTimeSeconds);
}
else
{
errorState = false;
if ((DateTime.Now - agvErrorStartTime).TotalSeconds > OfflineLastTimeSeconds)
agvErrorStartTime = DateTime.Now;
}
}
/// <summary>
/// 离线超时
/// </summary>
private bool offlineTimeOut = false;
/// <summary>
/// 检查小车是否离线超时
/// </summary>
/// <returns></returns>
private void CheckOfflineTimeOut()
{
if (CurJob != null && !(CurJob is ChargeJob) && !IsCon)
{
//满足条件,计算持续时间
if (offlineStartTime == DateTime.MaxValue)
{
offlineStartTime = DateTime.Now;
}
TimeSpan lastTimeSpan = DateTime.Now - offlineStartTime;
offlineTimeOut = (lastTimeSpan.TotalSeconds >= OfflineLastTimeSeconds);
}
else
{
offlineTimeOut = false;
if ((DateTime.Now - offlineStartTime).TotalSeconds > OfflineLastTimeSeconds)
//LogUtil.error(string.Format("{0} 在{1}离线{2}秒", Name, PlaceAliceName, (DateTime.Now - offlineStartTime).TotalSeconds.ToString("f2")));
offlineStartTime = DateTime.Now;
}
}
/// <summary> /// <summary>
/// 检查小车是否在原地停留超时 /// 检查小车是否在原地停留超时
/// </summary> /// </summary>
...@@ -309,6 +390,70 @@ namespace DeviceLibrary ...@@ -309,6 +390,70 @@ namespace DeviceLibrary
} }
Position = position; Position = position;
} }
private void UpdateDisplayBoard()
{
bool isAlarm = false;
List<AlarmMsg> msglist = new List<AlarmMsg>();
try
{
if (offlineTimeOut)
{
isAlarm = true;
SetErrorMsg("在" + PlaceAliceName + "离线", (DateTime.Now - offlineStartTime).TotalMinutes.ToString("f2"));
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", "在" + PlaceAliceName + "离线" + (DateTime.Now - offlineStartTime).TotalSeconds.ToString("f2") + "秒"));
}
if (!isAlarm && errorState)
{
isAlarm = true;
SetErrorMsg("状态:" + StateID.ToString(), (DateTime.Now - offlineStartTime).TotalMinutes.ToString("f2"));
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", "状态:" + StateID.ToString()));
}
if (!isAlarm && StandTimeOut)
{
isAlarm = true;
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", "在" + PlaceAliceName + "停留超时" + (DateTime.Now - StandStartTime).TotalMinutes.ToString("f2") + "分钟"));
}
else if (!isAlarm && HasError)
{
isAlarm = true;
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", Msg));
}
if (!isAlarm)
{
try
{
if (!ErrorMsg.Equals(""))//异常消除后正常,打印异常
{
AGVManager.ErrorLogRecord(new ErrorInfo(this));
ClearErrorMsg();
}
if (!Msg.Equals(""))
{
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", Msg, 1));
}
else
{
if ((Place.Contains(SettingString.AutoCharge) ||Place.Contains(SettingString.Standby)))
{
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Place", Place, 1));
}
}
}
catch (Exception ex)
{
Common.LogUtil.error(Name + "上报小车运行步骤失败" + ex.Message + ex.StackTrace);
}
}
HttpManager.updateDeviceAlarmMsg(msglist);
}
catch (Exception ex)
{
LogUtil.error(Name + "上报小车信息失败" + ex.Message + ex.StackTrace);
}
}
} }
} }
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
public abstract class Job public abstract class Job
...@@ -12,6 +14,7 @@ namespace DeviceLibrary ...@@ -12,6 +14,7 @@ namespace DeviceLibrary
/// 运行信息 /// 运行信息
/// </summary> /// </summary>
public abstract string RunInfo { get; } public abstract string RunInfo { get; }
public string runInfo = "";
/// <summary> /// <summary>
/// 根据任务状态继续执行任务 /// 根据任务状态继续执行任务
/// </summary> /// </summary>
...@@ -27,7 +30,19 @@ namespace DeviceLibrary ...@@ -27,7 +30,19 @@ namespace DeviceLibrary
/// 当前任务的执行状态 /// 当前任务的执行状态
/// </summary> /// </summary>
public string CurTaskState { get; set; } = "Wait"; public string CurTaskState { get; set; } = "Wait";
/// <summary>
/// Job开始时间
/// </summary>
public DateTime StartJobTime { get; set; } = DateTime.Now;
/// <summary>
/// Job名称
/// </summary>
public string JobName { get; set; } = "";
protected void RecordRunLog(Agv_Info agv, string JobStep, string runInfo, string targetPlace)
{
AGVManager.RunLogInfo(new RunInfo(agv.Name.PadLeft(4, '0'), JobName, targetPlace, JobStep, runInfo, StartJobTime));
}
/// <summary> /// <summary>
/// 更新任务信息 /// 更新任务信息
/// </summary> /// </summary>
......
...@@ -22,7 +22,7 @@ namespace DeviceLibrary ...@@ -22,7 +22,7 @@ namespace DeviceLibrary
//不为空,且与上一个消息不一样才打印 //不为空,且与上一个消息不一样才打印
if (!value.Equals(msg)) if (!value.Equals(msg))
{ {
LogUtil.info(value); //LogUtil.info(value);
} }
} }
msg = value; msg = value;
...@@ -53,13 +53,12 @@ namespace DeviceLibrary ...@@ -53,13 +53,12 @@ namespace DeviceLibrary
/// </summary> /// </summary>
/// <param name="timeOutMilliseconds"></param> /// <param name="timeOutMilliseconds"></param>
/// <returns></returns> /// <returns></returns>
public bool IsTimeOut(int timeOutMilliseconds,out double timeOutValue) public bool IsTimeOut(int timeOutMilliseconds,out TimeSpan timeOutValue)
{ {
timeOutValue = 0;
TimeSpan span = DateTime.Now - startTime; TimeSpan span = DateTime.Now - startTime;
timeOutValue = span;
if (span.TotalMilliseconds > timeOutMilliseconds) if (span.TotalMilliseconds > timeOutMilliseconds)
{ {
timeOutValue = span.TotalSeconds;
return true; return true;
} }
return false; return false;
......
...@@ -14,6 +14,7 @@ namespace DeviceLibrary ...@@ -14,6 +14,7 @@ namespace DeviceLibrary
public ChargeJob(string agvPlae) public ChargeJob(string agvPlae)
{ {
this.agvPlace = agvPlae; this.agvPlace = agvPlae;
JobName = "充电任务";
} }
...@@ -22,7 +23,6 @@ namespace DeviceLibrary ...@@ -22,7 +23,6 @@ namespace DeviceLibrary
/// </summary> /// </summary>
private string agvPlace = SettingString.Standby; private string agvPlace = SettingString.Standby;
private string runInfo = "";
/// <summary> /// <summary>
/// 运行信息 /// 运行信息
/// </summary> /// </summary>
...@@ -31,7 +31,7 @@ namespace DeviceLibrary ...@@ -31,7 +31,7 @@ namespace DeviceLibrary
get { return string.Format("充电任务[{0}]:{1} ", CurTaskID, runInfo);} get { return string.Format("充电任务[{0}]:{1} ", CurTaskID, runInfo);}
} }
private JobStep<CHARGE_STEP> jobStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE); private JobStep<CHARGE_STEP> curJobStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE);
/// <summary> /// <summary>
/// 充电任务 /// 充电任务
...@@ -42,43 +42,43 @@ namespace DeviceLibrary ...@@ -42,43 +42,43 @@ namespace DeviceLibrary
string msg = string.Format("{0} 充电任务: ", agv.Name); string msg = string.Format("{0} 充电任务: ", agv.Name);
//bool rtn = false; //bool rtn = false;
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (jobStep.IsStep(CHARGE_STEP.NONE)) if (curJobStep.IsStep(CHARGE_STEP.NONE))
{ {
if (agv.Battery > AGVManager.Charge.BatteryMax) if (agv.Battery > AGVManager.Charge.BatteryMax)
{ {
if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(""))//在待机位 if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(""))//在待机位
{ {
jobStep.ToNextStep(CHARGE_STEP.END); curJobStep.ToNextStep(CHARGE_STEP.END);
runInfo = "在待机位,电量充足[" + agv.Battery + "%],等待任务"; runInfo = "在待机位,电量充足[" + agv.Battery + "%],等待任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Standby); MissionSys.AssignMission(agv,SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix) && AGVManager.CheckIsInAirDoor(agvPlace)) else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix) && AGVManager.CheckIsInAirDoor(agvPlace))
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR); curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = string.Format("电量充足{0}%,从当前位置{1}回到待机位,先过{2}风淋门", agv.Battery,agvPlace,SettingString.RoomC_Name); runInfo = string.Format("电量充足{0}%,从当前位置{1}回到待机位,先过{2}风淋门", agv.Battery,agvPlace,SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.DoorAirOut); MissionSys.AssignMission(agv,SettingString.DoorAirOut);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix)) else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR); curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR);
runInfo = string.Format("电量充足{0}%,从当前位置{1}回到待机位,先过{2}门", agv.Battery, agvPlace, SettingString.RoomC_Name); runInfo = string.Format("电量充足{0}%,从当前位置{1}回到待机位,先过{2}门", agv.Battery, agvPlace, SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.DoorCToD); MissionSys.AssignMission(agv,SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位"; runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Standby); MissionSys.AssignMission(agv,SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
...@@ -88,20 +88,20 @@ namespace DeviceLibrary ...@@ -88,20 +88,20 @@ namespace DeviceLibrary
{ {
if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix) && AGVManager.CheckIsInAirDoor(agvPlace)) if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix) && AGVManager.CheckIsInAirDoor(agvPlace))
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR); curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo =string.Format("电量{0}%小于最大电量{1}%,从当前位置{2}回到充电位,先过{3}风淋门", agv.Battery, AGVManager.Charge.BatteryMax, agvPlace,SettingString.RoomC_Name); runInfo =string.Format("电量{0}%小于最大电量{1}%,从当前位置{2}回到充电位,先过{3}风淋门", agv.Battery, AGVManager.Charge.BatteryMax, agvPlace,SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.DoorAirOut); MissionSys.AssignMission(agv,SettingString.DoorAirOut);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix)) else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR); curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR);
runInfo = string.Format("电量{0}%小于最大电量{1}%,从当前位置{2}回到充电位,先过{3}门", agv.Battery, AGVManager.Charge.BatteryMax, agvPlace, SettingString.RoomC_Name); runInfo = string.Format("电量{0}%小于最大电量{1}%,从当前位置{2}回到充电位,先过{3}门", agv.Battery, AGVManager.Charge.BatteryMax, agvPlace, SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.DoorCToD); MissionSys.AssignMission(agv,SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
...@@ -111,47 +111,47 @@ namespace DeviceLibrary ...@@ -111,47 +111,47 @@ namespace DeviceLibrary
if (!AGVManager.Charge.StartCharge(agv)) if (!AGVManager.Charge.StartCharge(agv))
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,充电桩有小车,从当前位置" + agvPlace + "回到待机位"; runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,充电桩有小车,从当前位置" + agvPlace + "回到待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Standby); MissionSys.AssignMission(agv,SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,从当前位置" + agvPlace + "去充电位"; runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,从当前位置" + agvPlace + "去充电位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
} }
} }
else if (jobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR)) else if (curJobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR))
{ {
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR); curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR);
runInfo = string.Format("电量充足{0}%,从当前位置{1}回到待机位,先过{2}门",agv.Battery, agvPlace,SettingString.RoomC_Name); runInfo = string.Format("电量充足{0}%,从当前位置{1}回到待机位,先过{2}门",agv.Battery, agvPlace,SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR)) else if (curJobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR))
{ {
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
{ {
if (agv.Battery >AGVManager.Charge.BatteryMax) if (agv.Battery >AGVManager.Charge.BatteryMax)
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量充足" + agv.Battery + "%,从当前位置" + agvPlace + "回到待机位"; runInfo = "电量充足" + agv.Battery + "%,从当前位置" + agvPlace + "回到待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -159,46 +159,46 @@ namespace DeviceLibrary ...@@ -159,46 +159,46 @@ namespace DeviceLibrary
{ {
if (!AGVManager.Charge.StartCharge(agv)) if (!AGVManager.Charge.StartCharge(agv))
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,充电桩有小车,从当前位置" + agvPlace + "回到待机位"; runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,充电桩有小车,从当前位置" + agvPlace + "回到待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,从当前位置" + agvPlace + "回到充电位"; runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,从当前位置" + agvPlace + "回到充电位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
} }
} }
else if (jobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION)) else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION))
{ {
if (MissionSys.CheckTaskIsOK(agv, CurTarName,CurTaskState)) if (MissionSys.CheckTaskIsOK(agv, CurTarName,CurTaskState))
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
runInfo = "开始充电任务"; runInfo = "开始充电任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (jobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK)) else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK))
{ {
if (CheckRandomCharge(agv)) if (CheckRandomCharge(agv))
{ {
if (agv.Battery >= AGVManager.Charge.BatteryMax) if (agv.Battery >= AGVManager.Charge.BatteryMax)
{ {
jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量充足,回待机位"; runInfo = "电量充足,回待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.Charge.DelOccupyInfo(agv); AGVManager.Charge.DelOccupyInfo(agv);
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
...@@ -210,8 +210,9 @@ namespace DeviceLibrary ...@@ -210,8 +210,9 @@ namespace DeviceLibrary
{ {
AGVManager.Charge.DelOccupyInfo(agv); AGVManager.Charge.DelOccupyInfo(agv);
runInfo = "充电过程检测到任务,电量" + agv.Battery + "%大于最小电量" + AGVManager.Charge.BatteryMin + "%,中断充电执行任务"; runInfo = "充电过程检测到任务,电量" + agv.Battery + "%大于最小电量" + AGVManager.Charge.BatteryMin + "%,中断充电执行任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job; return job;
} }
...@@ -221,10 +222,10 @@ namespace DeviceLibrary ...@@ -221,10 +222,10 @@ namespace DeviceLibrary
{ {
if (agv.Battery >= AGVManager.Charge.BatteryMax) if (agv.Battery >= AGVManager.Charge.BatteryMax)
{ {
jobStep.ToNextStep(CHARGE_STEP.END); curJobStep.ToNextStep(CHARGE_STEP.END);
runInfo = "充电完成"; runInfo = "充电完成";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
else if (agv.Battery >= AGVManager.Charge.BatteryMin) else if (agv.Battery >= AGVManager.Charge.BatteryMin)
{ {
...@@ -232,9 +233,10 @@ namespace DeviceLibrary ...@@ -232,9 +233,10 @@ namespace DeviceLibrary
if (job != null && !(job is ChargeJob)) if (job != null && !(job is ChargeJob))
{ {
runInfo = "充电过程中检测到任务,电量" + agv.Battery + "%大于最小电量" + AGVManager.Charge.BatteryMin + "%,中断充电执行任务"; runInfo = "充电过程中检测到任务,电量" + agv.Battery + "%大于最小电量" + AGVManager.Charge.BatteryMin + "%,中断充电执行任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.Charge.DelOccupyInfo(agv); AGVManager.Charge.DelOccupyInfo(agv);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job; return job;
} }
} }
...@@ -242,37 +244,39 @@ namespace DeviceLibrary ...@@ -242,37 +244,39 @@ namespace DeviceLibrary
} }
else if (jobStep.IsStep(CHARGE_STEP.WAIT_REACH_STANDBY)) else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_STANDBY))
{ {
if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
{ {
jobStep.ToNextStep(CHARGE_STEP.END); curJobStep.ToNextStep(CHARGE_STEP.END);
runInfo = "充电完成,到达待机位"; runInfo = "充电完成,到达待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (jobStep.IsStep(CHARGE_STEP.END)) else if (curJobStep.IsStep(CHARGE_STEP.END))
{ {
runInfo = "等待任务"; runInfo = "等待任务";
Job job = AGVManager.control.GetJob(agv); Job job = AGVManager.control.GetJob(agv);
if (job != null && !(job is ChargeJob)) if (job != null && !(job is ChargeJob))
{ {
runInfo = "在待机位检测到任务,执行任务"; runInfo = "在待机位检测到任务,执行任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.Charge.DelOccupyInfo(agv); AGVManager.Charge.DelOccupyInfo(agv);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job; return job;
} }
else if (job == null && agv.Battery < AGVManager.Charge.BatteryMax / 2) else if (job == null && agv.Battery < AGVManager.Charge.BatteryMax / 2)
{ {
jobStep.ToNextStep(CHARGE_STEP.NONE); curJobStep.ToNextStep(CHARGE_STEP.NONE);
runInfo = "在待机位暂无任务,且当前电量小于" + AGVManager.Charge.BatteryMax / 2 + "%,去充电位"; runInfo = "在待机位暂无任务,且当前电量小于" + AGVManager.Charge.BatteryMax / 2 + "%,去充电位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.Charge.DelOccupyInfo(agv); AGVManager.Charge.DelOccupyInfo(agv);
} }
} }
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this; return this;
} }
......
...@@ -22,6 +22,7 @@ namespace DeviceLibrary ...@@ -22,6 +22,7 @@ namespace DeviceLibrary
public EmptyAGVBackJob(string agvPlae) public EmptyAGVBackJob(string agvPlae)
{ {
this.agvPlace = agvPlae; this.agvPlace = agvPlae;
JobName = "返回任务";
} }
...@@ -40,7 +41,7 @@ namespace DeviceLibrary ...@@ -40,7 +41,7 @@ namespace DeviceLibrary
} }
private JobStep<EMPTY_AGV_BACK_STEP> jobStep = new JobStep<EMPTY_AGV_BACK_STEP>(EMPTY_AGV_BACK_STEP.NONE); private JobStep<EMPTY_AGV_BACK_STEP> curJobStep = new JobStep<EMPTY_AGV_BACK_STEP>(EMPTY_AGV_BACK_STEP.NONE);
/// <summary> /// <summary>
/// 空车返回执行 /// 空车返回执行
...@@ -51,7 +52,7 @@ namespace DeviceLibrary ...@@ -51,7 +52,7 @@ namespace DeviceLibrary
string msg = string.Format("{0} 返回任务: ", agv.Name); string msg = string.Format("{0} 返回任务: ", agv.Name);
//bool rtn = false; //bool rtn = false;
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (jobStep.IsStep(EMPTY_AGV_BACK_STEP.NONE)) if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.NONE))
{ {
if (AGVManager.FindEmptyShelfNode(agv, out string nodeName, true)) if (AGVManager.FindEmptyShelfNode(agv, out string nodeName, true))
{ {
...@@ -62,36 +63,37 @@ namespace DeviceLibrary ...@@ -62,36 +63,37 @@ namespace DeviceLibrary
if (AGVManager.CheckStationState(clientNode, out string rfid)) if (AGVManager.CheckStationState(clientNode, out string rfid))
{ {
runInfo = "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架"; runInfo = "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new GoEmptyShelfLineJob(agvPlace, nodeName, rfid); return new GoEmptyShelfLineJob(agvPlace, nodeName, rfid);
} }
else else
{ {
if (AGVManager.CheckIsInAirDoor(agvPlace)) if (AGVManager.CheckIsInAirDoor(agvPlace))
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomC_AIR_DOOR); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomC_AIR_DOOR);
runInfo = string.Format("从产线{0}回待机位,先过{1}风淋门", agvPlace,SettingString.RoomC_Name); runInfo = string.Format("从产线{0}回待机位,先过{1}风淋门", agvPlace,SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut); MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix)) else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR);
runInfo = string.Format("从产线{0}回待机位,先过{1}门", agvPlace,SettingString.RoomC_Name); runInfo = string.Format("从产线{0}回待机位,先过{1}门", agvPlace,SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回待机位"; runInfo = "从产线" + agvPlace + "回待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -101,28 +103,28 @@ namespace DeviceLibrary ...@@ -101,28 +103,28 @@ namespace DeviceLibrary
{ {
if (AGVManager.CheckIsInAirDoor(agvPlace)) if (AGVManager.CheckIsInAirDoor(agvPlace))
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomC_AIR_DOOR); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomC_AIR_DOOR);
runInfo = string.Format("从产线{0}回待机位,先过{1}风淋门", agvPlace,SettingString.RoomC_Name); runInfo = string.Format("从产线{0}回待机位,先过{1}风淋门", agvPlace,SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut); MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix)) else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR);
runInfo = string.Format("从产线{0}回待机位,先过{1}门", agvPlace, SettingString.RoomC_Name); runInfo = string.Format("从产线{0}回待机位,先过{1}门", agvPlace, SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回待机位"; runInfo = "从产线" + agvPlace + "回待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -133,34 +135,34 @@ namespace DeviceLibrary ...@@ -133,34 +135,34 @@ namespace DeviceLibrary
{ {
if (AGVManager.CheckIsInAirDoor(agvPlace)) if (AGVManager.CheckIsInAirDoor(agvPlace))
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomC_AIR_DOOR); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomC_AIR_DOOR);
runInfo = string.Format("从产线{0}回待机位,先过{1}风淋门", agvPlace, SettingString.RoomC_Name); runInfo = string.Format("从产线{0}回待机位,先过{1}风淋门", agvPlace, SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut); MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix)) else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR);
runInfo = string.Format("从产线{0}回待机位,先过{1}门", agvPlace, SettingString.RoomC_Name); runInfo = string.Format("从产线{0}回待机位,先过{1}门", agvPlace, SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回待机位"; runInfo = "从产线" + agvPlace + "回待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
} }
else if (jobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY)) else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
...@@ -169,15 +171,17 @@ namespace DeviceLibrary ...@@ -169,15 +171,17 @@ namespace DeviceLibrary
if (job == null && agv.Battery < AGVManager.Charge.BatteryMax) if (job == null && agv.Battery < AGVManager.Charge.BatteryMax)
{ {
runInfo = "到达待机位,电量" + agv.Battery + "小于最大电量" + AGVManager.Charge.BatteryMax + ",暂无任务,去充电"; runInfo = "到达待机位,电量" + agv.Battery + "小于最大电量" + AGVManager.Charge.BatteryMax + ",暂无任务,去充电";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new ChargeJob(SettingString.Standby); return new ChargeJob(SettingString.Standby);
} }
else else
{ {
runInfo = "到达待机位,检测到新任务,执行任务"; runInfo = "到达待机位,检测到新任务,执行任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job; return job;
} }
...@@ -187,27 +191,28 @@ namespace DeviceLibrary ...@@ -187,27 +191,28 @@ namespace DeviceLibrary
if (AGVManager.FindFullShelfTask(agv)) if (AGVManager.FindFullShelfTask(agv))
{ {
runInfo = "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6"; runInfo = "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new GoFullShelfStationJob(SettingString.Standby); return new GoFullShelfStationJob(SettingString.Standby);
} }
} }
} }
else if (jobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomC_AIR_DOOR)) else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomC_AIR_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{ {
jobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR); curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR);
runInfo = string.Format("从产线{0}回待机位,先过{1}门", agvPlace, SettingString.RoomC_Name); runInfo = string.Format("从产线{0}回待机位,先过{1}门", agvPlace, SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR)) else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
...@@ -215,19 +220,22 @@ namespace DeviceLibrary ...@@ -215,19 +220,22 @@ namespace DeviceLibrary
if (AGVManager.FindFullShelfTask(agv)) if (AGVManager.FindFullShelfTask(agv))
{ {
runInfo = string.Format("从产线{0}到达{1}门,检测到A6出满料,去A6", agvPlace, SettingString.RoomD_Name); runInfo = string.Format("从产线{0}到达{1}门,检测到A6出满料,去A6", agvPlace, SettingString.RoomD_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new GoFullShelfStationJob(SettingString.DoorCToD); return new GoFullShelfStationJob(SettingString.DoorCToD);
} }
else else
{ {
runInfo = string.Format("从产线{0}到达{1}门,暂无任务,去充电位", agvPlace, SettingString.RoomD_Name); runInfo = string.Format("从产线{0}到达{1}门,暂无任务,去充电位", agvPlace, SettingString.RoomD_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new ChargeJob(SettingString.DoorCToD); return new ChargeJob(SettingString.DoorCToD);
} }
} }
} }
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this; return this;
} }
/// <summary> /// <summary>
......
...@@ -23,6 +23,7 @@ namespace DeviceLibrary ...@@ -23,6 +23,7 @@ namespace DeviceLibrary
{ {
EmptyShelfPlace = lineName; EmptyShelfPlace = lineName;
this.shelfType = shelfType; this.shelfType = shelfType;
JobName = $"空料架{shelfType.ToString()}返回任务";
} }
/// <summary> /// <summary>
...@@ -46,7 +47,7 @@ namespace DeviceLibrary ...@@ -46,7 +47,7 @@ namespace DeviceLibrary
} }
private JobStep<EMPTY_SHELF_BACK_STEP> jobStep = new JobStep<EMPTY_SHELF_BACK_STEP>(EMPTY_SHELF_BACK_STEP.NONE); private JobStep<EMPTY_SHELF_BACK_STEP> curJobStep = new JobStep<EMPTY_SHELF_BACK_STEP>(EMPTY_SHELF_BACK_STEP.NONE);
/// <summary> /// <summary>
/// 空架任务执行 /// 空架任务执行
...@@ -57,23 +58,23 @@ namespace DeviceLibrary ...@@ -57,23 +58,23 @@ namespace DeviceLibrary
string msg = string.Format("{0} 空料架[{1}]返回: ", agv.Name, shelfType.ToString()); string msg = string.Format("{0} 空料架[{1}]返回: ", agv.Name, shelfType.ToString());
//bool rtn = false; //bool rtn = false;
//runInfo = "空料架返回:"; //runInfo = "空料架返回:";
if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE)) if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE))
{ {
if (AGVManager.CheckIsInAirDoor(EmptyShelfPlace))//C车间风淋门 if (AGVManager.CheckIsInAirDoor(EmptyShelfPlace))//C车间风淋门
{ {
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = string.Format("从产线{0}过{1}风淋门", EmptyShelfPlace,SettingString.RoomC_Name); runInfo = string.Format("从产线{0}过{1}风淋门", EmptyShelfPlace,SettingString.RoomC_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut); MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (EmptyShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix))//C车间 else if (EmptyShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix))//C车间
{ {
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo = string.Format("从产线{0}前往{1}门", EmptyShelfPlace,SettingString.RoomD_Name); runInfo = string.Format("从产线{0}前往{1}门", EmptyShelfPlace,SettingString.RoomD_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -82,10 +83,10 @@ namespace DeviceLibrary ...@@ -82,10 +83,10 @@ namespace DeviceLibrary
if (AGVManager.CheckA5A6State(agv, shelfType, out string nodeName)) if (AGVManager.CheckA5A6State(agv, shelfType, out string nodeName))
{ {
EmptyShelfTargetPlace = nodeName; EmptyShelfTargetPlace = nodeName;
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo = "从产线 [" + EmptyShelfPlace + "]送往双层线" + EmptyShelfTargetPlace; runInfo = "从产线 [" + EmptyShelfPlace + "]送往双层线" + EmptyShelfTargetPlace;
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
if (!EmptyShelfTargetPlace.Equals("")) if (!EmptyShelfTargetPlace.Equals(""))
{ {
MissionSys.AssignMission(agv, EmptyShelfTargetPlace); MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
...@@ -95,29 +96,29 @@ namespace DeviceLibrary ...@@ -95,29 +96,29 @@ namespace DeviceLibrary
} }
else else
{ {
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo = "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位"; runInfo = "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
} }
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR)) else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{ {
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo = string.Format("出风淋门,前往{0}门",SettingString.RoomD_Name); runInfo = string.Format("出风淋门,前往{0}门",SettingString.RoomD_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR)) else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
...@@ -125,52 +126,52 @@ namespace DeviceLibrary ...@@ -125,52 +126,52 @@ namespace DeviceLibrary
if (AGVManager.CheckA5A6State(agv, shelfType, out string nodeName)) if (AGVManager.CheckA5A6State(agv, shelfType, out string nodeName))
{ {
EmptyShelfTargetPlace = nodeName; EmptyShelfTargetPlace = nodeName;
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo = string.Format("进{0}门,送往双层线{1}",SettingString.RoomD_Name, EmptyShelfTargetPlace); runInfo = string.Format("进{0}门,送往双层线{1}",SettingString.RoomD_Name, EmptyShelfTargetPlace);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, EmptyShelfTargetPlace); MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo = string.Format("进{0}门,双层线暂不需要空料架,到待机位", SettingString.RoomD_Name); runInfo = string.Format("进{0}门,双层线暂不需要空料架,到待机位", SettingString.RoomD_Name);
runInfo = "进4D门,双层线暂不需要空料架,到待机位"; runInfo = "进4D门,双层线暂不需要空料架,到待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
} }
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY)) else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (AGVManager.CheckA5A6State(agv, shelfType, out string nodeName)) if (AGVManager.CheckA5A6State(agv, shelfType, out string nodeName))
{ {
EmptyShelfTargetPlace = nodeName; EmptyShelfTargetPlace = nodeName;
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo = "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace; runInfo = "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace;
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, EmptyShelfTargetPlace); MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6)) else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState) && EmptyShelfTargetPlace.StartsWith(SettingString.DoubleLine_Name_Prefix)) if (MissionSys.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState) && EmptyShelfTargetPlace.StartsWith(SettingString.DoubleLine_Name_Prefix))
{ {
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE);
runInfo = "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]"; runInfo = "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.server.ReadyEnter(EmptyShelfTargetPlace); AGVManager.server.ReadyEnter(EmptyShelfTargetPlace);
} }
} }
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE)) else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE))
{ {
int id = AGVManager.FindNode(EmptyShelfTargetPlace); int id = AGVManager.FindNode(EmptyShelfTargetPlace);
ClientNode node = AGVManager.nodeInfo[id]; ClientNode node = AGVManager.nodeInfo[id];
...@@ -178,64 +179,69 @@ namespace DeviceLibrary ...@@ -178,64 +179,69 @@ namespace DeviceLibrary
{ {
if (!agv.CurTarName.Equals(SettingString.Leave)) if (!agv.CurTarName.Equals(SettingString.Leave))
{ {
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE);
runInfo = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行"; runInfo = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Leave); MissionSys.AssignMission(agv, SettingString.Leave);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsTimeOut(15000, out double timeOutValue)) else if (curJobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{ {
tryTimes++; tryTimes++;
if (tryTimes < 3) if (tryTimes < 3)
return this; return this;
tryTimes = 0; tryTimes = 0;
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY); curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo = "双层线" + EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位"; runInfo = "双层线" + EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE)) else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv,SettingString.Leave, CurTaskState)) if (MissionSys.CheckTaskFinished(agv,SettingString.Leave, CurTaskState))
{ {
agv.RFID = ""; agv.RFID = "";
agv.HasError = false;
Job job = AGVManager.control.GetJob(agv); Job job = AGVManager.control.GetJob(agv);
if (job != null) if (job != null)
{ {
runInfo = "在双层线检测到任务,执行任务"; runInfo = "在双层线检测到任务,执行任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job; return job;
} }
else else
{ {
runInfo = "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位"; runInfo = "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
agv.RFID = ""; agv.RFID = "";
agv.BoxDestInfo = ""; agv.BoxDestInfo = "";
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new ChargeJob(SettingString.DoubleLine_Name_Prefix); return new ChargeJob(SettingString.DoubleLine_Name_Prefix);
} }
} }
else if (jobStep.IsTimeOut(60000, out double timeOutValue)) else if (curJobStep.IsTimeOut(60000, out TimeSpan timeOutValue1))
{ {
runInfo = "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况"; runInfo = "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时,请检查料架离开小车的情况";
agv.HasError = true;
agv.SetErrorMsg("空料架在[" + EmptyShelfTargetPlace + "]进入小车超时", timeOutValue1.TotalMinutes.ToString("f2"));
} }
} }
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.END)) else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.END))
{ {
} }
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this; return this;
} }
......
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
/// <summary> /// <summary>
...@@ -104,7 +106,7 @@ namespace DeviceLibrary ...@@ -104,7 +106,7 @@ namespace DeviceLibrary
MissionSys.AssignMission(agv, SettingString.Leave); MissionSys.AssignMission(agv, SettingString.Leave);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (jobStep.IsTimeOut(15000, out double timeOutValue)) else if (jobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{ {
jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.NONE); jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.NONE);
runInfo = "AGV到达 " + LineName + ",15秒后重新向产线发送入料架请求[ReadyEnter]"; runInfo = "AGV到达 " + LineName + ",15秒后重新向产线发送入料架请求[ReadyEnter]";
...@@ -125,7 +127,7 @@ namespace DeviceLibrary ...@@ -125,7 +127,7 @@ namespace DeviceLibrary
MissionSys.AssignMission(agv, SettingString.Enter); MissionSys.AssignMission(agv, SettingString.Enter);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (jobStep.IsTimeOut(15000, out double timeOutValue)) else if (jobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{ {
jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.NONE); jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.NONE);
runInfo= "AGV到达 " + LineName + ",15秒后重新向产线发送入料架请求[ReadyLeave]"; runInfo= "AGV到达 " + LineName + ",15秒后重新向产线发送入料架请求[ReadyLeave]";
...@@ -147,7 +149,7 @@ namespace DeviceLibrary ...@@ -147,7 +149,7 @@ namespace DeviceLibrary
return new EmptyAGVBackJob(LineName); return new EmptyAGVBackJob(LineName);
} }
else if (jobStep.IsTimeOut(60000, out double timeOutValue)) else if (jobStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{ {
//链条停止 //链条停止
runInfo= "料架在[" + LineName + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况"; runInfo= "料架在[" + LineName + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
...@@ -169,7 +171,7 @@ namespace DeviceLibrary ...@@ -169,7 +171,7 @@ namespace DeviceLibrary
AGVManager.unlockManager.DelMission(LineName,RFID); AGVManager.unlockManager.DelMission(LineName,RFID);
return new EmptyShelfBackJob(LineName,eShelfType.BigShelf); return new EmptyShelfBackJob(LineName,eShelfType.BigShelf);
} }
else if (jobStep.IsTimeOut(60000, out double timeOutValue)) else if (jobStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{ {
//链条停止 //链条停止
runInfo= "料架在[" + LineName + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况"; runInfo= "料架在[" + LineName + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
......
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
...@@ -17,6 +18,7 @@ namespace DeviceLibrary ...@@ -17,6 +18,7 @@ namespace DeviceLibrary
EmptyShelfPlace = palce; EmptyShelfPlace = palce;
this.agvPlae = agvPlae; this.agvPlae = agvPlae;
RFID = rfid; RFID = rfid;
JobName = "回收空料架任务";
} }
public string RFID { get; set; } public string RFID { get; set; }
/// <summary> /// <summary>
...@@ -40,7 +42,7 @@ namespace DeviceLibrary ...@@ -40,7 +42,7 @@ namespace DeviceLibrary
} }
private JobStep<TAKE_EMPTY_STEP> jobStep = new JobStep<TAKE_EMPTY_STEP>(TAKE_EMPTY_STEP.NONE); private JobStep<TAKE_EMPTY_STEP> curJobStep = new JobStep<TAKE_EMPTY_STEP>(TAKE_EMPTY_STEP.NONE);
/// <summary> /// <summary>
/// 空架任务执行,去目的地 /// 空架任务执行,去目的地
...@@ -51,14 +53,14 @@ namespace DeviceLibrary ...@@ -51,14 +53,14 @@ namespace DeviceLibrary
string msg = string.Format("{0} 回收空料架[RFID={1}]: ", agv.Name, RFID); string msg = string.Format("{0} 回收空料架[RFID={1}]: ", agv.Name, RFID);
//bool rtn = false; //bool rtn = false;
int nodeIdx = AGVManager.FindNode(EmptyShelfPlace); int nodeIdx = AGVManager.FindNode(EmptyShelfPlace);
if (jobStep.IsStep(TAKE_EMPTY_STEP.NONE)) if (curJobStep.IsStep(TAKE_EMPTY_STEP.NONE))
{ {
if (agvPlae.StartsWith(SettingString.RoomC_Name_Prefix) && AGVManager.CheckIsInAirDoor(agvPlae) && !AGVManager.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门内->风淋门外 if (agvPlae.StartsWith(SettingString.RoomC_Name_Prefix) && AGVManager.CheckIsInAirDoor(agvPlae) && !AGVManager.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门内->风淋门外
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut); MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -68,19 +70,19 @@ namespace DeviceLibrary ...@@ -68,19 +70,19 @@ namespace DeviceLibrary
{ {
if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用 if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]"; runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv); AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirIn); MissionSys.AssignMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -89,10 +91,10 @@ namespace DeviceLibrary ...@@ -89,10 +91,10 @@ namespace DeviceLibrary
agvPlae.Equals(SettingString.AutoCharge)) agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix))//4D->4C && EmptyShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix))//4D->4C
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorDToC); MissionSys.AssignMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -103,19 +105,19 @@ namespace DeviceLibrary ...@@ -103,19 +105,19 @@ namespace DeviceLibrary
{ {
if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用 if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先过风淋门,再到临时待机位" + "[RFID=" + RFID + "]"; runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先过风淋门,再到临时待机位" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut); MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (agvPlae.Equals("") || (!AGVManager.CheckIsInAirDoor(agvPlae)) && !AGVManager.CheckIsInAirDoor(EmptyShelfPlace))//都在风淋门外 else if (agvPlae.Equals("") || (!AGVManager.CheckIsInAirDoor(agvPlae)) && !AGVManager.CheckIsInAirDoor(EmptyShelfPlace))//都在风淋门外
...@@ -124,27 +126,27 @@ namespace DeviceLibrary ...@@ -124,27 +126,27 @@ namespace DeviceLibrary
{ {
if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用 if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]"; runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv); AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (agvPlae.StartsWith(SettingString.RoomC_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.RoomD_Name_Prefix))//4C->4D else if (agvPlae.StartsWith(SettingString.RoomC_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.RoomD_Name_Prefix))//4C->4D
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -152,27 +154,27 @@ namespace DeviceLibrary ...@@ -152,27 +154,27 @@ namespace DeviceLibrary
agvPlae.Equals(SettingString.AutoCharge)) agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix))//4D->4C && EmptyShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix))//4D->4C
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorDToC); MissionSys.AssignMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else//4D->4D else//4D->4D
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
...@@ -182,65 +184,65 @@ namespace DeviceLibrary ...@@ -182,65 +184,65 @@ namespace DeviceLibrary
{ {
if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用 if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]"; runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv); AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "到风淋门外,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "到风淋门外,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (agvPlae.StartsWith(SettingString.RoomC_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.RoomD_Name_Prefix))//4C->4D else if (agvPlae.StartsWith(SettingString.RoomC_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.RoomD_Name_Prefix))//4C->4D
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "到风淋门外,去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "到风淋门外,去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
//都在风淋门内,到达风淋门外 //都在风淋门内,到达风淋门外
else else
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]"; runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv); AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{ {
//4C风淋门外->风淋门内 //4C风淋门外->风淋门内
jobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "到达风淋门内,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "到达风淋门内,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorDToC, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorDToC, CurTaskState))
{ {
if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用 if (AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//被占用
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]"; runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv); AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -248,80 +250,80 @@ namespace DeviceLibrary ...@@ -248,80 +250,80 @@ namespace DeviceLibrary
{ {
if (AGVManager.CheckIsInAirDoor(EmptyShelfPlace)) if (AGVManager.CheckIsInAirDoor(EmptyShelfPlace))
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirIn); MissionSys.AssignMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.C4_STANDBY1, CurTaskState) || MissionSys.CheckTaskFinished(agv, SettingString.C4_STANDBY2, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.C4_STANDBY1, CurTaskState) || MissionSys.CheckTaskFinished(agv, SettingString.C4_STANDBY2, CurTaskState))
{ {
if (!AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//未占用 if (!AGVManager.CheckRoomCTarget(agv, EmptyShelfPlace))//未占用
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
//AGVManager.DeleteStandyInfo(agv); //AGVManager.DeleteStandyInfo(agv);
} }
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]"; runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK))
{ {
if (nodeIdx > -1) if (nodeIdx > -1)
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK);
runInfo = "AGV 添加任务:移动到" + EmptyShelfPlace + "[RFID=" + RFID + "]"; runInfo = "AGV 添加任务:移动到" + EmptyShelfPlace + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, EmptyShelfPlace); MissionSys.AssignMission(agv, EmptyShelfPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = EmptyShelfPlace + " 不存在或未开启调用"; runInfo = EmptyShelfPlace + " 不存在或未开启调用";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK))
{ {
if (agv.CurTaskState.Equals(SettingString.Executing)) if (agv.CurTaskState.Equals(SettingString.Executing))
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
runInfo = "AGV开始向目的地[" + EmptyShelfPlace + "]移动" + "[RFID=" + RFID + "]"; runInfo = "AGV开始向目的地[" + EmptyShelfPlace + "]移动" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, EmptyShelfPlace, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, EmptyShelfPlace, CurTaskState))
...@@ -335,15 +337,15 @@ namespace DeviceLibrary ...@@ -335,15 +337,15 @@ namespace DeviceLibrary
//} //}
//else //else
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE);
runInfo = "AGV到达 " + EmptyShelfPlace + " 向产线发送出料架请求[ReadyLeave]" + "[RFID=" + RFID + "]"; runInfo = "AGV到达 " + EmptyShelfPlace + " 向产线发送出料架请求[ReadyLeave]" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
if (nodeIdx == -1) if (nodeIdx == -1)
{ {
runInfo = EmptyShelfPlace + " 未开启调用"; runInfo = EmptyShelfPlace + " 未开启调用";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
return this; return this;
} }
ClientNode node = AGVManager.nodeInfo[nodeIdx]; ClientNode node = AGVManager.nodeInfo[nodeIdx];
...@@ -353,52 +355,57 @@ namespace DeviceLibrary ...@@ -353,52 +355,57 @@ namespace DeviceLibrary
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE))
{ {
if (nodeIdx == -1) if (nodeIdx == -1)
{ {
runInfo = EmptyShelfPlace + " 未开启调用"; runInfo = EmptyShelfPlace + " 未开启调用";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
return this; return this;
} }
ClientNode node = AGVManager.nodeInfo[nodeIdx]; ClientNode node = AGVManager.nodeInfo[nodeIdx];
agv.RFID = node.RFID; agv.RFID = node.RFID;
if (node.StateEquals(eNodeStatus.MayLeave)) if (node.StateEquals(eNodeStatus.MayLeave))
{ {
agv.HasError = false;
if (!agv.CurTarName.Equals("Enter")) if (!agv.CurTarName.Equals("Enter"))
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF);
runInfo = "收到产线出料请求[ReadyLeave]的响应 " + EmptyShelfPlace + "出料架,小车链条运行" + "[RFID=" + RFID + "]"; runInfo = "收到产线出料请求[ReadyLeave]的响应 " + EmptyShelfPlace + "出料架,小车链条运行" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
//agv.RFID = node.RFID; //agv.RFID = node.RFID;
MissionSys.AssignMission(agv, SettingString.Enter); MissionSys.AssignMission(agv, SettingString.Enter);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsTimeOut(15000, out double timeOutValue)) else if (curJobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{ {
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE); curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
agv.HasError = true;
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.Enter, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.Enter, CurTaskState))
{ {
agv.HasError = false;
ClientNode node = AGVManager.nodeInfo[nodeIdx]; ClientNode node = AGVManager.nodeInfo[nodeIdx];
//回收空料架数量减少1 //回收空料架数量减少1
AGVManager.unlockManager.DelMission(EmptyShelfPlace, RFID); AGVManager.unlockManager.DelMission(EmptyShelfPlace, RFID);
if (!agvPlae.Equals(SettingString.RoomDFeederOut) && !agvPlae.Equals(SettingString.RoomCFeederOut)) if (!agvPlae.Equals(SettingString.RoomDFeederOut) && !agvPlae.Equals(SettingString.RoomCFeederOut))
HttpManager.ClearRFID(EmptyShelfPlace, RFID); HttpManager.ClearRFID(EmptyShelfPlace, RFID);
runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车完成" + "[RFID=" + RFID + "]"; runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车完成" + "[RFID=" + RFID + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
//4DfeederOut默认大料架 //4DfeederOut默认大料架
// if (agv.Place.Equals(SettingString.RoomDFeederOut)) // if (agv.Place.Equals(SettingString.RoomDFeederOut))
// return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf); // return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
if (agv.RFID.StartsWith("D")) if (agv.RFID.StartsWith("D"))
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.SmallShelf); return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.SmallShelf);
...@@ -410,20 +417,19 @@ namespace DeviceLibrary ...@@ -410,20 +417,19 @@ namespace DeviceLibrary
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.SmallShelf); return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.SmallShelf);
} }
else if (jobStep.IsTimeOut(60000, out double timeOutValue)) else if (curJobStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{ {
//链条停止 //链条停止
runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况" + "[RFID=" + RFID + "]"; runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车超时[RFID=" + RFID + "]";
// msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); agv.HasError = true;
//TakeEmptyStep.Msg = msg; agv.SetErrorMsg("空料架在[" + EmptyShelfPlace + "]进入小车超时", timeOutValue.TotalMinutes.ToString("f2"));
} }
} }
else if (jobStep.IsStep(TAKE_EMPTY_STEP.END)) else if (curJobStep.IsStep(TAKE_EMPTY_STEP.END))
{ {
} }
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this; return this;
} }
......
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
/// <summary> /// <summary>
...@@ -15,6 +17,7 @@ namespace DeviceLibrary ...@@ -15,6 +17,7 @@ namespace DeviceLibrary
{ {
FullShelfStationPlace = palce; FullShelfStationPlace = palce;
agvPlace = agvCurPlace; agvPlace = agvCurPlace;
JobName = "接满料任务";
} }
/// <summary> /// <summary>
...@@ -42,69 +45,69 @@ namespace DeviceLibrary ...@@ -42,69 +45,69 @@ namespace DeviceLibrary
public HttpManager.BoxDestInfo FullShelfDestInfo = null; public HttpManager.BoxDestInfo FullShelfDestInfo = null;
private JobStep<GO_FULL_SHELF_STATION_STEP> jobStep = new JobStep<GO_FULL_SHELF_STATION_STEP>(GO_FULL_SHELF_STATION_STEP.NONE); private JobStep<GO_FULL_SHELF_STATION_STEP> curJobStep = new JobStep<GO_FULL_SHELF_STATION_STEP>(GO_FULL_SHELF_STATION_STEP.NONE);
public override Job Execute(Agv_Info agv) public override Job Execute(Agv_Info agv)
{ {
string msg = string.Format("{0} 接满料任务: ", agv.Name); string msg = string.Format("{0} 接满料任务: ", agv.Name);
//bool rtn = false; //bool rtn = false;
if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE)) if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE))
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT);
runInfo = "检查AGV负载情况"; runInfo = "检查AGV负载情况";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.CheckShelf); MissionSys.AssignMission(agv, SettingString.CheckShelf);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT)) else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.CheckShelf, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.CheckShelf, CurTaskState))
{ {
if (agv.IsExistShelf) if (agv.IsExistShelf)
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
runInfo = "车上有料架,无法去入料口出料"; runInfo = "车上有料架,无法去入料口出料";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
IsLoadOnAGV = true; IsLoadOnAGV = true;
} }
else if (!agv.IsExistShelf) else if (!agv.IsExistShelf)
{ {
if (agvPlace.Equals("") || agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务 if (agvPlace.Equals("") || agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace; runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace;
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfStationPlace); MissionSys.AssignMission(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (AGVManager.CheckIsInAirDoor(agvPlace)) else if (AGVManager.CheckIsInAirDoor(agvPlace))
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "在风淋门内,先过风淋门"; runInfo = "在风淋门内,先过风淋门";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut); MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))//4C车间 else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))//4C车间
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
runInfo = string.Format("在{0}车间,向{1}门运行,再到双层线入料口", SettingString.RoomC_Name, SettingString.RoomD_Name); runInfo = string.Format("在{0}车间,向{1}门运行,再到双层线入料口", SettingString.RoomC_Name, SettingString.RoomD_Name);
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace; runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace;
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfStationPlace); MissionSys.AssignMission(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -113,35 +116,35 @@ namespace DeviceLibrary ...@@ -113,35 +116,35 @@ namespace DeviceLibrary
} }
} }
else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR)) else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
runInfo = string.Format("过风淋门,向{0}门运行,再到双层线入料口{1}", SettingString.RoomD_Name,FullShelfStationPlace); runInfo = string.Format("过风淋门,向{0}门运行,再到双层线入料口{1}", SettingString.RoomD_Name,FullShelfStationPlace);
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD); MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR)) else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = string.Format("到达{0}门,准备运动到双层线入料口{1}", SettingString.RoomD_Name, FullShelfStationPlace); runInfo = string.Format("到达{0}门,准备运动到双层线入料口{1}", SettingString.RoomD_Name, FullShelfStationPlace);
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfStationPlace); MissionSys.AssignMission(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6)) else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, FullShelfStationPlace, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, FullShelfStationPlace, CurTaskState))
...@@ -152,15 +155,15 @@ namespace DeviceLibrary ...@@ -152,15 +155,15 @@ namespace DeviceLibrary
{ {
if (HttpManager.FindFullShelfTarget(node.RFID, out FullShelfDestInfo)) if (HttpManager.FindFullShelfTarget(node.RFID, out FullShelfDestInfo))
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_DOUBLE_LINE_RESPONSE); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_DOUBLE_LINE_RESPONSE);
if (FullShelfDestInfo != null) if (FullShelfDestInfo != null)
{ {
AGVManager.GetLineNameByNodeName(FullShelfDestInfo.location, out string line); AGVManager.GetLineNameByNodeName(FullShelfDestInfo.location, out string line);
agv.BoxDestInfo = FullShelfDestInfo.ShowInfo(line); agv.BoxDestInfo = FullShelfDestInfo.ShowInfo(line);
} }
runInfo = "AGV到达 " + FullShelfStationPlace + ",并发送出料架请求[ReadyLeave]"; runInfo = "AGV到达 " + FullShelfStationPlace + ",并发送出料架请求[ReadyLeave]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.server.ReadyLeave(FullShelfStationPlace); AGVManager.server.ReadyLeave(FullShelfStationPlace);
} }
else else
...@@ -169,16 +172,16 @@ namespace DeviceLibrary ...@@ -169,16 +172,16 @@ namespace DeviceLibrary
{ {
AGVManager.GetLineNameByNodeName(FullShelfDestInfo.location, out string line); AGVManager.GetLineNameByNodeName(FullShelfDestInfo.location, out string line);
runInfo = "AGV到达 " + FullShelfStationPlace + ",查询满料架目的地:" + FullShelfDestInfo.ShowInfo(line); runInfo = "AGV到达 " + FullShelfStationPlace + ",查询满料架目的地:" + FullShelfDestInfo.ShowInfo(line);
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); ; msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo); ;
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
else else
{ {
//[{"msg":"0料车已解绑或未发新料"}] //[{"msg":"0料车已解绑或未发新料"}]
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回到待机位"; runInfo = "从产线" + agvPlace + "回到待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby); MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -188,70 +191,76 @@ namespace DeviceLibrary ...@@ -188,70 +191,76 @@ namespace DeviceLibrary
} }
} }
else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY)) else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
runInfo = "到达待机位"; runInfo = "到达待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_DOUBLE_LINE_RESPONSE)) else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_DOUBLE_LINE_RESPONSE))
{ {
int id = AGVManager.FindNode(FullShelfStationPlace); int id = AGVManager.FindNode(FullShelfStationPlace);
if (id == -1) if (id == -1)
{ {
runInfo = "未找到节点:" + FullShelfStationPlace; runInfo = "未找到节点:" + FullShelfStationPlace;
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
return this; return this;
} }
ClientNode node = AGVManager.nodeInfo[id]; ClientNode node = AGVManager.nodeInfo[id];
if (node.StateEquals(eNodeStatus.MayLeave)) if (node.StateEquals(eNodeStatus.MayLeave))
{ {
agv.HasError = false;
if (!agv.CurTarName.Equals("Enter")) if (!agv.CurTarName.Equals("Enter"))
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT__FULL_SHELF_IN_AGV); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT__FULL_SHELF_IN_AGV);
runInfo = "收到双层线出料架请求[ReadyLeave]的响应 " + FullShelfStationPlace + "出料架,小车链条运行"; runInfo = "收到双层线出料架请求[ReadyLeave]的响应 " + FullShelfStationPlace + "出料架,小车链条运行";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Enter); MissionSys.AssignMission(agv,SettingString.Enter);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsTimeOut(15000, out double timeOutValue)) else if (curJobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{ {
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6); curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
agv.HasError = true;
agv.SetErrorMsg($"{FullShelfStationPlace}回复出料请求超时", timeOutValue.TotalMinutes.ToString("f2"));
} }
} }
else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT__FULL_SHELF_IN_AGV)) else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT__FULL_SHELF_IN_AGV))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.Enter, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.Enter, CurTaskState))
{ {
agv.HasError = false;
//GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END); //GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
runInfo = FullShelfStationPlace + "满料架进入小车完成"; runInfo = FullShelfStationPlace + "满料架进入小车完成";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new SendFullShelfToLineJob(FullShelfDestInfo); return new SendFullShelfToLineJob(FullShelfDestInfo);
} }
else if (jobStep.IsTimeOut(60000, out double timeOutValue)) else if (curJobStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{ {
//链条停止 //链条停止
runInfo = "满料架在[" + FullShelfStationPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况"; runInfo = "满料架在[" + FullShelfStationPlace + "]进入小车超时,请检查料架进入小车的情况";
//msg +=runInfo; //msg +=runInfo;
//GoFullShelfStationStep.Msg = msg; //GoFullShelfStationStep.Msg = msg;
agv.HasError = true;
agv.SetErrorMsg("满料架在[" + FullShelfStationPlace + "]进入小车超时", timeOutValue.TotalMinutes.ToString("f2"));
} }
} }
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this; return this;
} }
......
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
/// <summary> /// <summary>
...@@ -18,6 +20,7 @@ namespace DeviceLibrary ...@@ -18,6 +20,7 @@ namespace DeviceLibrary
RFID = boxDestInfo.id; RFID = boxDestInfo.id;
BoxDestInfo = boxDestInfo; BoxDestInfo = boxDestInfo;
IsIgnoreBigShelf = isIgNoreBigShelf; IsIgnoreBigShelf = isIgNoreBigShelf;
JobName = "送满料任务";
} }
/// <summary> /// <summary>
...@@ -44,47 +47,47 @@ namespace DeviceLibrary ...@@ -44,47 +47,47 @@ namespace DeviceLibrary
} }
private JobStep<SEND_FULL_SHELF_STEP> jobStep = new JobStep<SEND_FULL_SHELF_STEP>(SEND_FULL_SHELF_STEP.NONE); private JobStep<SEND_FULL_SHELF_STEP> curJobStep = new JobStep<SEND_FULL_SHELF_STEP>(SEND_FULL_SHELF_STEP.NONE);
public override Job Execute(Agv_Info agv) public override Job Execute(Agv_Info agv)
{ {
string msg = string.Format("{0} 送满料任务[RFID={1}]: ", agv.Name,RFID); string msg = string.Format("{0} 送满料任务[RFID={1}]: ", agv.Name,RFID);
//bool rtn = false; //bool rtn = false;
agv.RFID = RFID; agv.RFID = RFID;
if (jobStep.IsStep(SEND_FULL_SHELF_STEP.NONE)) if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.NONE))
{ {
HttpManager.AgvRemoveRfid(RFID); HttpManager.AgvRemoveRfid(RFID);
if (FullShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix)) if (FullShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR);
runInfo = string.Format("前往{0}门,从双层线A6送往{1}",SettingString.RoomD_Name, FullShelfPlace); runInfo = string.Format("前往{0}门,从双层线A6送往{1}",SettingString.RoomD_Name, FullShelfPlace);
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorDToC); MissionSys.AssignMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从双层线A6送往[" + FullShelfPlace + "]"; runInfo = "从双层线A6送往[" + FullShelfPlace + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfPlace); MissionSys.AssignMission(agv, FullShelfPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR)) else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorDToC, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorDToC, CurTaskState))
{ {
if (AGVManager.CheckRoomCTarget(agv, FullShelfPlace))//被占用 if (AGVManager.CheckRoomCTarget(agv, FullShelfPlace))//被占用
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + FullShelfPlace + "有小车占用,先到临时待机位"; runInfo = "目的地" + FullShelfPlace + "有小车占用,先到临时待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv); AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -92,19 +95,19 @@ namespace DeviceLibrary ...@@ -92,19 +95,19 @@ namespace DeviceLibrary
{ {
if(AGVManager.CheckIsInAirDoor(FullShelfPlace)) if(AGVManager.CheckIsInAirDoor(FullShelfPlace))
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "到达"+SettingString.RoomC_Name+"门,过风淋门[" + FullShelfPlace + "]"; runInfo = "到达"+SettingString.RoomC_Name+"门,过风淋门[" + FullShelfPlace + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirIn); MissionSys.AssignMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从双层线A6送往[" + FullShelfPlace + "]"; runInfo = "从双层线A6送往[" + FullShelfPlace + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfPlace); MissionSys.AssignMission(agv, FullShelfPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -112,20 +115,20 @@ namespace DeviceLibrary ...@@ -112,20 +115,20 @@ namespace DeviceLibrary
} }
} }
else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR)) else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "送往[" + FullShelfPlace + "]"; runInfo = "送往[" + FullShelfPlace + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfPlace); MissionSys.AssignMission(agv, FullShelfPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE)) else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, SettingString.C4_STANDBY1, CurTaskState) || MissionSys.CheckTaskFinished(agv, SettingString.C4_STANDBY2, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, SettingString.C4_STANDBY1, CurTaskState) || MissionSys.CheckTaskFinished(agv, SettingString.C4_STANDBY2, CurTaskState))
...@@ -134,26 +137,26 @@ namespace DeviceLibrary ...@@ -134,26 +137,26 @@ namespace DeviceLibrary
{ {
if (AGVManager.CheckIsInAirDoor(FullShelfPlace)) if (AGVManager.CheckIsInAirDoor(FullShelfPlace))
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "到临时待机位,去产线先过风淋门[" + FullShelfPlace + "]"; runInfo = "到临时待机位,去产线先过风淋门[" + FullShelfPlace + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirIn); MissionSys.AssignMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
else else
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从临时待机位送往[" + FullShelfPlace + "]"; runInfo = "从临时待机位送往[" + FullShelfPlace + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfPlace); MissionSys.AssignMission(agv, FullShelfPlace);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
} }
} }
else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE)) else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv, FullShelfPlace, CurTaskState)) if (MissionSys.CheckTaskFinished(agv, FullShelfPlace, CurTaskState))
...@@ -167,34 +170,34 @@ namespace DeviceLibrary ...@@ -167,34 +170,34 @@ namespace DeviceLibrary
//} //}
if (IsIgnoreBigShelf) if (IsIgnoreBigShelf)
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE);
runInfo = "AGV到达 " + FullShelfPlace + ",并发送入料架请求[ReadyEnter]"; runInfo = "AGV到达 " + FullShelfPlace + ",并发送入料架请求[ReadyEnter]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.server.ReadyEnter(FullShelfPlace); AGVManager.server.ReadyEnter(FullShelfPlace);
} }
else else
{ {
if (RFID.StartsWith(SettingString.BigShelf_Prefix) && !FullShelfPlace.Equals(SettingString.RoomDFeederIn) && !FullShelfPlace.Equals(SettingString.RoomCFeederIn)) if (RFID.StartsWith(SettingString.BigShelf_Prefix) && !FullShelfPlace.Equals(SettingString.RoomDFeederIn) && !FullShelfPlace.Equals(SettingString.RoomCFeederIn))
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK);
runInfo = "AGV到达 " + FullShelfPlace + ",并等待大料架移库操作"; runInfo = "AGV到达 " + FullShelfPlace + ",并等待大料架移库操作";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
} }
else else
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE);
runInfo = "AGV到达 " + FullShelfPlace + ",并发送入料架请求[ReadyEnter]"; runInfo = "AGV到达 " + FullShelfPlace + ",并发送入料架请求[ReadyEnter]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
AGVManager.server.ReadyEnter(FullShelfPlace); AGVManager.server.ReadyEnter(FullShelfPlace);
} }
} }
} }
} }
else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK)) else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK))
{ {
MiR_API.Get_IO_Status(agv, out bool[] input, out bool[] output); MiR_API.Get_IO_Status(agv, out bool[] input, out bool[] output);
System.Threading.Thread.Sleep(50); System.Threading.Thread.Sleep(50);
...@@ -202,12 +205,13 @@ namespace DeviceLibrary ...@@ -202,12 +205,13 @@ namespace DeviceLibrary
{ {
runInfo = "大料架在" + FullShelfPlace + "移库完成[" + agv.BoxDestInfo + "]"; runInfo = "大料架在" + FullShelfPlace + "移库完成[" + agv.BoxDestInfo + "]";
agv.BoxDestInfo = ""; agv.BoxDestInfo = "";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new EmptyShelfBackJob(FullShelfPlace, eShelfType.BigShelf); return new EmptyShelfBackJob(FullShelfPlace, eShelfType.BigShelf);
} }
} }
else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE)) else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE))
{ {
int id = AGVManager.FindNode(FullShelfPlace); int id = AGVManager.FindNode(FullShelfPlace);
ClientNode node = AGVManager.nodeInfo[id]; ClientNode node = AGVManager.nodeInfo[id];
...@@ -217,10 +221,10 @@ namespace DeviceLibrary ...@@ -217,10 +221,10 @@ namespace DeviceLibrary
{ {
if (!agv.CurTarName.Equals(SettingString.Leave)) if (!agv.CurTarName.Equals(SettingString.Leave))
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE);
runInfo = "收到产线入料架请求[ReadyEnter]的响应 " + FullShelfPlace + "入料架,小车链条运行"; runInfo = "收到产线入料架请求[ReadyEnter]的响应 " + FullShelfPlace + "入料架,小车链条运行";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Leave); MissionSys.AssignMission(agv,SettingString.Leave);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
...@@ -228,41 +232,49 @@ namespace DeviceLibrary ...@@ -228,41 +232,49 @@ namespace DeviceLibrary
} }
else if (input != null && !input[3] && input[0]) else if (input != null && !input[3] && input[0])
{ {
agv.HasError = false;
runInfo = "手动操作:满料架进入" + FullShelfPlace + "完成[" + agv.BoxDestInfo + "]"; runInfo = "手动操作:满料架进入" + FullShelfPlace + "完成[" + agv.BoxDestInfo + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
agv.RFID = ""; agv.RFID = "";
agv.BoxDestInfo = ""; agv.BoxDestInfo = "";
HttpManager.UpdateStatus(RFID, FullShelfPlace); HttpManager.UpdateStatus(RFID, FullShelfPlace);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new EmptyAGVBackJob(FullShelfPlace); return new EmptyAGVBackJob(FullShelfPlace);
} }
else if (jobStep.IsTimeOut(15000, out double timeOutValue)) else if (curJobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{ {
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "AGV到达 " + FullShelfPlace + ",15秒后重新向产线发送入料架请求[ReadyEnter]"; runInfo = "AGV到达 " + FullShelfPlace + ",15秒后重新向产线发送入料架请求[ReadyEnter]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
agv.HasError = true;
agv.SetErrorMsg("AGV到达 " + FullShelfPlace + ",向产线发送入料架请求[ReadyEnter]异常", timeOutValue.TotalMinutes.ToString("f2"));
} }
} }
else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE)) else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE))
{ {
CurTaskState = MissionSys.GetTakJobState(agv); CurTaskState = MissionSys.GetTakJobState(agv);
if (MissionSys.CheckTaskFinished(agv,SettingString.Leave, CurTaskState)) if (MissionSys.CheckTaskFinished(agv,SettingString.Leave, CurTaskState))
{ {
agv.HasError = false;
runInfo = "满料进入" + FullShelfPlace + "完成[" + agv.BoxDestInfo + "]"; runInfo = "满料进入" + FullShelfPlace + "完成[" + agv.BoxDestInfo + "]";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); msg += string.Format("[{0}] {1}", curJobStep.CurStep(),runInfo);
jobStep.Msg = msg; curJobStep.Msg = msg;
agv.RFID = ""; agv.RFID = "";
agv.BoxDestInfo = ""; agv.BoxDestInfo = "";
HttpManager.UpdateStatus(RFID, FullShelfPlace); HttpManager.UpdateStatus(RFID, FullShelfPlace);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new EmptyAGVBackJob(FullShelfPlace); return new EmptyAGVBackJob(FullShelfPlace);
} }
else if (jobStep.IsTimeOut(60000, out double timeOutValue)) else if (curJobStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{ {
//链条停止 //链条停止
runInfo = "满料在[" + FullShelfPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况"; runInfo = "满料在[" + FullShelfPlace + "]离开小车超时,请检查料架离开小车的情况";
//msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo); //msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
//SendFullShelfStep.Msg = msg; //SendFullShelfStep.Msg = msg;
agv.HasError = true;
agv.SetErrorMsg("满料架在[" + FullShelfPlace + "]离开小车超时", timeOutValue.TotalMinutes.ToString("f2"));
} }
} }
...@@ -270,7 +282,7 @@ namespace DeviceLibrary ...@@ -270,7 +282,7 @@ namespace DeviceLibrary
//{ //{
//} //}
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this; return this;
} }
......
...@@ -14,6 +14,7 @@ namespace DeviceLibrary ...@@ -14,6 +14,7 @@ namespace DeviceLibrary
public StandyJob(string agvPlae) public StandyJob(string agvPlae)
{ {
this.agvPlace = agvPlae; this.agvPlace = agvPlae;
JobName = "待机任务";
} }
...@@ -107,9 +108,11 @@ namespace DeviceLibrary ...@@ -107,9 +108,11 @@ namespace DeviceLibrary
runInfo = "在待机位检测到任务,执行任务"; runInfo = "在待机位检测到任务,执行任务";
msg += runInfo; msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job; return job;
} }
} }
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this; return this;
} }
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Net.Sockets; using System.Net.Sockets;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
...@@ -31,7 +32,33 @@ namespace DeviceLibrary ...@@ -31,7 +32,33 @@ namespace DeviceLibrary
//public static StandbyManager Standby; //public static StandbyManager Standby;
public static List<JobType> jobTypes; public static List<JobType> jobTypes;
public static readonly string CONFIG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Config\\"; public static readonly string CONFIG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Config\\";
#region 任务日志
static log4net.ILog runLog = log4net.LogManager.GetLogger("RunLog");
static Dictionary<string, RunInfo> runInfoMap = new Dictionary<string, RunInfo>();
public static void RunLogInfo(RunInfo info)
{
if (runInfoMap == null)
return;
if (runInfoMap.Keys.Contains(info.AGVNum))
{
if (!runInfoMap[info.AGVNum].Equals(info))
{
runLog.Info(info.ToString());
}
}
else
{
runInfoMap.Add(info.AGVNum, info);
runLog.Info(info.ToString());
}
}
public static void ErrorLogRecord(ErrorInfo errorInfo)
{
runLog.Info(errorInfo.ToString());
}
#endregion
/// <summary> /// <summary>
/// 初始化配置 /// 初始化配置
/// </summary> /// </summary>
...@@ -833,6 +860,132 @@ namespace DeviceLibrary ...@@ -833,6 +860,132 @@ namespace DeviceLibrary
} }
} }
public class RunInfo
{
/// <summary>
/// AGV编号
/// </summary>
public string AGVNum { get; set; } = "";
/// <summary>
/// 任务名称
/// </summary>
public string TaskName { get; set; } = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; set; } = "";
/// <summary>
/// 任务步骤
/// </summary>
public string TaskStep { get; set; } = "";
/// <summary>
/// 任务内容
/// </summary>
public string MissionInfo { get; set; } = "";
/// <summary>
/// 开始时间
/// </summary>
public string DateTime { get; set; } = "";
/// <summary>
/// 结束时间
/// </summary>
public string EndDateTime { get; set; } = "";
/// <summary>
/// 任务运行时长
/// </summary>
public string TaskRunTime { get; set; } = "";
/// <summary>
/// 类型
/// </summary>
public string Type { get; set; } = "Task";
public RunInfo(string AGVNum, string taskName, string targetPlace, string taskStep, string missionInfo, DateTime startTime)
{
//开始时间 2006-01-02 15:04:05
DateTime = startTime.ToString("yyyy-MM-dd HH:mm:ss");
EndDateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
this.AGVNum = AGVNum;
MissionInfo = missionInfo;
TaskName = taskName;
TaskRunTime = (System.DateTime.Now - startTime).TotalMinutes.ToString("f2");
TargetPlace = targetPlace;
TaskStep = taskStep;
}
public RunInfo() { }
public override bool Equals(object obj)
{
if (obj is RunInfo)
{
RunInfo info = (RunInfo)obj;
if (this.MissionInfo.Equals(info.MissionInfo))
return true;
this.MissionInfo = info.MissionInfo;
}
return false;
}
public override string ToString()
{
return JsonHelper.SerializeObject(this);
}
}
public class ErrorInfo
{
/// <summary>
/// AGV编号
/// </summary>
public string AGVNum { get; set; } = "";
/// <summary>
/// 开始时间
/// </summary>
public string DateTime { get; set; } = "";
/// <summary>
/// 结束时间
/// </summary>
public string EndDateTime { get; set; } = "";
/// <summary>
/// 异常信息
/// </summary>
public string ErrorMsg { get; set; } = "";
public string ErrorLastTime { get; set; } = "";
/// <summary>
/// 任务名称
/// </summary>
public string TaskName { get; set; } = "";
/// <summary>
/// AGV的当前任务
/// </summary>
public string AGVMissionName { get; set; } = "";
public string MissionInfo { get; set; } = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; set; } = "";
/// <summary>
/// 类型
/// </summary>
public string Type { get; set; } = "Error";
public ErrorInfo(Agv_Info agv)
{
DateTime = agv.errStartTime.ToString("yyyy-MM-dd HH:mm:ss");
AGVNum = agv.Name;
EndDateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
ErrorMsg = agv.ErrorMsg;
ErrorLastTime = (System.DateTime.Now - agv.errStartTime).TotalMinutes.ToString("f2");
if(agv.CurJob!=null)
{
TaskName = agv.CurJob.JobName;
MissionInfo = agv.CurJob.runInfo;
}
AGVMissionName = agv.CurTarName;
TargetPlace = agv.Place;
}
public override string ToString()
{
return JsonHelper.SerializeObject(this);
}
}
public static class Window_API public static class Window_API
{ {
[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)] [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!