Commit 8b6e4812 张东亮

二期基本ok,剩余跨风淋门功能测试

1 个父辈 4ee65acf
......@@ -31,6 +31,18 @@ namespace Common
public const string LIFT_D2 = "LIFT_D2";
public const string LIFT_C1 = "LIFT_C1";
public const string storage = "storage";
public const string CrossDoor = "CrossDoor";
public const string CrossAirDoor = "CrossAirDoor";
public const string In = "In";
public const string Out = "Out";
public const string ToDoor = "ToDoor";
public const string OpenDoor = "OpenDoor";
public const string EnterDoor = "EnterDoor";
public const string CloseDoor = "CloseDoor";
public const string OpenOtherDoor = "OpenOtherDoor";
public const string LeaveDoor = "LeaveDoor";
public const string CloseOtherDoor = "CloseOtherDoor";
//任务状态
public const string Wait = "Wait";
public const string Done = "Done";
......
......@@ -30,7 +30,7 @@ namespace DeviceLibrary
{
AgvCallTimer = new System.Timers.Timer
{
Interval = 300,
Interval = 500,
AutoReset = true,
Enabled = false
};
......@@ -38,7 +38,7 @@ namespace DeviceLibrary
AgvStateTimer = new System.Timers.Timer
{
Interval = 5000,
Interval = 3000,
AutoReset = true,
Enabled = false
};
......@@ -181,7 +181,6 @@ namespace DeviceLibrary
return null;
if (job != null)
{
//log.Debug(agv_Info.Name + " GetJob OK " + job.ToString());
return job;
}
}
......@@ -214,7 +213,6 @@ namespace DeviceLibrary
if (!AGVManager.agvInfo[i].StateID.Equals(eAGVState.Ready)
&& !AGVManager.agvInfo[i].StateID.Equals(eAGVState.Executing) && !AGVManager.agvInfo[i].StateID.Equals(eAGVState.None))
{
//log.Warn(string.Format("{0}不能调用 StateID={1}", AGVManager.agvInfo[i].Name, AGVManager.agvInfo[i].StateID.ToString()));
continue;
}
if (agv.TaskRunState.DeWaitTaskQueue(out AgvTask task))
......
......@@ -18,7 +18,10 @@ namespace DeviceLibrary.bean
/// 初始地点
/// </summary>
public Node SrcNode { get; set; }
/// <summary>
/// 过门信息
/// </summary>
public CrossDoor CrossDoor { get; set; } = new CrossDoor();
private service.model.MissionInfo missionInfo;
/// <summary>
......@@ -67,6 +70,7 @@ namespace DeviceLibrary.bean
Shelf = shelf;
this.missionInfo = MissionInfo;
TargetNodes = new List<Node>();
CrossDoor = new CrossDoor();
}
}
/// <summary>
......@@ -102,4 +106,24 @@ namespace DeviceLibrary.bean
this.RunStep = step;
}
}
public class CrossDoor
{
/// <summary>
/// 当前位置
/// </summary>
public Node CurNode { get; set; }
/// <summary>
/// 下一位置
/// </summary>
public Node NextNode { get; set; }
/// <summary>
/// 是否是进入方向
/// </summary>
public bool IsIn { get; set; } = true;
/// <summary>
/// 是否是风淋门
/// </summary>
public bool IsAir { get; set; } = false;
}
}
......@@ -59,6 +59,7 @@ namespace DeviceLibrary.bean
/// 关闭电梯门
/// </summary>
ShelfBack_LiftToStore_05_CloseLiftDoor,
ShelfBack_LiftToStore_06_CrossDoor,
/// <summary>
/// 去库房
/// </summary>
......@@ -67,11 +68,14 @@ namespace DeviceLibrary.bean
/// 放下料车
/// </summary>
ShelfBack_LiftToStore_07_TakeShelfOff,
ShelfBack_LiftToStore_07_CrossDoor,
#endregion
#region 线体到电梯
LineToLift_00_CrossDoor,
LineToLift_01_ToLine,
LineToLift_02_PutShelfOn,
LineToLift_02_CrossDoor,
LineToLift_ToSteelSrc,
LineToLift_PlaySound,
LineToLift_WaitConfirm,
......@@ -146,6 +150,8 @@ namespace DeviceLibrary.bean
/// 去线体
/// </summary>
SD_LiftToLine_07_ToLine,
SD_LiftToLine_07_CrossDoor,
SD_LiftToLine_07_CrossTwoDoor,
/// <summary>
/// 到达线体,上报位置
/// </summary>
......@@ -163,6 +169,8 @@ namespace DeviceLibrary.bean
/// </summary>
SD_LiftToLine_11_BackToLift,
SD_LiftToLine_11_ToStandby,
SD_LiftToLine_11_CrossTwoDoor,
SD_LiftToLine_11_CrossTDoor,
/// <summary>
/// 等待电梯门开启
/// </summary>
......@@ -198,6 +206,8 @@ namespace DeviceLibrary.bean
/// 料车无需返回,直接结束
/// </summary>
SD_LiftToLine_16_TakeShelfOff,
SD_LiftToLine_16_CrossTwoDoor,
SD_LiftToLine_16_CrossTDoor,
SD_LiftToLine_17_Dock,
SD_LiftToLine_18_CheckState,
SD_LiftToLine_19_TakeOff,
......@@ -441,6 +451,9 @@ namespace DeviceLibrary.bean
#endregion
#region 1F 成品入库从C1D2
S1F_LiftC1ToLiftD2_Buff,
S1F_LiftC1ToLiftD2_ToLine,
S1F_LiftC1ToLiftD2_PutShelf,
S1F_LiftC1ToLiftD2_00_ToStandby,
/// <summary>
/// 去电梯口
......
......@@ -24,14 +24,14 @@ namespace DeviceLibrary
/// <param name="agv"></param>
public override Job Run(AgvInfo agv)
{
agv.SetJobContext(new bean.agv.JobContext()
{
AgvTask = agv.TaskRunState.Task,
JobFullName = this.ToString(),
JobStep = JobRunStep.PreStep(),
Name = agv.Name,
JobParam = JobParam
}) ;
//agv.SetJobContext(new bean.agv.JobContext()
//{
// AgvTask = agv.TaskRunState.Task,
// JobFullName = this.ToString(),
// JobStep = JobRunStep.PreStep(),
// Name = agv.Name,
// JobParam = JobParam
//}) ;
if (JobRunStep.IsStep(RunStep.NONE))
{
ClearLiftNodeOccupied(agv);
......
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.manager;
using System.Text;
namespace DeviceLibrary
{
......@@ -16,7 +18,7 @@ namespace DeviceLibrary
{
JobName = "过门任务";
}
public CrossDoorJob():base()
public CrossDoorJob() : base()
{
JobName = "过门任务";
}
......@@ -26,51 +28,175 @@ namespace DeviceLibrary
/// <param name="agv"></param>
public override Job Run(AgvInfo agv)
{
Job job = this;
agv.SetJobContext(new bean.agv.JobContext()
{
AgvTask = agv.TaskRunState.Task,
JobFullName = this.ToString(),
JobStep = JobRunStep.PreStep(),
Name = agv.Name,
JobParam=JobParam
JobParam = JobParam
});
if (JobRunStep.IsStep(RunStep.NONE))
{
JobRunStep.ToNextStep(RunStep.CrossDoor_01_ToCurDoor);
runInfo = $"去{JobParam.CrossDoor.CurNode.AliceName}侧门前";
JobRunStep.Msg = runInfo;
tocurDoor(agv);
}
else if (JobRunStep.IsStep(RunStep.CrossDoor_01_ToCurDoor))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
{
JobRunStep.ToNextStep(RunStep.STANDBY_WAIT_REACH_STANDBY);
runInfo = "从" + JobParam.SrcNode + "回到待机位";
JobRunStep.Msg = runInfo;
ToStandby(agv);
}
JobRunStep.ToNextStep(RunStep.CrossDoor_02_OpenCurDoor);
runInfo = $"到达{JobParam.CrossDoor.CurNode.AliceName}侧门前,开门";
JobRunStep.Msg = runInfo;
openCurDoor(agv);
}
}
else if (JobRunStep.IsStep(RunStep.STANDBY_WAIT_REACH_STANDBY))
else if (JobRunStep.IsStep(RunStep.CrossDoor_02_OpenCurDoor))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.END);
// runInfo = "到达待机位";
//JobRunStep.Msg = runInfo;
JobRunStep.ToNextStep(RunStep.CrossDoor_03_Enter);
runInfo = $"从{JobParam.CrossDoor.CurNode.AliceName}侧进门";
JobRunStep.Msg = runInfo;
enterDoor(agv);
}
}
else if (JobRunStep.IsStep(RunStep.END))
else if (JobRunStep.IsStep(RunStep.CrossDoor_03_Enter))
{
//Job job = AGVManager.control.GetJob(agv);
//if (job != null && !(job is StandyJob))
//{
// if (job is ChargeJob && agv.Battery > BatteryMid)
// return this;
// runInfo = "在待机位检测到任务,执行任务";
// JobRunStep.Msg = runInfo;
// JobRunStep.EndJob();
// return job;
//}
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.CrossDoor_04_CloseCurDoor);
runInfo = $"关闭{JobParam.CrossDoor.CurNode.AliceName}侧的门";
JobRunStep.Msg = runInfo;
closeCurDoor(agv);
}
}
else if (JobRunStep.IsStep(RunStep.CrossDoor_04_CloseCurDoor))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.CrossDoor_05_OpenAntherDoor);
runInfo = $"打开{JobParam.CrossDoor.NextNode.AliceName}侧门";
JobRunStep.Msg = runInfo;
openNextDoor(agv);
}
}
else if (JobRunStep.IsStep(RunStep.CrossDoor_05_OpenAntherDoor))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.CrossDoor_06_LeaveDoor);
runInfo = $"离开门,进入{JobParam.CrossDoor.NextNode.AliceName}侧";
JobRunStep.Msg = runInfo;
leaveDoor(agv);
}
}
else if (JobRunStep.IsStep(RunStep.CrossDoor_06_LeaveDoor))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.CrossDoor_07_CloseAntherDoor);
runInfo = $"关闭{JobParam.CrossDoor.NextNode.AliceName}侧门";
JobRunStep.Msg = runInfo;
closeNextDoor(agv);
}
}
else if (JobRunStep.IsStep(RunStep.CrossDoor_07_CloseAntherDoor))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.CrossDoor_08_Finish);
runInfo = $"到达{JobParam.CrossDoor.NextNode.AliceName}的车间";
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.CrossDoor_08_Finish))
{
job = GetCallBackJob();
job.JobRunStep.ToNextStep(GetCallBackStep());
JobRunStep.Msg = $"从{JobParam.CrossDoor.CurNode.AliceName}-》{JobParam.CrossDoor.NextNode.AliceName}完成";
}
return job;
}
//默认 4D->4C
//4C外-》4C风淋门内
//3D风淋门外-》3D风淋门内
return this;
/// <summary>
/// 获取任务名
/// </summary>
/// <returns></returns>
string getTaskName(string name)
{
StringBuilder sb = new StringBuilder();
if (JobParam.CrossDoor?.IsAir??false)
sb.Append(SettingString.CrossAirDoor);
else
{
sb.Append(SettingString.CrossDoor);
}
sb.Append("_");
if (JobParam.CrossDoor?.IsIn??true)
sb.Append(SettingString.In);
else
sb.Append(SettingString.Out);
sb.Append("_");
sb.Append(name);
return sb.ToString();
}
/// <summary>
/// 去当前车间门前
/// </summary>
void tocurDoor(AgvInfo agv)
{
AllocateTask(agv, getTaskName(SettingString.ToDoor));
}
/// <summary>
/// 开当前门
/// </summary>
void openCurDoor(AgvInfo agv)
{
AllocateTask(agv, getTaskName(SettingString.OpenDoor));
}
/// <summary>
/// 进入门里
/// </summary>
void enterDoor(AgvInfo agv)
{
AllocateTask(agv, getTaskName(SettingString.EnterDoor));
}
/// <summary>
/// 关闭当前门
/// </summary>
void closeCurDoor(AgvInfo agv)
{
AllocateTask(agv, getTaskName(SettingString.CloseDoor));
}
/// <summary>
/// 开另一个门
/// </summary>
void openNextDoor(AgvInfo agv)
{
AllocateTask(agv, getTaskName(SettingString.OpenOtherDoor));
}
/// <summary>
/// 离开门
/// </summary>
void leaveDoor(AgvInfo agv)
{
AllocateTask(agv, getTaskName(SettingString.LeaveDoor));
}
/// <summary>
/// 关闭另一个门
/// </summary>
void closeNextDoor(AgvInfo agv)
{
AllocateTask(agv, getTaskName(SettingString.CloseOtherDoor));
}
}
......
......@@ -42,7 +42,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_00_ToStandby);
runInfo = $"已有小车在{JobParam.SrcNode.AliceName},先去待机点";
JobRunStep.Msg = runInfo;
MoveToNode(agv, SettingString.Standby);
ToStandby(agv);
}
else
{
......@@ -53,6 +53,47 @@ namespace DeviceLibrary.bean.job
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_Buff))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_ToLine);
runInfo = $"去{JobParam.SrcNode.AliceName}的取料点";
ToPutShelfOn(agv, $"{JobParam.SrcNode.Name}");
JobRunStep.Msg = runInfo;
}
else if(JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_ToLine))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_PutShelf);
runInfo = $"到达{JobParam.SrcNode.AliceName}的取料点,开始拾取料车";
JobRunStep.Msg = runInfo;
PutShelfOn(agv);
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_PutShelf))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
if (TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_ToStandby);
runInfo = $"已有小车在{JobParam.CurTargetNode.AliceName},先去待机点";
JobRunStep.Msg = runInfo;
ToStandby(agv);
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_07_ToLiftD2);
runInfo = $"在料架缓存点取料完成,去{JobParam.CurTargetNode.AliceName}";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.送料, out string msg);
//AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
ToLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_00_ToStandby))
{
if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
......@@ -88,7 +129,7 @@ namespace DeviceLibrary.bean.job
runInfo = $"{JobParam.SrcNode.AliceName}门已开启,去取料点";
//任务状态变更
SetLiftOccupied(JobParam.SrcNode.Name, agv);
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}");
ToPutShelfOn(agv, $"{JobParam.SrcNode.Name}");
JobRunStep.Msg = runInfo;
}
else if (JobRunStep.IsTimeOut(20) && !LiftContext.CheckIfRequestOk(JobParam.SrcNode.Name, JobParam.GetMissionInfo()))
......@@ -215,8 +256,8 @@ namespace DeviceLibrary.bean.job
{
if (LiftContext.HasShelfNeedLeaveFinished(JobParam.CurTargetNode.Name, agv.Client, out JobParam.LiftStatus))
{
job = new SwitchShelfJob(JobParam);
MissionManager.SetMissionOccupied(JobParam.GetMissionInfo().missionId, agv);
job = new SwitchShelfJob(JobParam);
}
else //if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{
......@@ -224,7 +265,7 @@ namespace DeviceLibrary.bean.job
SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}");
ToTakeShelfOff(agv, $"{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsTimeOut(20) && !LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
......@@ -349,7 +390,7 @@ namespace DeviceLibrary.bean.job
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回起始地, out string msg);
}
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.LiftStatus.destinationPoint}_{SettingString.TakeShelfOff}");
ToTakeShelfOff(agv, $"{JobParam.LiftStatus.destinationPoint}");
}
else if (JobRunStep.IsTimeOut(0.5, out double val))
{
......@@ -369,7 +410,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_19_02_TakeShelfOff);
runInfo = $"到达{JobParam.LiftStatus.destinationPoint}的放料点,准备卸下";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
TakeShelfOff(agv);
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_19_02_TakeShelfOff))
......@@ -385,7 +426,7 @@ namespace DeviceLibrary.bean.job
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.完成, out string msg);
}
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.PutShelfOn}");
ToTmp1PutOn(agv, $"{JobParam.CurTargetNode.Name}");
}
}
......@@ -435,7 +476,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_02_TakeShelfOff);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}临时点2的放料点,准备放下料车";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
TakeShelfOff(agv);
}
}
......@@ -446,7 +487,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_03_ToTemp1);
runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点2放下料车完成,去临时点1的取料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.PutShelfOn}");
ToTmp1PutOn(agv, $"{JobParam.CurTargetNode.Name}");
}
}
......@@ -469,7 +510,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_05_ToLiftC1);
runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点1取料完成,去电梯";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
ToLift(agv, $"{JobParam.CurTargetNode.Name}");
}
}
......@@ -480,7 +521,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_06_EnterLiftC1);
runInfo = $"进入{JobParam.CurTargetNode.AliceName}的放料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}");
ToTakeShelfOff(agv, $"{JobParam.CurTargetNode.Name}");
}
}
......@@ -524,6 +565,7 @@ namespace DeviceLibrary.bean.job
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.等待成品回收, out string msg);
JobRunStep.Msg = runInfo;
ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
ClearLiftNodeOccupied(agv);
}
}
......@@ -534,16 +576,16 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_10_ToTemp2);
runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2的取料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp2}_{SettingString.PutShelfOn}");
}
else if (JobRunStep.IsTimeOut(0.5, out double val))
{
//AGV离开
LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"{JobParam.CurTargetNode.AliceName}离开信号超时重发";
JobRunStep.Msg = runInfo;
Thread.Sleep(3000);
ToTmp2PutOn(agv, $"{JobParam.CurTargetNode.Name}");
}
//else if (JobRunStep.IsTimeOut(0.5, out double val))
//{
// //AGV离开
// LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
// runInfo = $"{JobParam.CurTargetNode.AliceName}离开信号超时重发";
// JobRunStep.Msg = runInfo;
// Thread.Sleep(3000);
//}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_20_10_ToTemp2))
{
......
......@@ -38,14 +38,14 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_00_ToStandby);
runInfo = $"在{JobParam.SrcNode.AliceName}小车,先去待机点";
JobRunStep.Msg = runInfo;
MoveToNode(agv, SettingString.Standby);
ToStandby(agv);
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_01_ToLiftD2);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.SrcNode.Name}");
ToLift(agv, $"{JobParam.SrcNode.Name}");
}
}
......@@ -138,7 +138,7 @@ namespace DeviceLibrary.bean.job
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_07_ToStandby);
runInfo = $"在{JobParam.CurTargetNode.AliceName}有小车,去待机点";
MoveToNode(agv, $"{SettingString.Standby}");
ToStandby(agv);
JobRunStep.Msg = runInfo;
}
else
......@@ -202,6 +202,7 @@ namespace DeviceLibrary.bean.job
}
else if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out JobParam.LiftStatus))
{
MissionManager.SetMissionOccupied(JobParam.GetMissionInfo().missionId, agv);
job = new SwitchShelfJob(JobParam);
//service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
//if (IsBackShelf(missionInfo))
......@@ -607,6 +608,7 @@ namespace DeviceLibrary.bean.job
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯运行, out string msg);
JobRunStep.Msg = runInfo;
ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
ClearLiftNodeOccupied(agv);
}
......
......@@ -525,7 +525,7 @@ namespace DeviceLibrary
{
MissionInfo missionInfo = JobParam.GetMissionInfo();
service.model.ProjectType type = JobParam.GetMissionInfo().projectType;
if (type.Equals(service.model.ProjectType.空台车领用) ||
if (type.Equals(service.model.ProjectType.空台车领用) ||
type.Equals(service.model.ProjectType.空台车归还) ||
(!missionInfo.needBack))
{
......@@ -603,32 +603,32 @@ namespace DeviceLibrary
/// <returns></returns>
protected bool TargetIsOccupied(AgvInfo agv, string targetName)
{
return LiftContext.OtherAGVIsInLift(agv, targetName);
//try
//{
// if (agv.Scope.Equals("1F"))
// {
// AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP)
// && agv.Scope.Workshop.Equals(s.Scope.Workshop) && s.Scope.Equals("1F"));
// if (agvInfo != null)
// {
// //if (agvInfo?.Place.Name.Contains(targetName) ?? false)
// // return true;
// if (agvInfo?.TaskRunState?.Task?.Name.Equals(targetName) ?? false)
// {
// return true;
// }
// }
// }
// else
// return false;
// return false;
//}
//catch (Exception ex)
//{
// LogUtil.error($"TargetIsOccupied:{agv.Name},{JsonHelper.SerializeObject(AGVManager.agvInfo)}", ex);
// return false;
//}
if (LiftContext.OtherAGVIsInLift(agv, targetName))
return true;
else
{
try
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP)
&& agv.Scope.Workshop.Equals(s.Scope.Workshop));
if (agvInfo != null)
{
if (agvInfo?.TaskRunState?.Task?.Name.Contains(targetName) ?? false)
{
return true;
}
//else if (agvInfo?.Place?.Name.Contains(targetName) ?? false)
// return true;
}
return false;
}
catch (Exception ex)
{
LogUtil.error($"TargetIsOccupied:{agv.Name},{JsonHelper.SerializeObject(AGVManager.agvInfo)}", ex);
return false;
}
}
}
/// <summary>
/// 获取任务下一个状态
......@@ -682,10 +682,10 @@ namespace DeviceLibrary
/// <returns></returns>
protected bool setMissionState(MissionInfo missionInfo)
{
service.model.MissionInfo mission = manager.MissionManager.GetMission(missionInfo?.missionId??"");
service.model.MissionInfo mission = manager.MissionManager.GetMission(missionInfo?.missionId ?? "");
if (mission != null)
{
MissionState missionState = getNextState(mission.state);
MissionState missionState = getNextState(mission.state);
//任务状态变更
MissionManager.SetMissionState(mission.missionId, missionState, out string msg);
return true;
......
......@@ -38,11 +38,28 @@ namespace DeviceLibrary
});
if (JobRunStep.IsStep(RunStep.NONE))
{
JobParam.CrossDoor.CurNode = agv.Place;
JobParam.CrossDoor.NextNode = JobParam.SrcNode;
if (NodeManager.NeedCrossDoor(agv,JobParam.CrossDoor.CurNode,JobParam.CrossDoor.NextNode, out bool isin, out bool isair))
{
JobParam.CrossDoor.IsIn = isin;
JobParam.CrossDoor.IsAir = isair;
GenJobCallBack(this.GetType(), RunStep.LineToLift_00_CrossDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else
{
JobRunStep.ToNextStep(RunStep.LineToLift_00_CrossDoor);
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_00_CrossDoor))
{
JobRunStep.ToNextStep(RunStep.LineToLift_01_ToLine);
runInfo = $"去{JobParam.SrcNode.AliceName}的取料点";
ToPutShelfOn(agv, $"{JobParam.SrcNode.Name}");
JobRunStep.Msg = runInfo;
}
else if (JobRunStep.IsStep(RunStep.LineToLift_01_ToLine))
{
......@@ -69,24 +86,47 @@ namespace DeviceLibrary
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"取车"));
if (TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
JobParam.CrossDoor.CurNode = JobParam.SrcNode;
JobParam.CrossDoor.NextNode = JobParam.CurTargetNode;
if (NodeManager.NeedCrossDoor(agv, JobParam.CrossDoor.CurNode,JobParam.CrossDoor.NextNode, out bool isin, out bool isair))
{
JobRunStep.ToNextStep(RunStep.LineToLift_ToStandby);
ToStandby(agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}有小车,先去待机点";
JobRunStep.Msg = runInfo;
JobParam.CrossDoor.IsIn = isin;
JobParam.CrossDoor.IsAir = isair;
GenJobCallBack(this.GetType(), RunStep.LineToLift_02_CrossDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else
{
JobRunStep.ToNextStep(RunStep.LineToLift_03_ToLift);
runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,去{JobParam.CurTargetNode.AliceName}";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg);
ToLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
JobRunStep.ToNextStep(RunStep.LineToLift_02_CrossDoor);
}
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_02_CrossDoor))
{
if (TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_ToStandby);
if (agv.Scope.Workshop.Equals("1F"))
{
ToStandby(agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}有小车,先去待机点";
}
else
runInfo = $"{JobParam.CurTargetNode.AliceName}有小车,等待空闲";
JobRunStep.Msg = runInfo;
}
else
{
JobRunStep.ToNextStep(RunStep.LineToLift_03_ToLift);
runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,去{JobParam.CurTargetNode.AliceName}";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg);
ToLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_ToStandby))
{
if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
......@@ -122,8 +162,8 @@ namespace DeviceLibrary
{
if (LiftContext.CheckHasEmptyFinished(agv, JobParam.CurTargetNode.Name, out JobParam.LiftStatus))
{
MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId??"");
if (missionInfo!=null)
MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId ?? "");
if (missionInfo != null)
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_13_ToShelfPlace);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,内有成品空料车{missionInfo.missionId},去料架缓存点";//
......@@ -145,8 +185,9 @@ namespace DeviceLibrary
if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out JobParam.LiftStatus))
{
MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId ?? "");
if (missionInfo!=null)
if (missionInfo != null)
{
MissionManager.SetMissionOccupied(missionInfo, agv);
job = new SwitchShelfJob(JobParam);
}
else
......@@ -166,7 +207,7 @@ namespace DeviceLibrary
SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点";
JobRunStep.Msg = runInfo;
ToTakeShelfOff(agv,JobParam.CurTargetNode.Name);
ToTakeShelfOff(agv, JobParam.CurTargetNode.Name);
}
}
else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
......
using Common;
using DeviceLibrary.manager;
using System.Data.Entity.Infrastructure;
namespace DeviceLibrary.bean.job
{
......@@ -20,6 +21,7 @@ namespace DeviceLibrary.bean.job
}
public override Job Run(AgvInfo agv)
{
Job job = this;
agv.SetJobContext(new bean.agv.JobContext()
{
MissionId = JobParam.GetMissionInfo().missionId,
......@@ -31,12 +33,12 @@ namespace DeviceLibrary.bean.job
});
if (JobRunStep.IsStep(RunStep.NONE))
{
if(TargetIsOccupied(agv, JobParam.SrcNode.Name))
if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_01_ToStandby);
runInfo = $"{JobParam.SrcNode.AliceName}有小车,去待机点";
JobRunStep.Msg = runInfo;
MoveToNode(agv, $"{SettingString.Standby}");
ToStandby(agv);
}
else
{
......@@ -45,8 +47,8 @@ namespace DeviceLibrary.bean.job
JobRunStep.Msg = runInfo;
ToLift(agv, $"{JobParam.SrcNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_01_ToStandby))
{
if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
......@@ -58,7 +60,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_01_ToLift);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.SrcNode.Name}");
ToLift(agv, $"{JobParam.SrcNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_01_ToLift))
......@@ -83,7 +85,7 @@ namespace DeviceLibrary.bean.job
//任务状态变更
lift.LiftContext.SetLiftOccupiedAgv(JobParam.SrcNode.Name, agv.IP);
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯到达, out string msg);
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}");
ToPutShelfOn(agv, $"{JobParam.SrcNode.Name}");
JobRunStep.Msg = runInfo;
}
}
......@@ -124,15 +126,33 @@ namespace DeviceLibrary.bean.job
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回离开电梯, out string msg);
JobRunStep.Msg = runInfo;
ClearLiftNodeOccupied(agv);
}
}
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_05_CloseLiftDoor))
{
if (NodeManager.NeedCrossDoor(agv, JobParam.SrcNode, JobParam.CurTargetNode, out bool isin, out bool isair))
{
JobParam.CrossDoor.CurNode = JobParam.SrcNode;
JobParam.CrossDoor.NextNode = JobParam.CurTargetNode;
JobParam.CrossDoor.IsIn = isin;
JobParam.CrossDoor.IsAir = isair;
GenJobCallBack(this.GetType(), RunStep.ShelfBack_LiftToStore_06_CrossDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else
{
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_06_CrossDoor);
}
}
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_06_CrossDoor))
{
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_06_ToStore);
runInfo = $"关闭{JobParam.SrcNode.AliceName}门完成,去{JobParam.CurTargetNode.AliceName}放料点";
runInfo = $"去{JobParam.CurTargetNode.AliceName}放料点";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回起始地, out string msg);
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}");
ToTakeShelfOff(agv, $"{JobParam.CurTargetNode.Name}");
JobRunStep.Msg = runInfo;
}
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_06_ToStore))
......@@ -153,23 +173,45 @@ namespace DeviceLibrary.bean.job
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.END);
runInfo = $"任务结束:在{JobParam.CurTargetNode.AliceName}卸下料车完成";
runInfo = $"在{JobParam.CurTargetNode.AliceName}卸下料车完成";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.完成, out string msg);
JobRunStep.Msg = runInfo;
//上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"还车"));
if (IsProjectType(service.model.ProjectType.移远成品入库))
{
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"卸货{JobParam.CurTargetNode.Name}"));
}
else
//上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"还车"));
if (NodeManager.NeedCrossDoor(agv, JobParam.CurTargetNode, JobParam.SrcNode, out bool isin, out bool isair))
{
JobParam.CrossDoor.CurNode = JobParam.CurTargetNode;
JobParam.CrossDoor.NextNode = JobParam.SrcNode;
JobParam.CrossDoor.IsIn = isin;
JobParam.CrossDoor.IsAir = isair;
GenJobCallBack(this.GetType(), RunStep.ShelfBack_LiftToStore_07_CrossDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else
{
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_07_CrossDoor);
}
}
}
else if(JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_07_CrossDoor))
{
JobRunStep.ToNextStep(RunStep.END);
}
else if (JobRunStep.IsStep(RunStep.END))
{
JobRunStep.EndJob();
return null;
job = null;
}
return this;
return job;
}
}
}
......@@ -27,14 +27,14 @@ namespace DeviceLibrary
/// <param name="agv"></param>
public override Job Run(AgvInfo agv)
{
agv.SetJobContext(new bean.agv.JobContext()
{
AgvTask = agv.TaskRunState.Task,
JobFullName = this.ToString(),
JobStep = JobRunStep.PreStep(),
Name = agv.Name,
JobParam=JobParam
});
//agv.SetJobContext(new bean.agv.JobContext()
//{
// AgvTask = agv.TaskRunState.Task,
// JobFullName = this.ToString(),
// JobStep = JobRunStep.PreStep(),
// Name = agv.Name,
// JobParam=JobParam
//});
if (JobRunStep.IsStep(RunStep.NONE))
{
{
......
......@@ -102,7 +102,6 @@ namespace DeviceLibrary
JobRunStep.ToNextStep(RunStep.Switch_04_EnterLift);
if (setMissionState(liftMission))
{
MissionManager.SetMissionOccupied(liftMission, agv);
runInfo = $"到{JobParam.CurTargetNode.AliceName}的取料点,并设置任务状态,,{missionInfo()}";
}
else
......
using Common;
using DeviceLibrary.bean.job;
using DeviceLibrary.lift;
using DeviceLibrary.manager;
using System;
......@@ -27,7 +28,7 @@ namespace DeviceLibrary.bean.jobType
{
return null;
}
if (TargetIsOccupied(agv, liftname))
if (AgvAtPlace(agv, liftname))
return null;
//if (service.model.MissionInfo.IsFinishedProdcut(missionInfo))
// return null;
......@@ -35,6 +36,7 @@ namespace DeviceLibrary.bean.jobType
string[] dests = lift.destinationPoint.Split(',');
Node dest = manager.NodeManager.GetNode(dests.Length > 1 ? dests[0] : lift.destinationPoint, NodeType.Node);
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
LiftContext.SetLiftNodeOccupied(agv, liftname);
MissionManager.SetMissionOccupied(missionInfo, agv);
return new ShelfBackLiftToStoreJob(jobParam);
}
......@@ -44,6 +46,7 @@ namespace DeviceLibrary.bean.jobType
}
bool CheckHasSameJob(AgvInfo agv,string liftname)
{
return false;
try
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop)
......
......@@ -24,7 +24,7 @@ namespace DeviceLibrary.bean.jobType
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1SendFullFinishedC1ToD2Mission(agv);
if(missionInfo!=null)
{
if (TargetIsOccupied(agv, SettingString.LIFT_D2) || TargetIsOccupied(agv, SettingString.LIFT_C1))
if (TargetIsOccupied(agv, SettingString.LIFT_C1))//TargetIsOccupied(agv, SettingString.LIFT_D2) ||
{
return null;
}
......@@ -43,10 +43,11 @@ namespace DeviceLibrary.bean.jobType
}
bool CheckHasSameJob(AgvInfo agv)
{
return false;
try
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop)
&& s.CurJob != null && (s.CurJob is F1LiftC1ToLiftD2Job || s.CurJob is F1LiftD2ToLiftC1Job || s.CurJob is LineToLiftJob));
&& !s.IP.Equals(agv.IP) && s.CurJob != null && (s.CurJob is F1LiftC1ToLiftD2Job || s.CurJob is F1LiftD2ToLiftC1Job ));//|| (s.CurJob is LineToLiftJob && SettingString.LIFT_C1.Equals(s.CurJob?.JobParam?.GetMissionInfo()?.liftName??"")
if (agvInfo != null)
return true;
}
......
......@@ -38,10 +38,11 @@ namespace DeviceLibrary.bean.jobType
}
bool CheckHasSameJob(AgvInfo agv)
{
return false;
try
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop)
&& s.CurJob != null && (s.CurJob is F1LiftD2ToLiftC1Job || s.CurJob is F1LiftC1ToLiftD2Job || s.CurJob is LineToLiftJob));
&& !s.IP.Equals(agv.IP) && s.CurJob != null && (s.CurJob is F1LiftD2ToLiftC1Job || s.CurJob is F1LiftC1ToLiftD2Job || s.CurJob is LineToLiftJob));
if (agvInfo != null)
return true;
}
......
......@@ -18,10 +18,6 @@ namespace DeviceLibrary
{
return null;
}
//public bool HasRobotExecuteLiftTask(AgvInfo agvInfo,string liftName)
//{
// AGVManager.agvInfo.Find(s=>s.Auto&& !s.IP.Equals(agvInfo.IP)&&(agvInfo?.CurJob?.JobParam?.))
//}
/// <summary>
/// 目标点是否有小车
/// </summary>
......@@ -32,7 +28,7 @@ namespace DeviceLibrary
{
try
{
return LiftContext.OtherAGVIsInLift(agv, targetName);
return LiftContext.OtherAGVIsInLift(agv, targetName);
}
catch (Exception ex)
{
......@@ -40,5 +36,39 @@ namespace DeviceLibrary
return false;
}
}
/// <summary>
/// 只有去电梯取料料架使用
/// </summary>
/// <param name="agv"></param>
/// <param name="targetName"></param>
/// <returns></returns>
protected bool AgvAtPlace(AgvInfo agv, string targetName)
{
try
{
if (LiftContext.OtherAGVIsInLift(agv, targetName))
{
return true;
}
else
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP)
&& agv.Scope.Workshop.Equals(s.Scope.Workshop));
if (agvInfo != null)
{
if (agvInfo?.TaskRunState?.Task?.Name.Contains(targetName) ?? false)
{
return true;
}
}
return false;
}
}
catch (Exception ex)
{
LogUtil.error($"AgvAtPlace:{agv.Name},{JsonHelper.SerializeObject(AGVManager.agvInfo)}", ex);
return false;
}
}
}
}
......@@ -6,6 +6,7 @@ using DeviceLibrary.manager;
using DeviceLibrary.bean;
using DeviceLibrary.bean.job;
using System;
using DeviceLibrary.lift;
namespace DeviceLibrary
{
......@@ -37,7 +38,7 @@ namespace DeviceLibrary
{
if (!liftname.Equals(missionInfo?.liftName))
return null;
if (TargetIsOccupied(agv, liftname))
if (AgvAtPlace(agv, liftname))
return null;
if (service.model.MissionInfo.IsFinishedProdcut(missionInfo))
return null;
......@@ -61,7 +62,8 @@ namespace DeviceLibrary
}
}
MissionManager.SetMissionOccupied(missionInfo, agv);
LiftContext.SetLiftNodeOccupied(agv, liftname);
MissionManager.SetMissionOccupied(missionInfo, agv);
MissionManager.Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return new LiftToLinesJob(jobParam);
}
......@@ -72,20 +74,20 @@ namespace DeviceLibrary
bool CheckHasSameJob(AgvInfo agv)
{
return false;
try
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop)
&& s.CurJob != null && (s.CurJob is LiftToLinesJob));
if (agvInfo != null)
return true;
//if (agv.Scope.Workshop.Equals("1F"))
//{
//}
//else
//{
// return false;
//}
if (agv.Scope.Workshop.Equals("1F"))
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP) && s.Scope.Workshop.Equals(agv.Scope.Workshop)
&& s.CurJob != null && (s.CurJob is LiftToLinesJob));
if (agvInfo != null)
return true;
}
else
{
return false;
}
}
catch
{
......@@ -95,11 +97,12 @@ namespace DeviceLibrary
}
bool CheckHasSendJob(AgvInfo agv)
{
return false;
try
{
if (agv.Scope.Workshop.Equals("1F"))
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop)
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP)&&s.Scope.Workshop.Equals(agv.Scope.Workshop)
&& s.CurJob != null && s.Scope.Workshop.Equals("1F") && (s.CurJob is LineToLiftJob || s.CurJob is F1LiftC1ToLiftD2Job
|| s.CurJob is F1LiftD2ToLiftC1Job));
if (agvInfo != null)
......@@ -107,7 +110,10 @@ namespace DeviceLibrary
}
else
{
return false;
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP) && s.Scope.Workshop.Equals(agv.Scope.Workshop)
&& s.CurJob != null && (s.CurJob is LineToLiftJob));
if (agvInfo != null)
return true;
}
}
catch
......
......@@ -38,10 +38,10 @@ namespace DeviceLibrary.bean.jobType
Common.LogUtil.error($"无法生成任务,电梯不存在:{liftname}");
return null;
}
if (TargetIsOccupied(agv, liftname))
{
return null;
}
//if (TargetIsOccupied(agv, liftname))
//{
// return null;
//}
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
MissionManager.SetMissionOccupied(missionInfo, agv);
MissionManager.Log.Info($"执行任务[{agv.Name}][LineToLiftJobType]{JsonHelper.SerializeObject(missionInfo)}");
......@@ -54,13 +54,14 @@ namespace DeviceLibrary.bean.jobType
bool CheckHasSameJob(AgvInfo agv, string liftname)
{
return false;
try
{
if (agv.Scope.Workshop.Equals("1F"))
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop) &&
s.CurJob != null && (s.CurJob is LineToLiftJob || s.CurJob is F1LiftC1ToLiftD2Job
|| s.CurJob is F1LiftD2ToLiftC1Job));
!s.IP.Equals(agv.IP)&&s.CurJob != null && ( s.CurJob is F1LiftC1ToLiftD2Job
|| s.CurJob is F1LiftD2ToLiftC1Job));//s.CurJob is LineToLiftJob ||
if (agvInfo != null)
{
if (agvInfo?.CurJob?.JobParam?.GetMissionInfo()?.liftName?.Equals(liftname) ?? true)
......@@ -75,7 +76,7 @@ namespace DeviceLibrary.bean.jobType
else
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop) &&
s.CurJob != null && (s.CurJob is LineToLiftJob));
!s.IP.Equals(agv.IP) && s.CurJob != null && (s.CurJob is LineToLiftJob));
if (agvInfo != null)
{
return true;
......
......@@ -2,6 +2,7 @@
using DeviceLibrary.bean.job;
using DeviceLibrary.lift;
using DeviceLibrary.manager;
using DeviceLibrary.service.model;
using System;
using System.Collections.Generic;
using System.Linq;
......@@ -38,22 +39,29 @@ namespace DeviceLibrary.bean.jobType
Common.LogUtil.error($"无法生成任务,电梯不存在:{missionInfo.liftName}");
return null;
}
if (TargetIsOccupied(agv, missionInfo.liftName))
{
return null;
}
//if (TargetIsOccupied(agv, missionInfo.liftName))
//{
// return null;
//}
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
MissionManager.SetMissionOccupied(missionInfo, agv);
MissionManager.Log.Info($"执行任务[{agv.Name}][ShelfBuffToLiftJobType]{JsonHelper.SerializeObject(missionInfo)}");
//任务状态变更
//MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.已分配, out string msg);
return new LineToLiftJob(jobParam);
if (missionInfo.projectType.Equals(ProjectType.移远成品入库))
{
jobParam.CurTargetNode = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
F1LiftC1ToLiftD2Job job = new F1LiftC1ToLiftD2Job(jobParam);
job.JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_Buff);
return job;
}
else
return new LineToLiftJob(jobParam);
}
return null;
}
bool CheckHasSameJob(AgvInfo agv, string liftname)
{
return false;
try
{
if (agv.Scope.Workshop.Equals("1F"))
......
......@@ -265,12 +265,13 @@ namespace DeviceLibrary.manager
MissionInfo missionInfo = null;
try
{
if (!agv.Scope.Workshop.Equals("1F")) return null;
var missions = GetMissionInfos().Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) && !s.sourceWorkshop.Equals(s.destinationWorkshop) &&
s.state.Equals(MissionState.料架缓存) &&
agv.Scope.Tasks.Contains(s.projectType.ToString()));
missionInfo = missions.Find(s => (s.state.Equals(MissionState.料架缓存) &&
agv.Scope.Tasks.Contains(s.projectType.ToString())
));
if (missionInfo != null && AgvCanGetMission(missionInfo))
return missionInfo;
......@@ -506,6 +507,11 @@ namespace DeviceLibrary.manager
SetMissionOccupiedAgv(missionInfo.missionId, agv.Name);
MissionChangedEvent?.Invoke();
}
public static void SetMissionOccupied(string missionId, AgvInfo agv)
{
SetMissionOccupiedAgv(missionId, agv.Name);
MissionChangedEvent?.Invoke();
}
/// <summary>
/// 设置任务状态
/// </summary>
......
......@@ -8,6 +8,9 @@ using DeviceLibrary.manager;
using System.Windows.Forms;
using System.Drawing;
using static DeviceLibrary.Node;
using System.Runtime.CompilerServices;
using static System.Net.Mime.MediaTypeNames;
using System.Runtime.ConstrainedExecution;
namespace DeviceLibrary.manager
{
......@@ -20,6 +23,7 @@ namespace DeviceLibrary.manager
public static void InitNodesInfos()
{
InitLinesInAirShower();
nodeInfo = new List<Node>();
XmlConfigOperation.LoadNodeInfos(nodeInfo);
WriteAllNodeInfos();
......@@ -32,7 +36,7 @@ namespace DeviceLibrary.manager
XmlConfigOperation.LoadNodeInfos(nodes);
nodeInfo = nodes;
}
catch(Exception ex)
catch (Exception ex)
{
MessageBox.Show("重载节点失败:" + ex.StackTrace, "提示");
}
......@@ -49,7 +53,8 @@ namespace DeviceLibrary.manager
DgvNode.AutoGenerateColumns = false;
DgvNode.AutoSize = true;
DgvNode.DataSource = bindingSource;
DgvNode.RowPostPaint += delegate {
DgvNode.RowPostPaint += delegate
{
DgvNode.RowsDefaultCellStyle.BackColor = Color.White;
DgvNode.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue;
};
......@@ -88,7 +93,7 @@ namespace DeviceLibrary.manager
//}
}
public static void UpdateDataSource(DataGridView dataGridView,int curRow=0,int curColum=0)
public static void UpdateDataSource(DataGridView dataGridView, int curRow = 0, int curColum = 0)
{
BindingSource bindingSource = new BindingSource();
foreach (Node node in NodeManager.nodeInfo)
......@@ -98,8 +103,8 @@ namespace DeviceLibrary.manager
bindingSource.Add(node);
}
dataGridView.DataSource = bindingSource;
if(dataGridView.Rows.Count>=curRow
&& dataGridView.Columns.Count>=curColum)
if (dataGridView.Rows.Count >= curRow
&& dataGridView.Columns.Count >= curColum)
{
dataGridView.CurrentCell = dataGridView.Rows[curRow].Cells[curColum]; ;
}
......@@ -129,10 +134,10 @@ namespace DeviceLibrary.manager
else
return true;
}
public static bool CheckNodes(string nodenames,out string names)
public static bool CheckNodes(string nodenames, out string names)
{
string[] nodes = nodenames.Split(',');
names = "";
names = "";
foreach (string item in nodes)
{
Node node = nodeInfo.Find(s => s.Name.Equals(item));
......@@ -193,5 +198,110 @@ namespace DeviceLibrary.manager
// LogUtil.info(item.ToString());
//}
}
#region 跨门 跨风淋门
/// <summary>
/// 风淋门内的线体
/// key:车间名
/// val:线体名
/// </summary>
static Dictionary<string, List<string>> linesInAirShower = new Dictionary<string, List<string>>();
static void InitLinesInAirShower()
{
//添加3D的
linesInAirShower.Add("3D", new List<string>() { "S1Tail" });
//添加4C的
linesInAirShower.Add("4C", new List<string>() { "C14Tail", "C15Tail" });
}
/// <summary>
/// 检查是否需要跨门
/// </summary>
/// <param name="cur"></param>
/// <param name="next"></param>
/// <returns></returns>
public static bool NeedCrossDoor(AgvInfo agv, Node cur, Node next, out bool isIn, out bool isAirDoor)
{
isIn = true;
isAirDoor = false;
if (agv.Scope.Workshop.Equals("1F")) return false;
return false;
try
{
if (cur == null) cur = agv.Place;
if (next == null) next = agv.Place;
if (!cur.Workshop.Equals(next.Workshop))
{
if (cur.Equals("4D") && next.Workshop.Equals("4C"))
{
return true;
}
else if (cur.Workshop.Equals("4C") && next.Workshop.Equals("4D"))
{
isIn = false;
return true;
}
}
else//在相同车间
{
if (linesInAirShower.ContainsKey(cur.Workshop))//当前点在风淋门内
{
if (linesInAirShower.ContainsKey(next.Workshop))//目标点在风淋门内
{
return false;
}
else//目标点在风淋门外
{
isAirDoor = true;
isIn = false;
return true;
}
}
else//当前点在风淋门外
{
if (linesInAirShower.ContainsKey(next.Workshop))//目标点在风淋门内
{
isAirDoor = true;
return true;
}
else//目标点在风淋门外
{
return false;
}
}
}
}
catch (Exception ex)
{
LogUtil.error("NeedCrossDoor", ex);
}
return false;
}
/// <summary>
/// 是否需要跨两个门
/// </summary>
/// <param name="agv"></param>
/// <param name="node"></param>
/// <returns></returns>
public static bool NeedCrossTwoDoor(AgvInfo agv, Node src, Node dst)
{
if (agv.Scope.Workshop.Equals("1F")) return false;
return false;
try
{
if (src == null) src = agv.Place;
if (dst == null) dst = agv.Place;
if (!src.Workshop.Equals(dst.Workshop) && linesInAirShower.ContainsKey(dst.Workshop))
{
return true;
}
}
catch (Exception ex)
{
LogUtil.error("NeedCrossDoor", ex);
}
return false;
}
#endregion
}
}
......@@ -40,7 +40,7 @@ namespace DeviceLibrary
if (projectType > 16)
{
result.code = -1;
result.msg = $"不存在的任务类型:{createMissionInfo.sourcePoint}";
result.msg = $"创建任务失败,不存在的任务类型,请确认编号规则:{createMissionInfo.missionId}";
Log.Error(result.msg);
}
if (!NodeManager.CheckNode(createMissionInfo.sourcePoint))
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!