Commit ec01efbe 张东亮

添加拒绝包装料架解绑

1 个父辈 85bff5cf
......@@ -10,44 +10,6 @@ using RestSharp;
namespace AGVControl
{
public class RunInfo
{
/// <summary>
/// AGV编号
/// </summary>
public string AGVNum { get; set; } = "";
/// <summary>
/// 时间
/// </summary>
public string DateTime { get; set; } = "";
/// <summary>
/// 任务信息
/// </summary>
public string MissionInfo { get; set; } = "";
public RunInfo(string AGVNum, string missionInfo)
{
//2006-01-02 15:04:05
DateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
this.AGVNum = AGVNum;
MissionInfo = missionInfo;
}
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 AGVManager
{
private static string Addr_CurSO = "/rest/api/qisda/device/currentOutLine";
......
......@@ -98,7 +98,6 @@ namespace AGVControl
public static ChargeStatus chargeStatus;
public static string itsHttp;
public static log4net.ILog log;
public static log4net.ILog runLog;
public static Dictionary<string, string> agvMission;
public static Dictionary<string, string> showNameMissionName;
//public static Dictionary<string, string> agvProductionLine;
......@@ -110,7 +109,10 @@ namespace AGVControl
private static string preLog = "";
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)
......@@ -128,6 +130,12 @@ namespace AGVControl
runLog.Info(info.ToString());
}
}
public static void ErrorLogRecord(ErrorInfo errorInfo)
{
runLog.Info(errorInfo.ToString());
}
#endregion
public static string ReadIni(string section, string key)
{
return IniHelper.ReadValue(section, key, CONFIG_PATH + SettingString.FileName_tempData);
......@@ -1263,7 +1271,139 @@ namespace AGVControl
}
}
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 { return agvname; }
set {
agvname = value.PadLeft(4, '0');
}
}
private string agvname = "";
/// <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.CurTaskName;
TargetPlace = agv.Place;
}
public override string ToString()
{
return JsonHelper.SerializeObject(this);
}
}
public static class API
{
[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
......
......@@ -19,7 +19,7 @@ namespace AGVControl.BLL
private System.Timers.Timer AgvCallTimer;
private System.Timers.Timer AgvStateTimer;
private System.Timers.Timer NodeStateTimer;
private System.Timers.Timer StateUpdateTimer;
//private System.Timers.Timer StateUpdateTimer;
//public List<string> Marks;
private const int REG_STATUS = 20;
//private List<string> shelfLockedNodeNames;
......@@ -51,13 +51,13 @@ namespace AGVControl.BLL
Enabled = false
};
NodeStateTimer.Elapsed += NodeStateTimer_Elapsed;
StateUpdateTimer = new System.Timers.Timer
{
Interval = 3000,
AutoReset = true,
Enabled = false
};
StateUpdateTimer.Elapsed += StateUpdateTimer_Elapsed;
//StateUpdateTimer = new System.Timers.Timer
//{
// Interval = 3000,
// AutoReset = true,
// Enabled = false
//};
//StateUpdateTimer.Elapsed += StateUpdateTimer_Elapsed;
}
public void Start()
......@@ -65,11 +65,11 @@ namespace AGVControl.BLL
AgvCallTimer.Enabled = true;
AgvStateTimer.Enabled = true;
NodeStateTimer.Enabled = true;
StateUpdateTimer.Enabled = true;
//StateUpdateTimer.Enabled = true;
AgvCallTimer.Start();
AgvStateTimer.Start();
NodeStateTimer.Start();
StateUpdateTimer.Start();
//StateUpdateTimer.Start();
}
public void Stop()
......@@ -77,11 +77,11 @@ namespace AGVControl.BLL
AgvCallTimer.Enabled = false;
AgvStateTimer.Enabled = false;
NodeStateTimer.Enabled = false;
StateUpdateTimer.Enabled = false;
//StateUpdateTimer.Enabled = false;
AgvCallTimer.Stop();
AgvStateTimer.Stop();
NodeStateTimer.Stop();
StateUpdateTimer.Stop();
// StateUpdateTimer.Stop();
}
private bool NodeStateInProcess = false;
private void NodeStateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
......@@ -178,62 +178,6 @@ namespace AGVControl.BLL
private bool AgvStateUpdateProcess = false;
private void StateUpdateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (AgvStateUpdateProcess) return;
AgvStateUpdateProcess = true;
List<AlarmMsg> msglist = new List<AlarmMsg>();
for (int i = 0; i < Common.agvInfo.Count; i++)
{
//上报异常
bool isAlarm = false;
try
{
if (!Common.agvInfo[i].IsCon && !Common.agvInfo[i].IsUse)
{
isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Msg", "停用"));
}
if (!isAlarm && !Common.agvInfo[i].IsCon)
{
isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Msg", "离线"));
}
if (!isAlarm && (Common.agvInfo[i].StateID.Equals(eAGVState.Error) || Common.agvInfo[i].StateID.Equals(eAGVState.EmergencyStop) || Common.agvInfo[i].StateID.Equals(eAGVState.Pause)))
{
isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Msg", Common.agvInfo[i].StateID.ToString()));
}
if (!isAlarm && Common.agvInfo[i].StandTimeOut)
{
isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Msg", "在" + Common.agvInfo[i].PlaceAliceName + "停留超时" + (DateTime.Now - Common.agvInfo[i].StandStartTime).TotalMinutes.ToString("f2") + "分钟"));
}
if (!isAlarm)
{
if (!Common.agvInfo[i].Msg.Equals(""))
{
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Msg", Common.agvInfo[i].Msg, 1));
Common.RunLogInfo(new AGVControl.RunInfo(Common.agvInfo[i].Name, Common.agvInfo[i].Msg));
}
else
{
if ((Common.agvInfo[i].Place.Contains(SettingString.AutoCharge) || Common.agvInfo[i].Place.Contains(SettingString.Standby)))
{
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Place", Common.agvInfo[i].Place,1));
}
}
}
AGVManager.updateDeviceAlarmMsg(msglist);
}
catch (Exception ex)
{
Common.log.Error(Common.agvInfo[i].Name + "上报小车状态失败" + ex.Message + ex.StackTrace);
}
}
AgvStateUpdateProcess = false;
}
/// <summary>
/// 从节点获取任务
......
......@@ -75,6 +75,11 @@ namespace BLL
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "rfid=null" };
Log.Error(string.Format("Unlock Request(POST) Failed [emptyStation={0},rfid=null]", emptyStation));
}
else if (rfid.StartsWith("A"))
{
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = $"rfid={rfid} can not be unlock" };
Log.Error(string.Format("Unlock Request(POST) Failed [emptyStation={0},rfid=null]", emptyStation));
}
else
{
res = new Result() { Succeed = true, ResultData = rfid, ErrorMessage = "" };
......@@ -110,10 +115,14 @@ namespace BLL
}
if (Common.GetNodeNameByLineName(line, out string value))
{
if (!Common.missionManager.AddMission(value,RFID.ToUpper()))
if (RFID.StartsWith("A"))
{
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = $"rfid={RFID} can not be unlock" };
Log.Error(string.Format("Unlock Request(POST) Failed [emptyStation={0},rfid={1}]", line,RFID));
}
else if (!Common.missionManager.AddMission(value, RFID.ToUpper()))
{
res = new Result() { Succeed = false, ResultData = "true", ErrorMessage = "CreateEmptyRecycleTask failed due it has been created or rfid=null: " + line +"rfid="+ RFID.ToUpper() };
res = new Result() { Succeed = false, ResultData = "true", ErrorMessage = "CreateEmptyRecycleTask failed due it has been created or rfid=null: " + line + "rfid=" + RFID.ToUpper() };
}
else
{
......
......@@ -451,7 +451,7 @@ namespace AGVControl
}
if (MessageBox.Show("确定删除产线任务[" + cmbBoxLineName.SelectedItem.ToString() + "]", "手动删除解绑任务", MessageBoxButtons.YesNo) == DialogResult.No)
return;
if (txtRfid.Text.ToUpper().StartsWith("D") || txtRfid.Text.ToUpper().StartsWith("C"))
// if (txtRfid.Text.ToUpper().StartsWith("D") || txtRfid.Text.ToUpper().StartsWith("C"))
{
int idx = Common.nodeInfo.FindIndex(s => s.AliceName.Equals(cmbBoxLineName.SelectedItem.ToString()));
if (idx > -1)
......
......@@ -43,7 +43,6 @@ namespace AGVControl
//Common.logTextBox = new TextBox();
//Common.missionView = new DataGridView();
Common.log = log4net.LogManager.GetLogger("AgvServer");
Common.runLog = log4net.LogManager.GetLogger("RunLog");
Common.log.Info("=====程序开始=====");
ReadConfig();
Common.ReadUnlockLineInfo();
......
......@@ -131,6 +131,29 @@ namespace AGVControl
/// </summary>
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 void SetErrorMsg(string msg, string lastTime)
{
if (ErrorMsg.Equals(""))
{
ErrorMsg = msg;
ErrorLastTime = lastTime;
errStartTime = DateTime.Now;
}
}
public void ClearErrorMsg()
{
ErrorLastTime = "";
ErrorMsg = "";
}
public string RunInfo()
{
string curJobTaskName = "";
......@@ -263,6 +286,7 @@ namespace AGVControl
int IoLastTime = 5000;
int StandLastTimeMinute = 5;
public DateTime StandStartTime = DateTime.MaxValue;
public DateTime errStartTime = DateTime.Now;
public bool SetState(eAGVState stateID, string stateText, int battery, string missionText, clsPosition position)
{
bool isChange = false;
......@@ -305,18 +329,48 @@ namespace AGVControl
CurTaskState = stateText;
Battery = battery;
MissionText = missionText;
CheckErrorState();
CheckOfflineTimeOut();
CheckStandTimeOut(position);
UpdateDisplayBoard();
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>
/// <returns></returns>
private void CheckStandTimeOut(clsPosition position)
{
if (IsUse && CurJob !=null && !(CurJob is ChargeJob) &&
( !CurTaskName.Contains(SettingString.Standby)))//!CurTaskName.Contains(SettingString.AutoCharge) ||
if (IsUse && CurJob != null && !(CurJob is ChargeJob) &&
(!CurTaskName.Contains(SettingString.Standby)))//!CurTaskName.Contains(SettingString.AutoCharge) ||
{
if (Math.Abs(position.x - Position.x) < 1 && Math.Abs(position.y - Position.y) < 1)
{
......@@ -336,7 +390,7 @@ namespace AGVControl
}
}
else if(CurJob != null && (CurJob is ChargeJob))
else if (CurJob != null && (CurJob is ChargeJob))
{
StandTimeOut = false;
StandStartTime = DateTime.Now;
......@@ -348,6 +402,98 @@ namespace AGVControl
}
Position = position;
}
/// <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;
}
}
private void UpdateDisplayBoard()
{
bool isAlarm = false;
List<AlarmMsg> msglist = new List<AlarmMsg>();
try
{
if (!IsCon && !IsUse)
{
isAlarm = true;
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", "停用"));
}
if (!isAlarm && offlineTimeOut)
{
isAlarm = true;
SetErrorMsg("离线", (DateTime.Now - offlineStartTime).TotalMinutes.ToString("f2"));
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", "离线"));
}
if (!isAlarm && errorState)
{
isAlarm = true;
SetErrorMsg("状态:"+StateID.ToString(), (DateTime.Now - errStartTime).TotalMinutes.ToString("f2"));
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", StateID.ToString()));
}
if (!isAlarm && StandTimeOut)
{
isAlarm = true;
SetErrorMsg("在" + PlaceAliceName + "停留超时", (DateTime.Now - StandStartTime).TotalMinutes.ToString("f2"));
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", "在" + PlaceAliceName + "停留超时" + (DateTime.Now - StandStartTime).TotalMinutes.ToString("f2") + "分钟"));
}
if (!isAlarm && HasError)
{
isAlarm = true;
msglist.Add(new AlarmMsg(Name, "lineAgv." + Name + ".Msg", Msg));
}
if (!isAlarm)
{
if (!ErrorMsg.Equals(""))//异常消除后正常,打印异常
{
Common.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));
}
}
}
AGVManager.updateDeviceAlarmMsg(msglist);
}
catch (Exception ex)
{
Common.log.Error(Name + "上报小车信息失败" + ex.Message + ex.StackTrace);
}
}
public string[] ToRow()
{
......
......@@ -15,6 +15,7 @@ namespace AGVControl
/// 运行信息
/// </summary>
public abstract string RunInfo { get; }
public string runInfo = "";
/// <summary>
/// 根据任务状态继续执行任务
/// </summary>
......@@ -30,7 +31,18 @@ namespace AGVControl
/// 当前任务的执行状态
/// </summary>
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)
{
Common.RunLogInfo(new RunInfo(agv.Name.PadLeft(4, '0'), JobName, targetPlace, JobStep, runInfo, StartJobTime));
}
/// <summary>
/// 更新任务信息
/// </summary>
......
......@@ -22,7 +22,7 @@ namespace AGVControl
//不为空,且与上一个消息不一样才打印
if (!value.Equals(msg))
{
Common.LogInfo(value);
// Common.LogInfo(value);
}
}
msg = value;
......@@ -53,13 +53,12 @@ namespace AGVControl
/// </summary>
/// <param name="timeOutMilliseconds"></param>
/// <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;
timeOutValue = span;
if (span.TotalMilliseconds > timeOutMilliseconds)
{
timeOutValue = span.TotalSeconds;
return true;
}
return false;
......
......@@ -22,6 +22,7 @@ namespace AGVControl
public ChargeJob(string agvPlae)
{
this.agvPlace = agvPlae;
JobName = "充电任务";
}
......@@ -30,7 +31,6 @@ namespace AGVControl
/// </summary>
private string agvPlace = "";
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
......@@ -39,7 +39,7 @@ namespace AGVControl
get { return runInfo; }
}
private JobStep<CHARGE_STEP> ChargeStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE);
private JobStep<CHARGE_STEP> curJobStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE);
/// <summary>
/// 空车返回执行
......@@ -49,46 +49,46 @@ namespace AGVControl
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
agv.Msg = "";
//runInfo = "充电任务:";
CurTaskState = Common.GetTakJobState(CurTaskID);
if (ChargeStep.IsStep(CHARGE_STEP.NONE))
if (curJobStep.IsStep(CHARGE_STEP.NONE))
{
if (agv.Battery > Common.chargeStatus.chargeMax)
{
if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(""))//在待机位不操作
{
ChargeStep.ToNextStep(CHARGE_STEP.END);
curJobStep.ToNextStep(CHARGE_STEP.END);
runInfo = "在待机位,电量充足[" + agv.Battery + "%],等待任务";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlace))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位,先过4C风淋门";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位,先到4D门";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
//Common.StatusCharge(agv);
Common.MoveToNode(agv, SettingString.Standby);
......@@ -99,20 +99,20 @@ namespace AGVControl
{
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlace))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先过4C风淋门";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先到4D门";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
......@@ -122,47 +122,47 @@ namespace AGVControl
if (!Common.StatusCharge(agv))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],充电桩有小车,从当前位置" + agvPlace + "回到待机位";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR))
else if (curJobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位,先到4D门";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR))
else if (curJobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR))
{
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
{
if (agv.Battery > Common.chargeStatus.chargeMax)
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -170,46 +170,46 @@ namespace AGVControl
{
if (!Common.StatusCharge(agv))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],充电桩有小车,从当前位置" + agvPlace + "回到待机位";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION))
else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION))
{
if (Common.CheckTaskFinished(agv, CurTaskName))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
runInfo = "充电任务分配完成,去充电并等待任务";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK))
else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK))
{
if (CheckRandomCharge(agv))
{
if (agv.Battery >= Common.chargeStatus.chargeMax)
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
runInfo = "电量充足,回待机位";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.chargeStatus.ClearRandomChargeInfo(agv);
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
......@@ -222,7 +222,8 @@ namespace AGVControl
Common.chargeStatus.ClearRandomChargeInfo(agv);
runInfo = "充电过程检测到任务,电量[" + agv.Battery + "%]大于最小电量[" + Common.chargeStatus.chargeMin + "%],中断充电执行任务";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job;
}
......@@ -232,10 +233,10 @@ namespace AGVControl
{
if (agv.Battery >= Common.chargeStatus.chargeMax)
{
ChargeStep.ToNextStep(CHARGE_STEP.END);
curJobStep.ToNextStep(CHARGE_STEP.END);
runInfo = "充电完成";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
}
else if (agv.Battery >= Common.chargeStatus.chargeMin)
{
......@@ -244,8 +245,9 @@ namespace AGVControl
{
runInfo = "充电过程中检测到任务,电量[" + agv.Battery + "%]大于最小电量[" + Common.chargeStatus.chargeMin + "%],中断充电执行任务";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.chargeStatus.ClearRandomChargeInfo(agv);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job;
}
}
......@@ -253,17 +255,17 @@ namespace AGVControl
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_STANDBY))
else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_STANDBY))
{
if (Common.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
{
ChargeStep.ToNextStep(CHARGE_STEP.END);
curJobStep.ToNextStep(CHARGE_STEP.END);
runInfo = "充电完成,到达待机位";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.END))
else if (curJobStep.IsStep(CHARGE_STEP.END))
{
runInfo = "等待任务";
Job job = Common.control.GetJob(agv);
......@@ -271,19 +273,21 @@ namespace AGVControl
{
runInfo = "在待机位检测到任务,执行任务";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.chargeStatus.ClearRandomChargeInfo(agv);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job;
}
else if (job == null && agv.Battery < Common.chargeStatus.chargeMax / 2)
{
ChargeStep.ToNextStep(CHARGE_STEP.NONE);
curJobStep.ToNextStep(CHARGE_STEP.NONE);
runInfo = "在待机位暂无任务,且当前电量小于" + Common.chargeStatus.chargeMax / 2 + "%,去充电位";
msg += runInfo;
ChargeStep.Msg = msg;
curJobStep.Msg = msg;
Common.chargeStatus.ClearRandomChargeInfo(agv);
}
}
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this;
}
......
......@@ -23,6 +23,7 @@ namespace AGVControl
public EmptyAGVBackJob(string agvPlae)
{
this.agvPlace = agvPlae;
JobName = "返回任务";
}
......@@ -31,7 +32,6 @@ namespace AGVControl
/// </summary>
private string agvPlace { get; set; }
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
......@@ -41,7 +41,7 @@ namespace AGVControl
}
private JobStep<EMPTY_AGV_BACK_STEP> EmptyAGVBackStep = 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>
/// 空车返回执行
......@@ -51,10 +51,10 @@ namespace AGVControl
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = "返回任务:" + runInfo;
agv.Msg =runInfo;
// runInfo = "返回任务:";
CurTaskState = Common.GetTakJobState(CurTaskID);
if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.NONE))
if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.NONE))
{
if (Common.FindEmptyShelfNode(agv, out string nodeName, true))
{
......@@ -66,35 +66,36 @@ namespace AGVControl
{
runInfo = "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new GoEmptyShelfLineJob(agvPlace, nodeName, rfid);
}
else
{
if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -104,28 +105,28 @@ namespace AGVControl
{
if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -136,34 +137,34 @@ namespace AGVControl
{
if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY))
else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
......@@ -173,14 +174,16 @@ namespace AGVControl
{
runInfo = "到达待机位,电量[" + agv.Battery + "]小于最大电量[" + Common.chargeStatus.chargeMax + "],暂无任务,去充电";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new ChargeJob("");
}
else
{
runInfo = "到达待机位,检测到新任务,执行任务";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job;
}
......@@ -197,7 +200,8 @@ namespace AGVControl
{
runInfo = "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new GoEmptyShelfLineJob(agvPlace, nodeName, rfid);
}
}
......@@ -207,26 +211,27 @@ namespace AGVControl
{
runInfo = "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new GoFullShelfStationJob(SettingString.Standby);
}
}
}
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR))
else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
......@@ -241,7 +246,8 @@ namespace AGVControl
{
runInfo = "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new GoEmptyShelfLineJob(agvPlace, nodeName, rfid);
}
}
......@@ -251,18 +257,21 @@ namespace AGVControl
{
runInfo = "从产线" + agvPlace + "到达4D门,检测到A6出满料,去A6";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new GoFullShelfStationJob(SettingString.DoorCToD);
}
runInfo = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new ChargeJob(SettingString.DoorCToD);
}
}
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this;
}
/// <summary>
......
......@@ -29,6 +29,7 @@ namespace AGVControl
{
EmptyShelfPlace = lineName;
this.shelfType = shelfType;
JobName = "空料架返回";
}
/// <summary>
......@@ -42,7 +43,6 @@ namespace AGVControl
private int tryTimes = 0;
private eShelfType shelfType;
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
......@@ -52,7 +52,7 @@ namespace AGVControl
}
private JobStep<EMPTY_SHELF_BACK_STEP> EmptyBackStep = 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>
/// 空架任务执行
......@@ -62,25 +62,25 @@ namespace AGVControl
{
string msg = agv.Name+ " ";
bool rtn = false;
agv.Msg = "空料架返回:"+runInfo;
agv.Msg = runInfo;
//runInfo = "空料架返回:";
if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE))
if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE))
{
if (Common.CheckIsInAirDoor(EmptyShelfPlace))//4C车间
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线[" + EmptyShelfPlace + "]前往4C风淋门";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "从产线[" + EmptyShelfPlace + "]前往4D门";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -89,10 +89,10 @@ namespace AGVControl
if (Common.CheckA5A6State(agv, shelfType, out string nodeName))
{
EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo = "从产线 [" + EmptyShelfPlace + "]送往双层线" + EmptyShelfTargetPlace;
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
if (!EmptyShelfTargetPlace.Equals(""))
{
Common.MoveToNode(agv, EmptyShelfTargetPlace);
......@@ -102,29 +102,29 @@ namespace AGVControl
}
else
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo = "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "出风淋门,前往4D门";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR))
else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
......@@ -132,51 +132,51 @@ namespace AGVControl
if (Common.CheckA5A6State(agv, shelfType, out string nodeName))
{
EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo = "进4D门,送往双层线" + EmptyShelfTargetPlace;
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo = "进4D门,双层线暂不需要空料架,到待机位";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY))
else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckA5A6State(agv, shelfType, out string nodeName))
{
EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo = "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace;
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6))
else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState) && EmptyShelfTargetPlace.StartsWith("A"))
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE);
runInfo = "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.server.ReadyEnter(EmptyShelfTargetPlace);
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE))
else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE))
{
int id = Common.FindNode(EmptyShelfTargetPlace);
ClientNode node = Common.nodeInfo[id];
......@@ -184,30 +184,30 @@ namespace AGVControl
{
if (!agv.CurTaskName.Equals("Leave"))
{
EmptyBackStep.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 + "入料架,小车链条运行";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Leave"]);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyBackStep.IsTimeOut(15000, out double timeOutValue))
else if (curJobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{
tryTimes++;
if (tryTimes < 3)
return this;
tryTimes = 0;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
curJobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo = "双层线" + EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyBackStep.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 = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
......@@ -218,30 +218,32 @@ namespace AGVControl
{
runInfo = "在双层线检测到任务,执行任务";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job;
}
else
{
runInfo = "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位";
msg += runInfo;
EmptyBackStep.Msg = msg;
curJobStep.Msg = msg;
agv.RFID = "";
agv.BoxDestInfo = "";
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new ChargeJob(SettingString.DoubleLine_Name_Prefix);
}
}
else if (EmptyBackStep.IsTimeOut(60000, out double timeOutValue))
else if (curJobStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{
runInfo = "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.END))
else if (curJobStep.IsStep(EMPTY_SHELF_BACK_STEP.END))
{
}
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this;
}
......
......@@ -53,7 +53,6 @@ namespace AGVControl
public eEnterLeaveType ActionType { get; set; }
private eShelfType shelfType;
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
......@@ -114,7 +113,7 @@ namespace AGVControl
rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Leave"]);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (EnterLeaveShelfStep.IsTimeOut(15000, out double timeOutValue))
else if (EnterLeaveShelfStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{
EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.NONE);
runInfo = "AGV到达 " + LineName + ",15秒后重新向产线发送入料架请求[ReadyEnter]";
......@@ -135,7 +134,7 @@ namespace AGVControl
rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Enter"]);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (EnterLeaveShelfStep.IsTimeOut(15000, out double timeOutValue))
else if (EnterLeaveShelfStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{
EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.NONE);
runInfo= "AGV到达 " + LineName + ",15秒后重新向产线发送入料架请求[ReadyLeave]";
......@@ -157,7 +156,7 @@ namespace AGVControl
return new EmptyAGVBackJob(LineName);
}
else if (EnterLeaveShelfStep.IsTimeOut(60000, out double timeOutValue))
else if (EnterLeaveShelfStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{
//链条停止
runInfo= "料架在[" + LineName + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
......@@ -179,7 +178,7 @@ namespace AGVControl
Common.missionManager.DelMission(LineName,RFID);
return new EmptyShelfBackJob(LineName,eShelfType.BigShelf);
}
else if (EnterLeaveShelfStep.IsTimeOut(60000, out double timeOutValue))
else if (EnterLeaveShelfStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{
//链条停止
runInfo= "料架在[" + LineName + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
......
......@@ -24,6 +24,7 @@ namespace AGVControl
EmptyShelfPlace = palce;
this.agvPlae = agvPlae;
RFID = rfid;
JobName = "回收空料架任务";
}
public string RFID { get; set; }
/// <summary>
......@@ -36,8 +37,6 @@ namespace AGVControl
/// </summary>
private string agvPlae { get; set; }
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
......@@ -47,7 +46,7 @@ namespace AGVControl
}
private JobStep<TAKE_EMPTY_STEP> TakeEmptyStep = 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>
/// 空架任务执行,去目的地
......@@ -57,17 +56,17 @@ namespace AGVControl
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = "回收空料架任务:"+runInfo;
agv.Msg = runInfo;
//runInfo = "回收空料架任务:";
int nodeIdx = Common.FindNode(EmptyShelfPlace);
if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.NONE))
if (curJobStep.IsStep(TAKE_EMPTY_STEP.NONE))
{
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix)&& Common.CheckIsInAirDoor(agvPlae) && !Common.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门内->风淋门外
{
TakeEmptyStep.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 + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -77,19 +76,19 @@ namespace AGVControl
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.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 + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -98,10 +97,10 @@ namespace AGVControl
agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{
TakeEmptyStep.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 + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -112,19 +111,19 @@ namespace AGVControl
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.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 + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if(agvPlae.Equals("")|| (!Common.CheckIsInAirDoor(agvPlae)) && !Common.CheckIsInAirDoor(EmptyShelfPlace))//都在风淋门外
......@@ -133,27 +132,27 @@ namespace AGVControl
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -161,27 +160,27 @@ namespace AGVControl
agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{
TakeEmptyStep.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 + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else//4D->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
}
}
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
......@@ -191,65 +190,65 @@ namespace AGVControl
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "到风淋门外,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "到风淋门外,去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
//都在风淋门内,到达风淋门外
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{
//4C风淋门外->风淋门内
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "到达风淋门内,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorDToC, CurTaskState))
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -257,80 +256,80 @@ namespace AGVControl
{
if(Common.CheckIsInAirDoor(EmptyShelfPlace))
{
TakeEmptyStep.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 + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
}
}
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.C4_STANDBY1, CurTaskState) || Common.CheckTaskFinished(agv, SettingString.C4_STANDBY2, CurTaskState))
{
if (!Common.Check4CTarget(agv, EmptyShelfPlace))//未占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.DeleteStandyInfo(agv);
}
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK))
{
if (nodeIdx > -1)
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK);
runInfo = "AGV 添加任务:移动到" + EmptyShelfPlace + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = EmptyShelfPlace + " 不存在或未开启调用";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if (TakeEmptyStep.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))
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
runInfo = "AGV开始向目的地[" + EmptyShelfPlace + "]移动" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, EmptyShelfPlace, CurTaskState))
......@@ -344,15 +343,15 @@ namespace AGVControl
//}
//else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE);
runInfo = "AGV到达 " + EmptyShelfPlace + " 向产线发送出料架请求[ReadyLeave]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
if (nodeIdx == -1)
{
runInfo = EmptyShelfPlace + " 未开启调用";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
return this;
}
ClientNode node = Common.nodeInfo[nodeIdx];
......@@ -362,41 +361,45 @@ namespace AGVControl
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE))
{
if (nodeIdx == -1)
{
runInfo = EmptyShelfPlace + " 未开启调用";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
return this;
}
ClientNode node = Common.nodeInfo[nodeIdx];
agv.RFID = node.RFID;
if (node.StateEquals(eNodeStatus.MayLeave))
{
agv.HasError = false;
if (!agv.CurTaskName.Equals("Enter"))
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF);
runInfo = "收到产线出料请求[ReadyLeave]的响应 " + EmptyShelfPlace + "出料架,小车链条运行" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
//agv.RFID = node.RFID;
rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Enter"]);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (TakeEmptyStep.IsTimeOut(15000, out double timeOutValue))
else if (curJobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
curJobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
agv.HasError = true;
agv.SetErrorMsg("AGV到达 " + EmptyShelfPlace + " 向产线发送出料架请求[ReadyLeave]异常",timeOutValue.TotalMinutes.ToString("f2"));
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv, "Enter", CurTaskState))
{
agv.HasError = false;
ClientNode node = Common.nodeInfo[nodeIdx];
//回收空料架数量减少1
Common.missionManager.DelMission(EmptyShelfPlace, RFID);
......@@ -404,7 +407,8 @@ namespace AGVControl
AGVManager.ClearRFID(EmptyShelfPlace, RFID);
runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车完成" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
//4DfeederOut默认大料架
//if (agv.Place.Equals(SettingString.D4FeederOut))
//return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf);
......@@ -417,20 +421,22 @@ namespace AGVControl
else
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.SmallShelf);
}
else if (TakeEmptyStep.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 += runInfo;
//TakeEmptyStep.Msg = msg;
agv.HasError = true;
agv.SetErrorMsg("空料架在[" + EmptyShelfPlace + "]进入小车超时",timeOutValue.TotalMinutes.ToString("f2"));
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.END))
else if (curJobStep.IsStep(TAKE_EMPTY_STEP.END))
{
}
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this;
}
......
......@@ -23,6 +23,7 @@ namespace AGVControl
{
FullShelfStationPlace = palce;
agvPlace = agvCurPlace;
JobName = "去云仓接满料任务";
}
/// <summary>
......@@ -34,7 +35,6 @@ namespace AGVControl
/// 接到任务时,AGV的位置
/// </summary>
public string agvPlace { get; set; }
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
......@@ -50,26 +50,26 @@ namespace AGVControl
public AGVManager.BoxDestInfo FullShelfDestInfo = null;
private JobStep<GO_FULL_SHELF_STATION_STEP> GoFullShelfStationStep = 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)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = "去云仓接满料任务:"+runInfo;
agv.Msg = runInfo;
//runInfo = "去云仓接满料任务:";
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE))
if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT);
runInfo = "检查AGV负载情况";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.CheckLoad(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT))
else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT))
{
//Common.log.Debug("WAIT_CHECK_RESULT " + Common.agvMission["CheckShelf"].Equals(agv.CurTaskGUID).ToString() + " " + agv.CurTaskGUID + " " + Common.agvMission["CheckShelf"]);
CurTaskState = Common.GetTakJobState(CurTaskID);
......@@ -81,10 +81,10 @@ namespace AGVControl
Common.log.Debug("WAIT_CHECK_RESULT: " + agv.Name + " 获取IO状态成功:满载信号=" + input[3].ToString());
if (input != null && input[3])
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
runInfo = "车上有料架,无法去入料口出料";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
agv.IsExistShelf = true;
IsLoadOnAGV = true;
}
......@@ -92,37 +92,37 @@ namespace AGVControl
{
if (agvPlace.Equals("") || agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace;
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (Common.CheckIsInAirDoor(agvPlace))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "在4C风淋门内,先过风淋门";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "在4C车间,向4D门运行,再到双层线入料口";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace;
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -135,28 +135,28 @@ namespace AGVControl
{
if (agvPlace.Equals(""))//待机位接到任务
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace;
msg = runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if(Common.CheckIsInAirDoor(agvPlace))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "在4C风淋门内,先过风淋门";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "在4C车间,向4D门运行,再到双层线入料口";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -166,35 +166,35 @@ namespace AGVControl
}
}
else if (GoFullShelfStationStep.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 = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "过风淋门,向4D门运行,再到双层线入料口" + FullShelfStationPlace;
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR))
else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = "到达4D门,准备运动到双层线入料口" + FullShelfStationPlace;
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6))
else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, FullShelfStationPlace, CurTaskState))
......@@ -205,7 +205,7 @@ namespace AGVControl
{
if (AGVManager.FindFullShelfTarget(node.RFID, out FullShelfDestInfo))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_DOUBLE_LINE_RESPONSE);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_DOUBLE_LINE_RESPONSE);
if (FullShelfDestInfo!=null)
{
Common.GetLineNameByNodeName(FullShelfDestInfo.location,out string line);
......@@ -213,7 +213,7 @@ namespace AGVControl
}
runInfo = "AGV到达 " + FullShelfStationPlace + ",并发送出料架请求[ReadyLeave]";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.server.ReadyLeave(FullShelfStationPlace);
}
else
......@@ -223,15 +223,15 @@ namespace AGVControl
Common.GetLineNameByNodeName(FullShelfDestInfo.location, out string line);
runInfo = "AGV到达 " + FullShelfStationPlace + ",查询满料架目的地:" + FullShelfDestInfo.ShowInfo(line);
msg += runInfo; ;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
}
else
{
//[{"msg":"0料车已解绑或未发新料"}]
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回到待机位";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -246,25 +246,25 @@ namespace AGVControl
// Common.MoveToNode(agv, FullShelfStationPlace);
//}
}
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY))
else if (curJobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
runInfo = "到达待机位";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
}
}
else if (GoFullShelfStationStep.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 = Common.FindNode(FullShelfStationPlace);
if (id == -1)
{
runInfo = "未找到节点:" + FullShelfStationPlace;
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
return this;
}
ClientNode node = Common.nodeInfo[id];
......@@ -272,18 +272,18 @@ namespace AGVControl
{
if (!agv.CurTaskName.Equals("Enter"))
{
GoFullShelfStationStep.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 + "出料架,小车链条运行";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Enter"]);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (GoFullShelfStationStep.IsTimeOut(15000, out double timeOutValue))
else if (curJobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
curJobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
//runInfo = "AGV到达 " + FullShelfStationPlace + ",15秒后重新向双层线发送出料架请求[ReadyLeave]";
//msg += runInfo;
//GoFullShelfStationStep.Msg = msg;
......@@ -291,28 +291,31 @@ namespace AGVControl
}
else if (GoFullShelfStationStep.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 = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv, "Enter", CurTaskState))
{
agv.HasError = false;
//GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
runInfo = FullShelfStationPlace + "满料架进入小车完成";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new SendFullShelfToLineJob(FullShelfDestInfo);
}
else if (GoFullShelfStationStep.IsTimeOut(60000, out double timeOutValue))
else if (curJobStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{
//链条停止
runInfo = "满料架在[" + FullShelfStationPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
runInfo = "满料架在[" + FullShelfStationPlace + "]进入小车超时,请检查料架进入小车的情况";
//msg +=runInfo;
//GoFullShelfStationStep.Msg = msg;
agv.HasError = true;
agv.SetErrorMsg("满料架在[" + FullShelfStationPlace + "]进入小车超时,请检查料架进入小车的情况",timeOutValue.TotalMinutes.ToString("f2"));
}
}
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this;
}
......
......@@ -27,6 +27,7 @@ namespace AGVControl
RFID = boxDestInfo.id;
BoxDestInfo = boxDestInfo;
IsIgnoreBigShelf = isIgNoreBigShelf;
JobName = "送满料任务";
}
/// <summary>
......@@ -42,8 +43,6 @@ namespace AGVControl
/// </summary>
public bool IsIgnoreBigShelf { get; private set; }
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
......@@ -53,51 +52,51 @@ namespace AGVControl
}
private JobStep<SEND_FULL_SHELF_STEP> SendFullShelfStep = 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)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.RFID = RFID;
agv.Msg = "送满料任务:"+runInfo;
agv.Msg = runInfo;
//runInfo = "送满料任务:";
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.NONE))
if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.NONE))
{
AGVManager.AgvRemoveRfid(RFID);
if (FullShelfPlace.StartsWith(SettingString.C4_Name_Prefix))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "前往4C门,从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR))
else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorDToC, CurTaskState))
{
if (Common.Check4CTarget(agv, FullShelfPlace))//被占用
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + FullShelfPlace + "有小车占用,先到临时待机位";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -105,19 +104,19 @@ namespace AGVControl
{
if(Common.CheckIsInAirDoor(FullShelfPlace))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "到达4C门,过风淋门[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -125,20 +124,20 @@ namespace AGVControl
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR))
else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE))
else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.C4_STANDBY1, CurTaskState) || Common.CheckTaskFinished(agv, SettingString.C4_STANDBY2, CurTaskState))
......@@ -147,20 +146,20 @@ namespace AGVControl
{
if (Common.CheckIsInAirDoor(FullShelfPlace))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "到临时待机位,去产线先过风淋门[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.DeleteStandyInfo(agv);
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从临时待机位送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.DeleteStandyInfo(agv);
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
......@@ -168,7 +167,7 @@ namespace AGVControl
}
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE))
else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, FullShelfPlace, CurTaskState))
......@@ -182,34 +181,34 @@ namespace AGVControl
//}
if (IsIgnoreBigShelf)
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE);
runInfo = "AGV到达 " + FullShelfPlace + ",并发送入料架请求[ReadyEnter]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.server.ReadyEnter(FullShelfPlace);
}
else
{
if (RFID.StartsWith("C") && !agv.Place.Equals(SettingString.D4FeederIn) && !agv.Place.Equals(SettingString.C4FeederIn))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK);
runInfo = "AGV到达 " + FullShelfPlace + ",并等待大料架[" + RFID + "]库位转移";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
}
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE);
runInfo = "AGV到达 " + FullShelfPlace + ",并发送入料架请求[ReadyEnter]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
Common.server.ReadyEnter(FullShelfPlace);
}
}
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK))
else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK))
{
Common.mir.Get_IO_Status(agv, out bool[] input, out bool[] output);
System.Threading.Thread.Sleep(50);
......@@ -218,11 +217,12 @@ namespace AGVControl
runInfo = "大料架在" + FullShelfPlace + "库位转移完成 [" + RFID + "] [" + agv.BoxDestInfo + "]";
agv.BoxDestInfo = "";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new EmptyShelfBackJob(FullShelfPlace, eShelfType.BigShelf);
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE))
else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE))
{
int id = Common.FindNode(FullShelfPlace);
ClientNode node = Common.nodeInfo[id];
......@@ -230,12 +230,13 @@ namespace AGVControl
System.Threading.Thread.Sleep(50);
if (node.StateEquals(eNodeStatus.MayEnter))
{
agv.HasError = false;
if (!agv.CurTaskName.Equals("Leave"))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE);
runInfo = "收到产线入料架请求[ReadyEnter]的响应 " + FullShelfPlace + "入料架,小车链条运行";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Leave"]);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
......@@ -243,41 +244,47 @@ namespace AGVControl
}
else if (input != null && !input[3] && input[0])
{
agv.HasError = false;
runInfo = "手动操作:满料架进入" + FullShelfPlace + "完成 [RFID=" + RFID + "] [" + agv.BoxDestInfo + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
agv.RFID = "";
agv.BoxDestInfo = "";
AGVManager.UpdateStatus(RFID, FullShelfPlace);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new EmptyAGVBackJob(FullShelfPlace);
}
else if (SendFullShelfStep.IsTimeOut(15000, out double timeOutValue))
else if (curJobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "AGV到达 " + FullShelfPlace + ",15秒后重新向产线发送入料架请求[ReadyEnter]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
agv.HasError = true;
agv.SetErrorMsg("AGV到达 " + FullShelfPlace + ",向产线发送入料架请求[ReadyEnter]异常", timeOutValue.TotalMinutes.ToString("f2"));
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE))
else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
{
agv.HasError = false;
runInfo = "满料进入" + FullShelfPlace + "完成 [RFID=" + RFID + "] [" + agv.BoxDestInfo + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
curJobStep.Msg = msg;
agv.RFID = "";
agv.BoxDestInfo = "";
AGVManager.UpdateStatus(RFID, FullShelfPlace);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new EmptyAGVBackJob(FullShelfPlace);
}
else if (SendFullShelfStep.IsTimeOut(60000, out double timeOutValue))
else if (curJobStep.IsTimeOut(60000, out TimeSpan timeOutValue))
{
//链条停止
runInfo = "满料在[" + FullShelfPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
//msg += runInfo;
//SendFullShelfStep.Msg = msg;
runInfo = "满料在[" + FullShelfPlace + "]离开小车超时,请检查料架离开小车的情况";
agv.HasError = true;
agv.SetErrorMsg("满料在[" + FullShelfPlace + "]离开小车超时", timeOutValue.TotalMinutes.ToString("f2"));
}
}
......@@ -285,7 +292,7 @@ namespace AGVControl
//{
//}
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return this;
}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!