Commit ab1c3da7 张东亮

合并

2 个父辈 1947a66c 8b6e4812
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
this.txtShow = new System.Windows.Forms.TextBox(); this.txtShow = new System.Windows.Forms.TextBox();
this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.textBox1 = new System.Windows.Forms.TextBox();
this.tableLayoutPanel3.SuspendLayout(); this.tableLayoutPanel3.SuspendLayout();
this.tabControl1.SuspendLayout(); this.tabControl1.SuspendLayout();
this.tabPage2.SuspendLayout(); this.tabPage2.SuspendLayout();
...@@ -358,6 +359,7 @@ ...@@ -358,6 +359,7 @@
// //
// tabPage5 // tabPage5
// //
this.tabPage5.Controls.Add(this.textBox1);
this.tabPage5.Controls.Add(this.txtShow); this.tabPage5.Controls.Add(this.txtShow);
this.tabPage5.Location = new System.Drawing.Point(4, 25); this.tabPage5.Location = new System.Drawing.Point(4, 25);
this.tabPage5.Margin = new System.Windows.Forms.Padding(4); this.tabPage5.Margin = new System.Windows.Forms.Padding(4);
...@@ -369,12 +371,12 @@ ...@@ -369,12 +371,12 @@
// //
// txtShow // txtShow
// //
this.txtShow.Dock = System.Windows.Forms.DockStyle.Fill; this.txtShow.Dock = System.Windows.Forms.DockStyle.Top;
this.txtShow.Location = new System.Drawing.Point(0, 0); this.txtShow.Location = new System.Drawing.Point(0, 0);
this.txtShow.Margin = new System.Windows.Forms.Padding(4); this.txtShow.Margin = new System.Windows.Forms.Padding(4);
this.txtShow.Multiline = true; this.txtShow.Multiline = true;
this.txtShow.Name = "txtShow"; this.txtShow.Name = "txtShow";
this.txtShow.Size = new System.Drawing.Size(1696, 356); this.txtShow.Size = new System.Drawing.Size(1696, 199);
this.txtShow.TabIndex = 0; this.txtShow.TabIndex = 0;
// //
// tableLayoutPanel4 // tableLayoutPanel4
...@@ -402,6 +404,16 @@ ...@@ -402,6 +404,16 @@
this.flowLayoutPanel1.Size = new System.Drawing.Size(1698, 506); this.flowLayoutPanel1.Size = new System.Drawing.Size(1698, 506);
this.flowLayoutPanel1.TabIndex = 0; this.flowLayoutPanel1.TabIndex = 0;
// //
// textBox1
//
this.textBox1.Dock = System.Windows.Forms.DockStyle.Top;
this.textBox1.Location = new System.Drawing.Point(0, 199);
this.textBox1.Margin = new System.Windows.Forms.Padding(4);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(1696, 151);
this.textBox1.TabIndex = 1;
//
// FrmMain // FrmMain
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
...@@ -463,6 +475,7 @@ ...@@ -463,6 +475,7 @@
private System.Windows.Forms.TextBox txtShow; private System.Windows.Forms.TextBox txtShow;
private System.Windows.Forms.CheckBox checkBox1; private System.Windows.Forms.CheckBox checkBox1;
private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;
} }
} }
...@@ -12,6 +12,7 @@ using System.Threading.Tasks; ...@@ -12,6 +12,7 @@ using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using Common; using Common;
using DeviceLibrary; using DeviceLibrary;
using DeviceLibrary.lift;
using DeviceLibrary.manager; using DeviceLibrary.manager;
using DeviceLibrary.service.model; using DeviceLibrary.service.model;
...@@ -157,6 +158,12 @@ namespace AGVControl ...@@ -157,6 +158,12 @@ namespace AGVControl
Invoke(new Action(() => Invoke(new Action(() =>
{ {
txtShow.Text = DeviceLibrary.HttpManager.Agvtransinfo; txtShow.Text = DeviceLibrary.HttpManager.Agvtransinfo;
try
{
textBox1.Text = LiftContext.GetLiftNodeOccupiedInfo();
}
catch { }
})); }));
...@@ -230,7 +237,7 @@ namespace AGVControl ...@@ -230,7 +237,7 @@ namespace AGVControl
private void dgvInfos_DataError(object sender, DataGridViewDataErrorEventArgs e) private void dgvInfos_DataError(object sender, DataGridViewDataErrorEventArgs e)
{ {
LogUtil.error($"表格式异常:{e.RowIndex},{e.ColumnIndex},{e.Exception.Message}");
} }
private void dgvInfos_CellContentClick(object sender, DataGridViewCellEventArgs e) private void dgvInfos_CellContentClick(object sender, DataGridViewCellEventArgs e)
......
...@@ -94,6 +94,7 @@ namespace AGVControl ...@@ -94,6 +94,7 @@ namespace AGVControl
{ {
Agv.Auto = false; Agv.Auto = false;
LiftContext.ResetLiftOccupiedAgv(Agv); LiftContext.ResetLiftOccupiedAgv(Agv);
LiftContext.SetLiftNodeOccupied(Agv);
ChargePileManager.StopCharge(Agv); ChargePileManager.StopCharge(Agv);
LogUtil.info($"取消自动任务,当前运行信息是:{Agv.Msg}"); LogUtil.info($"取消自动任务,当前运行信息是:{Agv.Msg}");
try try
......
...@@ -31,6 +31,18 @@ namespace Common ...@@ -31,6 +31,18 @@ namespace Common
public const string LIFT_D2 = "LIFT_D2"; public const string LIFT_D2 = "LIFT_D2";
public const string LIFT_C1 = "LIFT_C1"; public const string LIFT_C1 = "LIFT_C1";
public const string storage = "storage"; 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 Wait = "Wait";
public const string Done = "Done"; public const string Done = "Done";
...@@ -70,6 +82,9 @@ namespace Common ...@@ -70,6 +82,9 @@ namespace Common
public const string Lift_Names = "Lift_Names"; public const string Lift_Names = "Lift_Names";
public const string IsDebug = "IsDebug"; public const string IsDebug = "IsDebug";
#endregion #endregion
#region 点位
public const string ShelfBuff = "ShelfBuff";
#endregion
} }
} }
...@@ -142,7 +142,7 @@ namespace Common ...@@ -142,7 +142,7 @@ namespace Common
} }
catch (Exception e) catch (Exception e)
{ {
LogUtil.error("POST ERROR:" + url, e); LogUtil.error($"POST ERROR:【{url}】【{paramData}】",e);
} }
if (!result.Contains("null") && result.Length != 0) if (!result.Contains("null") && result.Length != 0)
{ {
...@@ -180,7 +180,7 @@ namespace Common ...@@ -180,7 +180,7 @@ namespace Common
} }
catch (Exception e) catch (Exception e)
{ {
LogUtil.error("POST ERROR:" + e.ToString()); LogUtil.error($"POST ERROR:【{url}】【{paramData}】", e);
} }
return result; return result;
} }
......
...@@ -30,7 +30,7 @@ namespace DeviceLibrary ...@@ -30,7 +30,7 @@ namespace DeviceLibrary
{ {
AgvCallTimer = new System.Timers.Timer AgvCallTimer = new System.Timers.Timer
{ {
Interval = 300, Interval = 500,
AutoReset = true, AutoReset = true,
Enabled = false Enabled = false
}; };
...@@ -38,7 +38,7 @@ namespace DeviceLibrary ...@@ -38,7 +38,7 @@ namespace DeviceLibrary
AgvStateTimer = new System.Timers.Timer AgvStateTimer = new System.Timers.Timer
{ {
Interval = 5000, Interval = 3000,
AutoReset = true, AutoReset = true,
Enabled = false Enabled = false
}; };
...@@ -181,7 +181,6 @@ namespace DeviceLibrary ...@@ -181,7 +181,6 @@ namespace DeviceLibrary
return null; return null;
if (job != null) if (job != null)
{ {
//log.Debug(agv_Info.Name + " GetJob OK " + job.ToString());
return job; return job;
} }
} }
...@@ -214,7 +213,6 @@ namespace DeviceLibrary ...@@ -214,7 +213,6 @@ namespace DeviceLibrary
if (!AGVManager.agvInfo[i].StateID.Equals(eAGVState.Ready) if (!AGVManager.agvInfo[i].StateID.Equals(eAGVState.Ready)
&& !AGVManager.agvInfo[i].StateID.Equals(eAGVState.Executing) && !AGVManager.agvInfo[i].StateID.Equals(eAGVState.None)) && !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; continue;
} }
if (agv.TaskRunState.DeWaitTaskQueue(out AgvTask task)) if (agv.TaskRunState.DeWaitTaskQueue(out AgvTask task))
......
...@@ -87,6 +87,7 @@ ...@@ -87,6 +87,7 @@
<Compile Include="bean\agv\Mir_Error.cs" /> <Compile Include="bean\agv\Mir_Error.cs" />
<Compile Include="bean\agv\Scope.cs" /> <Compile Include="bean\agv\Scope.cs" />
<Compile Include="bean\ChargePiles.cs" /> <Compile Include="bean\ChargePiles.cs" />
<Compile Include="bean\jobType\ShelfBuffToLiftJobType.cs" />
<Compile Include="bean\jobType\SteelLiftToLinesJobType.cs" /> <Compile Include="bean\jobType\SteelLiftToLinesJobType.cs" />
<Compile Include="bean\jobType\F1LiftC1ToLiftD2JobType.cs" /> <Compile Include="bean\jobType\F1LiftC1ToLiftD2JobType.cs" />
<Compile Include="bean\jobType\F1LiftD2ToLiftC1JobType.cs" /> <Compile Include="bean\jobType\F1LiftD2ToLiftC1JobType.cs" />
...@@ -97,6 +98,7 @@ ...@@ -97,6 +98,7 @@
<Compile Include="bean\job\ChargeJob.cs" /> <Compile Include="bean\job\ChargeJob.cs" />
<Compile Include="bean\job\F1LiftC1ToLiftD2Job.cs" /> <Compile Include="bean\job\F1LiftC1ToLiftD2Job.cs" />
<Compile Include="bean\job\F1LiftD2ToLiftC1Job.cs" /> <Compile Include="bean\job\F1LiftD2ToLiftC1Job.cs" />
<Compile Include="bean\job\CrossDoorJob.cs" />
<Compile Include="bean\job\SteelLiftToStorageJob.cs" /> <Compile Include="bean\job\SteelLiftToStorageJob.cs" />
<Compile Include="bean\job\SteelLiftToLinesJob.cs" /> <Compile Include="bean\job\SteelLiftToLinesJob.cs" />
<Compile Include="bean\job\LineOneToManyJob.cs" /> <Compile Include="bean\job\LineOneToManyJob.cs" />
...@@ -108,6 +110,7 @@ ...@@ -108,6 +110,7 @@
<Compile Include="bean\JobParam.cs" /> <Compile Include="bean\JobParam.cs" />
<Compile Include="bean\jobType\BackLiftToLineJobType.cs" /> <Compile Include="bean\jobType\BackLiftToLineJobType.cs" />
<Compile Include="bean\jobType\LineToLiftJobType.cs" /> <Compile Include="bean\jobType\LineToLiftJobType.cs" />
<Compile Include="bean\job\SwitchShelfJob.cs" />
<Compile Include="bean\TaskRunState.cs" /> <Compile Include="bean\TaskRunState.cs" />
<Compile Include="bean\jobType\LiftToLinesJobType.cs" /> <Compile Include="bean\jobType\LiftToLinesJobType.cs" />
<Compile Include="bean\job\StandyJob.cs" /> <Compile Include="bean\job\StandyJob.cs" />
......
using Common; using Common;
using DeviceLibrary.lift;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web.UI.WebControls.WebParts;
namespace DeviceLibrary.bean namespace DeviceLibrary.bean
{ {
...@@ -16,7 +18,10 @@ namespace DeviceLibrary.bean ...@@ -16,7 +18,10 @@ namespace DeviceLibrary.bean
/// 初始地点 /// 初始地点
/// </summary> /// </summary>
public Node SrcNode { get; set; } public Node SrcNode { get; set; }
/// <summary>
/// 过门信息
/// </summary>
public CrossDoor CrossDoor { get; set; } = new CrossDoor();
private service.model.MissionInfo missionInfo; private service.model.MissionInfo missionInfo;
/// <summary> /// <summary>
...@@ -26,7 +31,10 @@ namespace DeviceLibrary.bean ...@@ -26,7 +31,10 @@ namespace DeviceLibrary.bean
{ {
return missionInfo; return missionInfo;
} }
/// <summary>
/// 电梯内的料架信息
/// </summary>
public LiftStatus LiftStatus;
/// <summary> /// <summary>
/// 任务信息 /// 任务信息
/// </summary> /// </summary>
...@@ -51,6 +59,10 @@ namespace DeviceLibrary.bean ...@@ -51,6 +59,10 @@ namespace DeviceLibrary.bean
/// </summary> /// </summary>
public Shelf Shelf { get; set; } public Shelf Shelf { get; set; }
public OpType OpType { get; set; } = OpType.ComToLine; public OpType OpType { get; set; } = OpType.ComToLine;
/// <summary>
/// 回调Job
/// </summary>
public JobCallBack CallbackJob;
public JobParam(Node srcplace, Node tarplace =null,Shelf shelf=null, service.model.MissionInfo MissionInfo =null) public JobParam(Node srcplace, Node tarplace =null,Shelf shelf=null, service.model.MissionInfo MissionInfo =null)
{ {
SrcNode = srcplace; SrcNode = srcplace;
...@@ -58,6 +70,7 @@ namespace DeviceLibrary.bean ...@@ -58,6 +70,7 @@ namespace DeviceLibrary.bean
Shelf = shelf; Shelf = shelf;
this.missionInfo = MissionInfo; this.missionInfo = MissionInfo;
TargetNodes = new List<Node>(); TargetNodes = new List<Node>();
CrossDoor = new CrossDoor();
} }
} }
/// <summary> /// <summary>
...@@ -82,4 +95,35 @@ namespace DeviceLibrary.bean ...@@ -82,4 +95,35 @@ namespace DeviceLibrary.bean
/// </summary> /// </summary>
MaulAndAPI, MaulAndAPI,
} }
public class JobCallBack
{
public Type Type { get; set; }
public Job Job { get; set; }
public RunStep RunStep { get; set; }
public JobCallBack(Type type, RunStep step)
{
this.Type = type;
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;
}
} }
...@@ -34,6 +34,7 @@ namespace DeviceLibrary.bean ...@@ -34,6 +34,7 @@ namespace DeviceLibrary.bean
#endregion #endregion
#region 料架返回 电梯到线体 #region 料架返回 电梯到线体
ShelfBack_LiftToStore_01_ToStandby,
/// <summary> /// <summary>
/// 去电梯口 /// 去电梯口
/// </summary> /// </summary>
...@@ -58,6 +59,7 @@ namespace DeviceLibrary.bean ...@@ -58,6 +59,7 @@ namespace DeviceLibrary.bean
/// 关闭电梯门 /// 关闭电梯门
/// </summary> /// </summary>
ShelfBack_LiftToStore_05_CloseLiftDoor, ShelfBack_LiftToStore_05_CloseLiftDoor,
ShelfBack_LiftToStore_06_CrossDoor,
/// <summary> /// <summary>
/// 去库房 /// 去库房
/// </summary> /// </summary>
...@@ -66,11 +68,14 @@ namespace DeviceLibrary.bean ...@@ -66,11 +68,14 @@ namespace DeviceLibrary.bean
/// 放下料车 /// 放下料车
/// </summary> /// </summary>
ShelfBack_LiftToStore_07_TakeShelfOff, ShelfBack_LiftToStore_07_TakeShelfOff,
ShelfBack_LiftToStore_07_CrossDoor,
#endregion #endregion
#region 线体到电梯 #region 线体到电梯
LineToLift_00_CrossDoor,
LineToLift_01_ToLine, LineToLift_01_ToLine,
LineToLift_02_PutShelfOn, LineToLift_02_PutShelfOn,
LineToLift_02_CrossDoor,
LineToLift_ToSteelSrc, LineToLift_ToSteelSrc,
LineToLift_PlaySound, LineToLift_PlaySound,
LineToLift_WaitConfirm, LineToLift_WaitConfirm,
...@@ -103,6 +108,8 @@ namespace DeviceLibrary.bean ...@@ -103,6 +108,8 @@ namespace DeviceLibrary.bean
LineToLift_05_10_ToTemp1, LineToLift_05_10_ToTemp1,
LineToLift_05_11_PutTemp1ShelfOn, LineToLift_05_11_PutTemp1ShelfOn,
LineToLift_05_12_ToLift, LineToLift_05_12_ToLift,
LineToLift_05_13_ToShelfPlace,
LineToLift_05_14_TakeShelfOff,
#endregion #endregion
#region 电梯内无料车 #region 电梯内无料车
...@@ -114,6 +121,7 @@ namespace DeviceLibrary.bean ...@@ -114,6 +121,7 @@ namespace DeviceLibrary.bean
#endregion #endregion
#region 电梯到线体 产品分发 最后空料料架返回 #region 电梯到线体 产品分发 最后空料料架返回
SD_LiftToLine_00_ToStandby,
/// <summary> /// <summary>
/// 去电梯口 /// 去电梯口
/// </summary> /// </summary>
...@@ -142,6 +150,8 @@ namespace DeviceLibrary.bean ...@@ -142,6 +150,8 @@ namespace DeviceLibrary.bean
/// 去线体 /// 去线体
/// </summary> /// </summary>
SD_LiftToLine_07_ToLine, SD_LiftToLine_07_ToLine,
SD_LiftToLine_07_CrossDoor,
SD_LiftToLine_07_CrossTwoDoor,
/// <summary> /// <summary>
/// 到达线体,上报位置 /// 到达线体,上报位置
/// </summary> /// </summary>
...@@ -159,6 +169,8 @@ namespace DeviceLibrary.bean ...@@ -159,6 +169,8 @@ namespace DeviceLibrary.bean
/// </summary> /// </summary>
SD_LiftToLine_11_BackToLift, SD_LiftToLine_11_BackToLift,
SD_LiftToLine_11_ToStandby, SD_LiftToLine_11_ToStandby,
SD_LiftToLine_11_CrossTwoDoor,
SD_LiftToLine_11_CrossTDoor,
/// <summary> /// <summary>
/// 等待电梯门开启 /// 等待电梯门开启
/// </summary> /// </summary>
...@@ -194,6 +206,8 @@ namespace DeviceLibrary.bean ...@@ -194,6 +206,8 @@ namespace DeviceLibrary.bean
/// 料车无需返回,直接结束 /// 料车无需返回,直接结束
/// </summary> /// </summary>
SD_LiftToLine_16_TakeShelfOff, SD_LiftToLine_16_TakeShelfOff,
SD_LiftToLine_16_CrossTwoDoor,
SD_LiftToLine_16_CrossTDoor,
SD_LiftToLine_17_Dock, SD_LiftToLine_17_Dock,
SD_LiftToLine_18_CheckState, SD_LiftToLine_18_CheckState,
SD_LiftToLine_19_TakeOff, SD_LiftToLine_19_TakeOff,
...@@ -363,6 +377,7 @@ namespace DeviceLibrary.bean ...@@ -363,6 +377,7 @@ namespace DeviceLibrary.bean
#endregion #endregion
#region 1F 成品空料架从D2C1 #region 1F 成品空料架从D2C1
S1F_LiftD2ToLiftC1_00_ToStandby,
/// <summary> /// <summary>
/// 去电梯口 /// 去电梯口
/// </summary> /// </summary>
...@@ -387,6 +402,7 @@ namespace DeviceLibrary.bean ...@@ -387,6 +402,7 @@ namespace DeviceLibrary.bean
/// 关闭电梯门 /// 关闭电梯门
/// </summary> /// </summary>
S1F_LiftD2ToLiftC1_06_CloseLiftDoor, S1F_LiftD2ToLiftC1_06_CloseLiftDoor,
S1F_LiftD2ToLiftC1_07_ToStandby,
S1F_LiftD2ToLiftC1_07_ToLiftC1, S1F_LiftD2ToLiftC1_07_ToLiftC1,
S1F_LiftD2ToLiftC1_08_CheckC1Status, S1F_LiftD2ToLiftC1_08_CheckC1Status,
...@@ -412,6 +428,7 @@ namespace DeviceLibrary.bean ...@@ -412,6 +428,7 @@ namespace DeviceLibrary.bean
S1F_LiftD2ToLiftC1_19_03_ToTemp1, S1F_LiftD2ToLiftC1_19_03_ToTemp1,
S1F_LiftD2ToLiftC1_19_04_PutTemp1ShelfOn, S1F_LiftD2ToLiftC1_19_04_PutTemp1ShelfOn,
S1F_LiftD2ToLiftC1_19_05_ToLift, S1F_LiftD2ToLiftC1_19_05_ToLift,
S1F_LiftD2ToLiftC1_19_05_ToStandby,
#endregion #endregion
#region 空成品料车 #region 空成品料车
...@@ -434,6 +451,10 @@ namespace DeviceLibrary.bean ...@@ -434,6 +451,10 @@ namespace DeviceLibrary.bean
#endregion #endregion
#region 1F 成品入库从C1D2 #region 1F 成品入库从C1D2
S1F_LiftC1ToLiftD2_Buff,
S1F_LiftC1ToLiftD2_ToLine,
S1F_LiftC1ToLiftD2_PutShelf,
S1F_LiftC1ToLiftD2_00_ToStandby,
/// <summary> /// <summary>
/// 去电梯口 /// 去电梯口
/// </summary> /// </summary>
...@@ -459,6 +480,7 @@ namespace DeviceLibrary.bean ...@@ -459,6 +480,7 @@ namespace DeviceLibrary.bean
/// </summary> /// </summary>
S1F_LiftC1ToLiftD2_06_CloseLiftDoor, S1F_LiftC1ToLiftD2_06_CloseLiftDoor,
S1F_LiftC1ToLiftD2_07_ToLiftD2, S1F_LiftC1ToLiftD2_07_ToLiftD2,
S1F_LiftC1ToLiftD2_ToStandby,
S1F_LiftC1ToLiftD2_08_CheckD2Status, S1F_LiftC1ToLiftD2_08_CheckD2Status,
#region 电梯内无料车 #region 电梯内无料车
...@@ -467,9 +489,9 @@ namespace DeviceLibrary.bean ...@@ -467,9 +489,9 @@ namespace DeviceLibrary.bean
S1F_LiftC1ToLiftD2_11_LeaveLift, S1F_LiftC1ToLiftD2_11_LeaveLift,
#endregion #endregion
#region 电梯内有料车 #region 电梯内有料车
S1F_LiftC1ToLiftD2_12_ToTemp1,
S1F_LiftC1ToLiftD2_12_ToStandby, S1F_LiftC1ToLiftD2_12_ToStandby,
S1F_LiftC1ToLiftD2_13_TakeShelfOffAtTemp1, S1F_LiftC1ToLiftD2_13_ToShelfBuff,
S1F_LiftC1ToLiftD2_14_TakeShelfOff,
S1F_LiftC1ToLiftD2_14_ToLift, S1F_LiftC1ToLiftD2_14_ToLift,
S1F_LiftC1ToLiftD2_15_EnterLift, S1F_LiftC1ToLiftD2_15_EnterLift,
S1F_LiftC1ToLiftD2_16_PutShelfOn, S1F_LiftC1ToLiftD2_16_PutShelfOn,
...@@ -504,6 +526,96 @@ namespace DeviceLibrary.bean ...@@ -504,6 +526,96 @@ namespace DeviceLibrary.bean
#endregion #endregion
#region 电梯口料架交换
/// <summary>
/// 料架交换:去临时点1
/// </summary>
Switch_01_ToTmp1,
/// <summary>
/// 料架交换:在临时点1卸下料架
/// </summary>
Switch_02_TakeShelfOffAtTmp1,
/// <summary>
/// 料架交换:去电梯
/// </summary>
Switch_03_ToLift,
/// <summary>
/// 料架交换:进入电梯
/// </summary>
Switch_04_EnterLift,
/// <summary>
/// 料架交换:拾取电梯内的料架
/// </summary>
Switch_05_PutLiftShelfOn,
/// <summary>
/// 料架交换:离开电梯
/// </summary>
Switch_06_LeaveLift,
/// <summary>
/// 料架交换:去临时点2
/// </summary>
Switch_07_ToTmp2,
/// <summary>
/// 料架交换:在临时点2卸下料车
/// </summary>
Switch_08_TakeShelfOffAtTpm2,
/// <summary>
/// 料架交换:去临时点1
/// </summary>
Switch_09_ReToTmp1,
/// <summary>
/// 料架交换:在临时点1拾取料架
/// </summary>
Switch_10_PutShelfOnAtTmp1,
/// <summary>
/// 料架交换:去电梯
/// </summary>
Switch_11_ToLift,
/// <summary>
/// 料架交换:进入电梯
/// </summary>
Switch_12_EnterLift,
/// <summary>
/// 料架交换:在电梯放下料车
/// </summary>
Switch_13_TakeLiftShelfOff,
/// <summary>
/// 料架交换:离开电梯
/// </summary>
Switch_14_LeaveLift,
/// <summary>
/// 料架交换:关门,并更新送料信息
/// </summary>
Switch_15_CloseDoor,
Switch_15_WaitDoorClose,
/// <summary>
/// 料架交换:去临时点2
/// </summary>
Switch_16_ReToTmp2,
/// <summary>
/// 料架交换:在临时点2拾取料架
/// </summary>
Switch_17_PutShelfOnAtTmp2,
/// <summary>
/// 根据当前状态送料
/// </summary>
Switch_18_SendShelf,
/// <summary>
/// 根据当前状态返还料架
/// </summary>
Switch_19_ReturnShelf,
#endregion
#region 过门任务
CrossDoor_01_ToCurDoor,
CrossDoor_02_OpenCurDoor,
CrossDoor_03_Enter,
CrossDoor_04_CloseCurDoor,
CrossDoor_05_OpenAntherDoor,
CrossDoor_06_LeaveDoor,
CrossDoor_07_CloseAntherDoor,
CrossDoor_08_Finish,
#endregion
/// <summary> /// <summary>
/// 结束 /// 结束
/// </summary> /// </summary>
......
...@@ -24,17 +24,17 @@ namespace DeviceLibrary ...@@ -24,17 +24,17 @@ namespace DeviceLibrary
/// <param name="agv"></param> /// <param name="agv"></param>
public override Job Run(AgvInfo agv) public override Job Run(AgvInfo agv)
{ {
agv.SetJobContext(new bean.agv.JobContext() //agv.SetJobContext(new bean.agv.JobContext()
{ //{
AgvTask = agv.TaskRunState.Task, // AgvTask = agv.TaskRunState.Task,
JobFullName = this.ToString(), // JobFullName = this.ToString(),
JobStep = JobRunStep.PreStep(), // JobStep = JobRunStep.PreStep(),
Name = agv.Name, // Name = agv.Name,
JobParam = JobParam // JobParam = JobParam
}) ; //}) ;
if (JobRunStep.IsStep(RunStep.NONE)) if (JobRunStep.IsStep(RunStep.NONE))
{ {
ClearLiftNodeOccupied(agv);
if (!ChargePileManager.HasEmpty(agv, out ChargePile charge)) if (!ChargePileManager.HasEmpty(agv, out ChargePile charge))
{ {
runInfo = $"无空闲充电桩,从" + JobParam.SrcNode + "回到待机位"; runInfo = $"无空闲充电桩,从" + JobParam.SrcNode + "回到待机位";
......
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.manager;
using System.Text;
namespace DeviceLibrary
{
/// <summary>
/// 过门任务
/// </summary>
public class CrossDoorJob : Job
{
/// <summary>
/// 待机任务
/// </summary>
/// <param name="agvPlae"></param>
public CrossDoorJob(JobParam jobParam) : base(jobParam)
{
JobName = "过门任务";
}
public CrossDoorJob() : base()
{
JobName = "过门任务";
}
/// <summary>
/// 过门任务
/// </summary>
/// <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
});
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.CrossDoor_02_OpenCurDoor);
runInfo = $"到达{JobParam.CrossDoor.CurNode.AliceName}侧门前,开门";
JobRunStep.Msg = runInfo;
openCurDoor(agv);
}
}
else if (JobRunStep.IsStep(RunStep.CrossDoor_02_OpenCurDoor))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.CrossDoor_03_Enter);
runInfo = $"从{JobParam.CrossDoor.CurNode.AliceName}侧进门";
JobRunStep.Msg = runInfo;
enterDoor(agv);
}
}
else if (JobRunStep.IsStep(RunStep.CrossDoor_03_Enter))
{
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风淋门内
/// <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));
}
}
}
using Common; using Common;
using DeviceLibrary.lift; using DeviceLibrary.lift;
using DeviceLibrary.manager; using DeviceLibrary.manager;
using DeviceLibrary.service.model;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
using System.Threading; using System.Threading;
...@@ -21,24 +23,89 @@ namespace DeviceLibrary.bean.job ...@@ -21,24 +23,89 @@ namespace DeviceLibrary.bean.job
{ {
} }
lift.LiftStatus liftStatus;
public override Job Run(AgvInfo agv) public override Job Run(AgvInfo agv)
{ {
agv.SetJobContext(new bean.agv.JobContext() Job job = this;
agv.SetJobContext(new agv.JobContext()
{ {
MissionId = JobParam.GetMissionInfo().missionId, MissionId = JobParam.GetMissionInfo().missionId,
AgvTask = agv.TaskRunState.Task, AgvTask = agv.TaskRunState.Task,
JobFullName = this.ToString(), JobFullName = ToString(),
JobStep = JobRunStep.PreStep(), JobStep = JobRunStep.PreStep(),
Name = agv.Name, Name = agv.Name,
JobParam = JobParam JobParam = JobParam
}); });
if (JobRunStep.IsStep(RunStep.NONE)) if (JobRunStep.IsStep(RunStep.NONE))
{ {
if(TargetIsOccupied(agv, JobParam.SrcNode.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_00_ToStandby);
runInfo = $"已有小车在{JobParam.SrcNode.AliceName},先去待机点";
JobRunStep.Msg = runInfo;
ToStandby(agv);
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_01_ToLiftC1); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_01_ToLiftC1);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}"; runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.SrcNode.Name}"); ToLift(agv, JobParam.SrcNode.Name);
}
}
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))
{
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_01_ToLiftC1);
runInfo = $"已空闲,去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo;
ToLift(agv, JobParam.SrcNode.Name);
}
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_01_ToLiftC1)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_01_ToLiftC1))
{ {
...@@ -46,7 +113,7 @@ namespace DeviceLibrary.bean.job ...@@ -46,7 +113,7 @@ namespace DeviceLibrary.bean.job
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_02_WaitDoorOpen); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_02_WaitDoorOpen);
//上报状态 //上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId, 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, service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{JobParam.SrcNode.Name}")); $"到达{JobParam.SrcNode.Name}"));
//lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, false, false); //lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, false, false);
...@@ -56,20 +123,20 @@ namespace DeviceLibrary.bean.job ...@@ -56,20 +123,20 @@ namespace DeviceLibrary.bean.job
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_02_WaitDoorOpen)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_02_WaitDoorOpen))
{ {
if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor)) if (LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_03_EnterLift); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_03_EnterLift);
runInfo = $"{JobParam.SrcNode.AliceName}门已开启,去取料点"; runInfo = $"{JobParam.SrcNode.AliceName}门已开启,去取料点";
//任务状态变更 //任务状态变更
SetLiftOccupied(JobParam.SrcNode.Name, agv); SetLiftOccupied(JobParam.SrcNode.Name, agv);
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}"); ToPutShelfOn(agv, $"{JobParam.SrcNode.Name}");
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.SrcNode.Name, JobParam.GetMissionInfo())) else if (JobRunStep.IsTimeOut(20) && !LiftContext.CheckIfRequestOk(JobParam.SrcNode.Name, JobParam.GetMissionInfo()))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_02_WaitDoorOpen); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_02_WaitDoorOpen);
//请求电梯 //请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true, true); LiftContext.Request(JobParam.GetMissionInfo(), agv, true, true);
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_03_EnterLift)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_03_EnterLift))
...@@ -90,12 +157,12 @@ namespace DeviceLibrary.bean.job ...@@ -90,12 +157,12 @@ namespace DeviceLibrary.bean.job
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_05_LeaveLift); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_05_LeaveLift);
//上报状态 //上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId, 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, service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"电梯取车")); $"电梯取车"));
runInfo = $"在{JobParam.SrcNode.AliceName}取料车完成,准备离开"; runInfo = $"在{JobParam.SrcNode.AliceName}取料车完成,准备离开";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}"); LeaveLift(agv, JobParam.SrcNode.Name);
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_05_LeaveLift)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_05_LeaveLift))
...@@ -104,108 +171,108 @@ namespace DeviceLibrary.bean.job ...@@ -104,108 +171,108 @@ namespace DeviceLibrary.bean.job
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_06_CloseLiftDoor); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_06_CloseLiftDoor);
//关门 //关门
bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv, false); bool rtn = LiftContext.AGVLeave(JobParam.SrcNode.Name, agv, false);
runInfo = $"离开{JobParam.SrcNode.AliceName},关闭电梯门:{rtn}"; runInfo = $"离开{JobParam.SrcNode.AliceName},关闭电梯门:{rtn}";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
ClearLiftNodeOccupied(agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_06_CloseLiftDoor)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_06_CloseLiftDoor))
{ {
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.SrcNode.AliceName}门完成,去{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_ToStandby))
{
if (TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_07_ToLiftD2); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_07_ToLiftD2);
runInfo = $"关闭{JobParam.SrcNode.AliceName}门完成,去{JobParam.CurTargetNode.AliceName}"; runInfo = $"关闭{JobParam.SrcNode.AliceName}门完成,去{JobParam.CurTargetNode.AliceName}";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.送料, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.送料, out string msg);
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}"); //AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
ToLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_07_ToLiftD2)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_07_ToLiftD2))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_08_CheckD2Status); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_08_CheckD2Status);
//上报状态 //上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId, 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, service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{JobParam.CurTargetNode.Name}")); $"到达{JobParam.CurTargetNode.Name}"));
runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯并等待开门"; runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯并等待开门";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
//开始请求电梯 //开始请求电梯
lift.LiftContext.FinishedRequest(JobParam.GetMissionInfo(), agv); LiftContext.FinishedRequest(JobParam.GetMissionInfo(), agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_08_CheckD2Status)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_08_CheckD2Status))
{ {
if (LiftContext.CheckHasEmptyFinished(agv, JobParam.CurTargetNode.Name, out liftStatus)) if (LiftContext.CheckHasEmptyFinished(agv, JobParam.CurTargetNode.Name, out JobParam.LiftStatus))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_12_ToTemp1);
SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有成品料车,去临时点1的卸料点,准备卸下车上料车";//
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
//service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
//if (missionInfo != null)
//{
// //任务状态变更
// MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.电梯到达, out string msg);
//}
JobRunStep.Msg = runInfo;
}
else if (lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo().destinationFloor))
{ {
//if (lift.LiftContext.HasFinishedShelfNeedLeave(SettingString.LIFT_C1, agv.Client, out liftStatus) && (liftStatus?.HasEmptyFinishedShelf ?? false)) MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId ?? "");
//{
// JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_12_ToTemp1);
// //SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
// runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有成品料车,去临时点1的卸料点";//准备卸下车上料车
// AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
// //service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
// //if (missionInfo != null)
// //{
// // //任务状态变更
// // MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.电梯到达, out string msg);
// //}
// JobRunStep.Msg = runInfo;
//}
//else
if (lift.LiftContext.HasShelfNeedLeaveFinished(JobParam.CurTargetNode.Name, agv.Client, out liftStatus))
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (IsBackShelf(missionInfo))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_12_ToTemp1);
// SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有料车,去临时点1的卸料点,准备卸下车上料车";//
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_13_ToShelfBuff);
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回电梯到达, out string msg); SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
} runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,内有成品空料车{JobParam?.LiftStatus?.missionId},去料架缓存点";//
ToTakeShelfOff(agv, SettingString.ShelfBuff);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
else else
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_12_ToStandby); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_12_ToStandby);
// SetLiftOccupied(JobParam.CurTargetNode.Name, agv); //设置电梯占用
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有送料的料车,去待机点等待电梯空闲";// //SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
AllocateStandbyTask(agv); runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,内有成品空料车但无工单信息,去待机点,需要手动清空电梯缓存并关闭电梯门";//
ToStandby(agv);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
else if (LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo().destinationFloor))
{
if (LiftContext.HasShelfNeedLeaveFinished(JobParam.CurTargetNode.Name, agv.Client, out JobParam.LiftStatus))
{
MissionManager.SetMissionOccupied(JobParam.GetMissionInfo().missionId, agv);
job = new SwitchShelfJob(JobParam);
}
else //if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name)) else //if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_09_EnterLift); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_09_EnterLift);
SetLiftOccupied(JobParam.CurTargetNode.Name, agv); SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点"; runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}"); ToTakeShelfOff(agv, $"{JobParam.CurTargetNode.Name}");
} }
} }
else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo())) else if (JobRunStep.IsTimeOut(20) && !LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_08_CheckD2Status); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_08_CheckD2Status);
//请求电梯 //请求电梯
lift.LiftContext.FinishedRequest(JobParam.GetMissionInfo(), agv); LiftContext.FinishedRequest(JobParam.GetMissionInfo(), agv);
} }
} }
#region 电梯内无料车 #region 电梯内无料车
...@@ -226,13 +293,12 @@ namespace DeviceLibrary.bean.job ...@@ -226,13 +293,12 @@ namespace DeviceLibrary.bean.job
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_11_LeaveLift); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_11_LeaveLift);
//上报状态 //上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId, 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, service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"电梯卸车")); $"电梯卸车"));
runInfo = $"料车在{JobParam.CurTargetNode.AliceName}卸下完成,准备离开"; runInfo = $"料车在{JobParam.CurTargetNode.AliceName}卸下完成,准备离开";
LeaveLift(agv, JobParam.CurTargetNode.Name);
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
...@@ -242,162 +308,97 @@ namespace DeviceLibrary.bean.job ...@@ -242,162 +308,97 @@ namespace DeviceLibrary.bean.job
{ {
JobRunStep.ToNextStep(RunStep.END); JobRunStep.ToNextStep(RunStep.END);
//发送该料是成品 //发送该料是成品
bool rtn1 = lift.LiftContext.FinishedProduct(JobParam.CurTargetNode.Name, agv); bool rtn1 = LiftContext.FinishedProduct(JobParam.CurTargetNode.Name, agv);
Thread.Sleep(5000); Thread.Sleep(5000);
//AGV离开 //AGV离开
bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false); bool rtn = LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
Thread.Sleep(2000); Thread.Sleep(2000);
bool rtn2 = lift.LiftContext.CloseFinishedProduct(JobParam.CurTargetNode.Name, agv); bool rtn2 = LiftContext.CloseFinishedProduct(JobParam.CurTargetNode.Name, agv);
runInfo = $"任务结束:离开{JobParam.CurTargetNode.AliceName}完成并发送离开信号和送成品信号:{rtn},{rtn1},{rtn2}"; runInfo = $"任务结束:离开{JobParam.CurTargetNode.AliceName}完成并发送离开信号和送成品信号:{rtn},{rtn1},{rtn2}";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.等待成品回收, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.等待成品回收, out string msg);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
ClearLiftNodeOccupied(agv);
} }
} }
#endregion #endregion
#region 电梯内有料车
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_12_ToStandby)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_12_ToStandby))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) // if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
if (!LiftContext.CheckLiftOccupied(JobParam.CurTargetNode.Name) && !LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name)) if (!TargetIsOccupied(agv,JobParam.CurTargetNode.Name) && !LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_08_CheckD2Status); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_07_ToLiftD2);
runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点1请求电梯"; 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; JobRunStep.Msg = runInfo;
//请求电梯
lift.LiftContext.FinishedRequest(JobParam.GetMissionInfo(), agv);
System.Threading.Thread.Sleep(2000);
} }
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_12_ToTemp1)) #region 电梯内有料车
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
//if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
//{
// JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_08_CheckD2Status);
// runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点1请求电梯";
// JobRunStep.Msg = runInfo;
// //请求电梯
// lift.LiftContext.FinishedRequest(JobParam.GetMissionInfo(), agv);
// System.Threading.Thread.Sleep(2000);
//}
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_13_TakeShelfOffAtTemp1); else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_13_ToShelfBuff))
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的临时点1,将车上料车卸下";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_13_TakeShelfOffAtTemp1))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_14_ToLift);
runInfo = $"在{JobParam.CurTargetNode.AliceName}将车上料车卸在临时点1完成,去电梯口";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_14_ToLift))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_15_EnterLift); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_14_TakeShelfOff);
runInfo = $"到达{JobParam.CurTargetNode.AliceName},去取料点"; runInfo = $"到达料架缓存点,将车上料车卸下";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.PutShelfOn}"); TakeShelfOff(agv);
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_15_EnterLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_16_PutShelfOn);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的取料点,准备拾取料车";
JobRunStep.Msg = runInfo;
if (liftStatus.HasEmptyFinishedShelf)
{
PutYiYuanD2LiftShelfOn(agv, JobParam.CurTargetNode.Name);
}
else
PutLiftShelfOn(agv, JobParam.CurTargetNode.Name);
//AllocateTask(agv, $"{SettingString.PutShelfOn}_{JobParam.CurTargetNode.Name}");
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_16_PutShelfOn)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_14_TakeShelfOff))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_17_LeaveLift); //设置任务状态为料架换缓存
runInfo = $"拾取{JobParam.CurTargetNode.AliceName}的料车完成,准备离开电梯"; MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.料架缓存, out string msg);
JobRunStep.Msg = runInfo; ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}"); //执行取空成品任务
} Node src = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
} Node dest = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_17_LeaveLift)) MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId);
{ if (missionInfo != null)
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
if (liftStatus.HasEmptyFinishedShelf)//电梯里的是成品回收料
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_01_ToTemp2); JobParam jobParam = new JobParam(src, dest, null, missionInfo);
runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,去临时点2的放料点"; MissionManager.SetMissionOccupied(missionInfo, agv);
//service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); job = new F1LiftD2ToLiftC1Job(jobParam);
//if (missionInfo != null)
//{
// //任务状态变更
// MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.离开电梯, out string msg);
//}
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp2}_{SettingString.TakeShelfOff}");
JobRunStep.Msg = runInfo;
} }
else else
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_18_CloseDoor); JobRunStep.ToNextStep(RunStep.END);
//AGV离开 runInfo = $"未搜索到电梯内的料车任务信息【{JobParam.LiftStatus?.missionId ?? ""}】,结束任务";
bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,发送离开信号:{rtn}";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null)
{
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回离开电梯, out string msg);
}
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
} }
#region 送往库房的料车 #region 送往库房的料车
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_18_CloseDoor)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_18_CloseDoor))
{ {
if (lift.LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name)) if (LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_19_01_ToStore); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_19_01_ToStore);
runInfo = $"{JobParam.CurTargetNode.AliceName}关门完成,将料车送到{liftStatus.destinationPoint}的放料点"; runInfo = $"{JobParam.CurTargetNode.AliceName}关门完成,将料车送到{JobParam.LiftStatus.destinationPoint}的放料点";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回起始地, out string msg); MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回起始地, out string msg);
} }
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{liftStatus.destinationPoint}_{SettingString.TakeShelfOff}"); ToTakeShelfOff(agv, $"{JobParam.LiftStatus.destinationPoint}");
} }
else if (JobRunStep.IsTimeOut(0.5, out double val)) else if (JobRunStep.IsTimeOut(0.5, out double val))
{ {
//AGV离开 //AGV离开
lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false); LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"{JobParam.CurTargetNode.AliceName}离开信号超时重发"; runInfo = $"{JobParam.CurTargetNode.AliceName}离开信号超时重发";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
System.Threading.Thread.Sleep(3000); Thread.Sleep(3000);
} }
} }
...@@ -407,9 +408,9 @@ namespace DeviceLibrary.bean.job ...@@ -407,9 +408,9 @@ namespace DeviceLibrary.bean.job
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_19_02_TakeShelfOff); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_19_02_TakeShelfOff);
runInfo = $"到达{liftStatus.destinationPoint}的放料点,准备卸下"; runInfo = $"到达{JobParam.LiftStatus.destinationPoint}的放料点,准备卸下";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}"); TakeShelfOff(agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_19_02_TakeShelfOff)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_19_02_TakeShelfOff))
...@@ -417,15 +418,15 @@ namespace DeviceLibrary.bean.job ...@@ -417,15 +418,15 @@ namespace DeviceLibrary.bean.job
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_19_03_ToTemp1); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_19_03_ToTemp1);
runInfo = $"料车在{liftStatus.destinationPoint}卸下完成, 返回{JobParam.CurTargetNode.AliceName}的临时点1的取料点"; runInfo = $"料车在{JobParam.LiftStatus.destinationPoint}卸下完成, 返回{JobParam.CurTargetNode.AliceName}的临时点1的取料点";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.完成, out string msg); MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.完成, out string msg);
} }
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.PutShelfOn}"); ToTmp1PutOn(agv, $"{JobParam.CurTargetNode.Name}");
} }
} }
...@@ -447,7 +448,8 @@ namespace DeviceLibrary.bean.job ...@@ -447,7 +448,8 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_19_05_ToLift); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_19_05_ToLift);
runInfo = $"拾取料架完成,去{JobParam.CurTargetNode.AliceName}"; runInfo = $"拾取料架完成,去{JobParam.CurTargetNode.AliceName}";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}"); //AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
ToLift(agv, JobParam.CurTargetNode.Name);
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_19_05_ToLift)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_19_05_ToLift))
...@@ -458,8 +460,8 @@ namespace DeviceLibrary.bean.job ...@@ -458,8 +460,8 @@ namespace DeviceLibrary.bean.job
runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯"; runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
//请求电梯 //请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, false, true); LiftContext.Request(JobParam.GetMissionInfo(), agv, false, true);
System.Threading.Thread.Sleep(2000); Thread.Sleep(2000);
} }
} }
#endregion #endregion
...@@ -474,7 +476,7 @@ namespace DeviceLibrary.bean.job ...@@ -474,7 +476,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_02_TakeShelfOff); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_02_TakeShelfOff);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}临时点2的放料点,准备放下料车"; runInfo = $"到达{JobParam.CurTargetNode.AliceName}临时点2的放料点,准备放下料车";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}"); TakeShelfOff(agv);
} }
} }
...@@ -482,10 +484,10 @@ namespace DeviceLibrary.bean.job ...@@ -482,10 +484,10 @@ namespace DeviceLibrary.bean.job
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_20_03_ToTemp1); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_03_ToTemp1);
runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点2放下料车完成,去临时点1的取料点"; runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点2放下料车完成,去临时点1的取料点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.PutShelfOn}"); ToTmp1PutOn(agv, $"{JobParam.CurTargetNode.Name}");
} }
} }
...@@ -493,7 +495,7 @@ namespace DeviceLibrary.bean.job ...@@ -493,7 +495,7 @@ namespace DeviceLibrary.bean.job
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_20_04_PutShelfOn); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_04_PutShelfOn);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}临时点1的取料点,准备取料"; runInfo = $"到达{JobParam.CurTargetNode.AliceName}临时点1的取料点,准备取料";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
//AllocateTask(agv, $"{SettingString.PutShelfOn}"); //AllocateTask(agv, $"{SettingString.PutShelfOn}");
...@@ -508,7 +510,7 @@ namespace DeviceLibrary.bean.job ...@@ -508,7 +510,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_05_ToLiftC1); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_05_ToLiftC1);
runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点1取料完成,去电梯"; runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点1取料完成,去电梯";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}"); ToLift(agv, $"{JobParam.CurTargetNode.Name}");
} }
} }
...@@ -519,7 +521,7 @@ namespace DeviceLibrary.bean.job ...@@ -519,7 +521,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_06_EnterLiftC1); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_06_EnterLiftC1);
runInfo = $"进入{JobParam.CurTargetNode.AliceName}的放料点"; runInfo = $"进入{JobParam.CurTargetNode.AliceName}的放料点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}"); ToTakeShelfOff(agv, $"{JobParam.CurTargetNode.Name}");
} }
} }
...@@ -531,7 +533,7 @@ namespace DeviceLibrary.bean.job ...@@ -531,7 +533,7 @@ namespace DeviceLibrary.bean.job
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的放料点,准备放下料架"; runInfo = $"到达{JobParam.CurTargetNode.AliceName}的放料点,准备放下料架";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
//AllocateTask(agv, $"{SettingString.TakeShelfOff}"); //AllocateTask(agv, $"{SettingString.TakeShelfOff}");
TakeYiYuanLiftShelfOff(agv, SettingString.TakeShelfOff); TakeYiYuanLiftShelfOff(agv, JobParam.CurTargetNode.Name);
} }
} }
...@@ -542,7 +544,8 @@ namespace DeviceLibrary.bean.job ...@@ -542,7 +544,8 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_08_LeaveLiftC1); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_08_LeaveLiftC1);
runInfo = $"在{JobParam.CurTargetNode.AliceName}放下料架完成,准备离开"; runInfo = $"在{JobParam.CurTargetNode.AliceName}放下料架完成,准备离开";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}"); //AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
LeaveLift(agv, JobParam.CurTargetNode.Name);
} }
} }
...@@ -551,39 +554,44 @@ namespace DeviceLibrary.bean.job ...@@ -551,39 +554,44 @@ namespace DeviceLibrary.bean.job
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_09_CloseDoor); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_09_CloseDoor);
LiftContext.FinishedProduct(JobParam.CurTargetNode.Name, agv);
Thread.Sleep(2000);
//AGV离开 //AGV离开
bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, true); bool rtn = LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, true);
Thread.Sleep(2000);
LiftContext.CloseFinishedProduct(JobParam.CurTargetNode.Name, agv);
runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,发送离开信号:{rtn}"; runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,发送离开信号:{rtn}";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.等待成品回收, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.等待成品回收, out string msg);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
ResetMissionOccupiedAgv(JobParam.GetMissionInfo()); ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
ClearLiftNodeOccupied(agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_20_09_CloseDoor)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_20_09_CloseDoor))
{ {
if (lift.LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name)) if (LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_10_ToTemp2); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_10_ToTemp2);
runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2的取料点"; runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2的取料点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp2}_{SettingString.PutShelfOn}"); ToTmp2PutOn(agv, $"{JobParam.CurTargetNode.Name}");
}
else if (JobRunStep.IsTimeOut(0.5, out double val))
{
//AGV离开
lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"{JobParam.CurTargetNode.AliceName}离开信号超时重发";
JobRunStep.Msg = runInfo;
System.Threading.Thread.Sleep(3000);
} }
//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)) else if (JobRunStep.IsStep(RunStep.S1F_LiftC1ToLiftD2_20_10_ToTemp2))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_20_11_TakeShelfOn); JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_20_11_TakeShelfOn);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}临时点2的取料点,准备取料架"; runInfo = $"到达{JobParam.CurTargetNode.AliceName}临时点2的取料点,准备取料架";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
// AllocateTask(agv, $"{SettingString.PutShelfOn}"); // AllocateTask(agv, $"{SettingString.PutShelfOn}");
...@@ -606,14 +614,14 @@ namespace DeviceLibrary.bean.job ...@@ -606,14 +614,14 @@ namespace DeviceLibrary.bean.job
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
//去C1 //去C1
Node src = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift); Node src = NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
Node dest = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift); Node dest = NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
JobParam jobParam = new JobParam(src, dest, null, MissionManager.GetMission(liftStatus.missionId)); JobParam jobParam = new JobParam(src, dest, null, MissionManager.GetMission(JobParam.LiftStatus.missionId));
F1LiftD2ToLiftC1Job d2ToLiftC1Job = new F1LiftD2ToLiftC1Job(jobParam); F1LiftD2ToLiftC1Job d2ToLiftC1Job = new F1LiftD2ToLiftC1Job(jobParam);
d2ToLiftC1Job.JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_07_ToLiftC1); d2ToLiftC1Job.JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_07_ToLiftC1);
runInfo = $"准备去{SettingString.LIFT_C1}送空成品料车"; runInfo = $"准备去{SettingString.LIFT_C1}送空成品料车";
d2ToLiftC1Job.JobRunStep.Msg = runInfo; d2ToLiftC1Job.JobRunStep.Msg = runInfo;
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 //任务状态变更
...@@ -632,7 +640,7 @@ namespace DeviceLibrary.bean.job ...@@ -632,7 +640,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.EndJob(); JobRunStep.EndJob();
return null; return null;
} }
return this; return job;
} }
} }
} }
...@@ -19,9 +19,9 @@ namespace DeviceLibrary.bean.job ...@@ -19,9 +19,9 @@ namespace DeviceLibrary.bean.job
{ {
} }
lift.LiftStatus liftStatus;
public override Job Run(AgvInfo agv) public override Job Run(AgvInfo agv)
{ {
Job job = this;
agv.SetJobContext(new bean.agv.JobContext() agv.SetJobContext(new bean.agv.JobContext()
{ {
MissionId = JobParam.GetMissionInfo().missionId, MissionId = JobParam.GetMissionInfo().missionId,
...@@ -33,10 +33,34 @@ namespace DeviceLibrary.bean.job ...@@ -33,10 +33,34 @@ namespace DeviceLibrary.bean.job
}); });
if (JobRunStep.IsStep(RunStep.NONE)) if (JobRunStep.IsStep(RunStep.NONE))
{ {
if(TargetIsOccupied(agv, JobParam.SrcNode.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_00_ToStandby);
runInfo = $"在{JobParam.SrcNode.AliceName}小车,先去待机点";
JobRunStep.Msg = runInfo;
ToStandby(agv);
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_01_ToLiftD2);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo;
ToLift(agv, $"{JobParam.SrcNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_00_ToStandby))
{
if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_01_ToLiftD2); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_01_ToLiftD2);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}"; runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.SrcNode.Name}"); ToLift(agv, $"{JobParam.SrcNode.Name}");
}
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_01_ToLiftD2)) else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_01_ToLiftD2))
{ {
...@@ -92,7 +116,8 @@ namespace DeviceLibrary.bean.job ...@@ -92,7 +116,8 @@ namespace DeviceLibrary.bean.job
$"电梯取车")); $"电梯取车"));
runInfo = $"在{JobParam.SrcNode.AliceName}取料车完成,准备离开"; runInfo = $"在{JobParam.SrcNode.AliceName}取料车完成,准备离开";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}"); //AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}");
LeaveLift(agv, JobParam.SrcNode.Name);
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_05_LeaveLift)) else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_05_LeaveLift))
...@@ -104,17 +129,44 @@ namespace DeviceLibrary.bean.job ...@@ -104,17 +129,44 @@ namespace DeviceLibrary.bean.job
bool rtn = lift.LiftContext.EmptyFinishedAGVLeave(JobParam.SrcNode.Name, agv);//lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv, false); bool rtn = lift.LiftContext.EmptyFinishedAGVLeave(JobParam.SrcNode.Name, agv);//lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv, false);
runInfo = $"离开{JobParam.SrcNode.AliceName},关闭电梯门:{rtn}"; runInfo = $"离开{JobParam.SrcNode.AliceName},关闭电梯门:{rtn}";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
ClearLiftNodeOccupied(agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_06_CloseLiftDoor)) else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_06_CloseLiftDoor))
{ {
if(TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_07_ToStandby);
runInfo = $"在{JobParam.CurTargetNode.AliceName}有小车,去待机点";
ToStandby(agv);
JobRunStep.Msg = runInfo;
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_07_ToLiftC1); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_07_ToLiftC1);
runInfo = $"关闭{JobParam.SrcNode.AliceName}门完成,去{JobParam.CurTargetNode.AliceName}"; runInfo = $"关闭{JobParam.SrcNode.AliceName}门完成,去{JobParam.CurTargetNode.AliceName}";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯, out string msg);
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}"); ToLift(agv, $"{JobParam.CurTargetNode.Name}");
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_07_ToStandby))
{
if (TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_07_ToLiftC1);
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.S1F_LiftD2ToLiftC1_07_ToLiftC1)) else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_07_ToLiftC1))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
...@@ -134,13 +186,13 @@ namespace DeviceLibrary.bean.job ...@@ -134,13 +186,13 @@ namespace DeviceLibrary.bean.job
{ {
if (lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo().destinationFloor)) if (lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo().destinationFloor))
{ {
if (lift.LiftContext.HasFinishedShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out liftStatus)) if (lift.LiftContext.HasFinishedShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out JobParam.LiftStatus))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_12_ToTemp1); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_12_ToTemp1);
//SetLiftOccupied(JobParam.CurTargetNode.Name, agv); //SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有成品料车,去临时点1的卸料点,准备卸下车上料车";// runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有成品料车,去临时点1的卸料点,准备卸下车上料车";//
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}"); AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(JobParam.LiftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 //任务状态变更
...@@ -148,31 +200,33 @@ namespace DeviceLibrary.bean.job ...@@ -148,31 +200,33 @@ namespace DeviceLibrary.bean.job
} }
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
else if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out liftStatus)) else if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out JobParam.LiftStatus))
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (IsBackShelf(missionInfo))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_12_ToTemp1);
SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有料车,去临时点1的卸料点,准备卸下车上料车";//
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
if (missionInfo != null)
{
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回电梯到达, out string msg);
}
JobRunStep.Msg = runInfo;
}
else
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_12_ToStandby); MissionManager.SetMissionOccupied(JobParam.GetMissionInfo().missionId, agv);
job = new SwitchShelfJob(JobParam);
//service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
//if (IsBackShelf(missionInfo))
//{
// JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_12_ToTemp1);
// SetLiftOccupied(JobParam.CurTargetNode.Name, agv); // SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有送料的料车,去待机点等待电梯空闲";// // runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有料车,去临时点1的卸料点,准备卸下车上料车";//
AllocateStandbyTask(agv); // AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
JobRunStep.Msg = runInfo;
} // if (missionInfo != null)
// {
// //任务状态变更
// MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回电梯到达, out string msg);
// }
// JobRunStep.Msg = runInfo;
//}
//else
//{
// JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_12_ToStandby);
// // SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
// runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有送料的料车,去待机点等待电梯空闲";//
// AllocateStandbyTask(agv);
// JobRunStep.Msg = runInfo;
//}
} }
else //if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name)) else //if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{ {
...@@ -214,7 +268,8 @@ namespace DeviceLibrary.bean.job ...@@ -214,7 +268,8 @@ namespace DeviceLibrary.bean.job
ResetMissionOccupiedAgv(JobParam.GetMissionInfo()); ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回到达电梯内, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回到达电梯内, out string msg);
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}"); // AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
LeaveLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
...@@ -312,11 +367,11 @@ namespace DeviceLibrary.bean.job ...@@ -312,11 +367,11 @@ namespace DeviceLibrary.bean.job
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
if (service.model.MissionInfo.IsFinishedProdcut(MissionManager.GetMission(liftStatus.missionId)))//电梯里的是成品入库料 if (service.model.MissionInfo.IsFinishedProdcut(MissionManager.GetMission(JobParam.LiftStatus.missionId)))//电梯里的是成品入库料
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_20_01_ToTemp2); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_20_01_ToTemp2);
runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,去临时点2的放料点"; runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,去临时点2的放料点";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(JobParam.LiftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 //任务状态变更
...@@ -328,10 +383,11 @@ namespace DeviceLibrary.bean.job ...@@ -328,10 +383,11 @@ namespace DeviceLibrary.bean.job
else else
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_18_CloseDoor); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_18_CloseDoor);
ClearLiftNodeOccupied(agv);
//AGV离开 //AGV离开
bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false); bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,发送离开信号:{rtn}"; runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,发送离开信号:{rtn}";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(JobParam.LiftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 //任务状态变更
...@@ -349,15 +405,15 @@ namespace DeviceLibrary.bean.job ...@@ -349,15 +405,15 @@ namespace DeviceLibrary.bean.job
if (lift.LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name)) if (lift.LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_01_ToStore); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_01_ToStore);
runInfo = $"{JobParam.CurTargetNode.AliceName}关门完成,将料车送到{liftStatus.destinationPoint}的放料点"; runInfo = $"{JobParam.CurTargetNode.AliceName}关门完成,将料车送到{JobParam.LiftStatus.destinationPoint}的放料点";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(JobParam.LiftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回起始地, out string msg); MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回起始地, out string msg);
} }
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{liftStatus.destinationPoint}_{SettingString.TakeShelfOff}"); AllocateTask(agv, $"{JobParam.LiftStatus.destinationPoint}_{SettingString.TakeShelfOff}");
} }
else if (JobRunStep.IsTimeOut(0.5, out double val)) else if (JobRunStep.IsTimeOut(0.5, out double val))
{ {
...@@ -375,7 +431,7 @@ namespace DeviceLibrary.bean.job ...@@ -375,7 +431,7 @@ namespace DeviceLibrary.bean.job
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_02_TakeShelfOff); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_02_TakeShelfOff);
runInfo = $"到达{liftStatus.destinationPoint}的放料点,准备卸下"; runInfo = $"到达{JobParam.LiftStatus.destinationPoint}的放料点,准备卸下";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}"); AllocateTask(agv, $"{SettingString.TakeShelfOff}");
} }
...@@ -385,8 +441,8 @@ namespace DeviceLibrary.bean.job ...@@ -385,8 +441,8 @@ namespace DeviceLibrary.bean.job
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_03_ToTemp1); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_03_ToTemp1);
runInfo = $"料车在{liftStatus.destinationPoint}卸下完成, 返回{JobParam.CurTargetNode.AliceName}的临时点1的取料点"; runInfo = $"料车在{JobParam.LiftStatus.destinationPoint}卸下完成, 返回{JobParam.CurTargetNode.AliceName}的临时点1的取料点";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(JobParam.LiftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 //任务状态变更
...@@ -412,10 +468,35 @@ namespace DeviceLibrary.bean.job ...@@ -412,10 +468,35 @@ namespace DeviceLibrary.bean.job
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
if(TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_05_ToStandby);
runInfo = $"在{JobParam.CurTargetNode.AliceName}有小车,去待机点";
JobRunStep.Msg = runInfo;
MoveToNode(agv, $"{SettingString.Standby}");
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_05_ToLift); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_05_ToLift);
runInfo = $"拾取料架完成,去{JobParam.CurTargetNode.AliceName}"; runInfo = $"拾取料架完成,去{JobParam.CurTargetNode.AliceName}";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}"); ToLift(agv, $"{JobParam.CurTargetNode.Name}");
}
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_19_05_ToStandby))
{
if (TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_19_05_ToLift);
runInfo = $"拾取料架完成,去{JobParam.CurTargetNode.AliceName}";
JobRunStep.Msg = runInfo;
ToLift(agv, $"{JobParam.CurTargetNode.Name}");
} }
} }
else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_19_05_ToLift)) else if (JobRunStep.IsStep(RunStep.S1F_LiftD2ToLiftC1_19_05_ToLift))
...@@ -511,7 +592,8 @@ namespace DeviceLibrary.bean.job ...@@ -511,7 +592,8 @@ namespace DeviceLibrary.bean.job
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回到达电梯内, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回到达电梯内, out string msg);
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}"); //AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
LeaveLift(agv, JobParam.CurTargetNode.Name);
} }
} }
...@@ -526,6 +608,8 @@ namespace DeviceLibrary.bean.job ...@@ -526,6 +608,8 @@ namespace DeviceLibrary.bean.job
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯运行, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯运行, out string msg);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
ClearLiftNodeOccupied(agv);
} }
} }
...@@ -536,7 +620,8 @@ namespace DeviceLibrary.bean.job ...@@ -536,7 +620,8 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_20_10_ToTemp2); JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_20_10_ToTemp2);
runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2的取料点"; runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2的取料点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp2}_{SettingString.PutShelfOn}"); ToTmp2PutOn(agv, JobParam.CurTargetNode.Name);
//AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp2}_{SettingString.PutShelfOn}");
} }
else if (JobRunStep.IsTimeOut(0.5, out double val)) else if (JobRunStep.IsTimeOut(0.5, out double val))
{ {
...@@ -576,12 +661,12 @@ namespace DeviceLibrary.bean.job ...@@ -576,12 +661,12 @@ namespace DeviceLibrary.bean.job
//去D2 //去D2
Node src = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift); Node src = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
Node dest = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift); Node dest = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
JobParam jobParam = new JobParam(src, dest, null, MissionManager.GetMission(liftStatus.missionId)); JobParam jobParam = new JobParam(src, dest, null, MissionManager.GetMission(JobParam.LiftStatus.missionId));
F1LiftC1ToLiftD2Job c1ToLiftD2Job = new F1LiftC1ToLiftD2Job(jobParam); F1LiftC1ToLiftD2Job c1ToLiftD2Job = new F1LiftC1ToLiftD2Job(jobParam);
c1ToLiftD2Job.JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_07_ToLiftD2); c1ToLiftD2Job.JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_07_ToLiftD2);
runInfo = $"准备去{SettingString.LIFT_D2}送成品料车"; runInfo = $"准备去{SettingString.LIFT_D2}送成品料车";
c1ToLiftD2Job.JobRunStep.Msg = runInfo; c1ToLiftD2Job.JobRunStep.Msg = runInfo;
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(JobParam.LiftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 //任务状态变更
...@@ -599,7 +684,7 @@ namespace DeviceLibrary.bean.job ...@@ -599,7 +684,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.EndJob(); JobRunStep.EndJob();
return null; return null;
} }
return this; return job;
} }
} }
} }
using Common; using Common;
using DeviceLibrary.bean; using DeviceLibrary.bean;
using DeviceLibrary.lift;
using DeviceLibrary.manager; using DeviceLibrary.manager;
using DeviceLibrary.service.model; using DeviceLibrary.service.model;
using log4net.Util; using log4net.Util;
using System; using System;
using System.Web.UI.WebControls.WebParts;
using System.Windows.Forms; using System.Windows.Forms;
namespace DeviceLibrary namespace DeviceLibrary
...@@ -73,6 +75,163 @@ namespace DeviceLibrary ...@@ -73,6 +75,163 @@ namespace DeviceLibrary
Task = AgvTaskManager.GetTaskByName(taskName, agv); Task = AgvTaskManager.GetTaskByName(taskName, agv);
AgvTaskManager.AssignMission(agv, taskName); AgvTaskManager.AssignMission(agv, taskName);
} }
/// <summary>
/// 去电梯,并占用节点
/// </summary>
/// <param name="agv"></param>
/// <param name="liftname"></param>
protected void ToLift(AgvInfo agv, string liftname)
{
LiftContext.SetLiftNodeOccupied(agv, liftname);
AllocateTask(agv, $"{liftname}");
}
/// <summary>
/// 离开电梯
/// </summary>
/// <param name="agv"></param>
/// <param name="liftName"></param>
protected void LeaveLift(AgvInfo agv, string liftName)
{
AllocateTask(agv, $"{SettingString.Leave}_{liftName}");
}
/// <summary>
/// 清除agv占用的电梯点
/// </summary>
/// <param name="agv"></param>
protected void ClearLiftNodeOccupied(AgvInfo agv)
{
LiftContext.SetLiftNodeOccupied(agv);
}
/// <summary>
/// 去电梯临时电1放料点
/// </summary>
/// <param name="agvInfo"></param>
protected void ToTmp1TakeOff(AgvInfo agv, string liftName)
{
AllocateTask(agv, $"{liftName}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
}
/// <summary>
/// 去电梯临时点1取料点
/// </summary>
/// <param name="agv"></param>
/// <param name="liftName"></param>
protected void ToTmp1PutOn(AgvInfo agv, string liftName)
{
AllocateTask(agv, $"{liftName}_{SettingString.Temp1}_{SettingString.PutShelfOn}");
}
/// <summary>
/// 去取料点
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
protected void ToPutShelfOn(AgvInfo agv, string nodeName)
{
AllocateTask(agv, $"{nodeName}_{SettingString.PutShelfOn}");
}
/// <summary>
/// 去放料点
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
protected void ToTakeShelfOff(AgvInfo agv, string nodeName)
{
AllocateTask(agv, $"{nodeName}_{SettingString.TakeShelfOff}");
}
/// <summary>
/// 去电梯临时电2放料点
/// </summary>
/// <param name="agvInfo"></param>
protected void ToTmp2TakeOff(AgvInfo agv, string liftName)
{
AllocateTask(agv, $"{liftName}_{SettingString.Temp2}_{SettingString.TakeShelfOff}");
}
/// <summary>
/// 去电梯临时点2取料点
/// </summary>
/// <param name="agv"></param>
/// <param name="liftName"></param>
protected void ToTmp2PutOn(AgvInfo agv, string liftName)
{
AllocateTask(agv, $"{liftName}_{SettingString.Temp2}_{SettingString.PutShelfOn}");
}
/// <summary>
/// AGV任务是否运行完成
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
protected bool AGVTaskIsFinished(AgvInfo agv)
{
return agv.TaskRunState.CheckTaskFinished(agv.Name);
}
/// <summary>
/// 卸下料架
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
protected void TakeShelfOff(AgvInfo agv, string nodeName = "")
{
if (string.IsNullOrEmpty(nodeName))
{
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
}
else
{
AllocateTask(agv, $"{SettingString.TakeShelfOff}_{nodeName}");
}
}
/// <summary>
/// 在电梯内卸下料车
/// </summary>
/// <param name="agv"></param>
/// <param name="liftName"></param>
protected void TakeShelfOffAtLift(AgvInfo agv, string liftName)
{
if (agv.Scope.Workshop.Equals("1F"))
{
if (SettingString.LIFT_D2.Equals(liftName))
{
TakeYiYuanLiftShelfOff(agv, liftName);
}
else
{
AllocateTask(agv, $"{SettingString.TakeShelfOff}_{liftName}");
}
}
else
{
AllocateTask(agv, $"{SettingString.TakeShelfOff}_{liftName}");
}
}
/// <summary>
/// 移动到节点
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
protected void MoveToNode(AgvInfo agv, string nodeName)
{
AllocateTask(agv, $"{nodeName}");
}
/// <summary>
/// 移动到节点的取料点
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
protected void MoveToNodePutShelf(AgvInfo agv, string nodeName)
{
AllocateTask(agv, $"{nodeName}_{SettingString.PutShelfOn}");
}
/// <summary>
/// 移动到节点的放料点
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
protected void MoveToNodeTakeOff(AgvInfo agv, string nodeName)
{
AllocateTask(agv, $"{nodeName}_{SettingString.TakeShelfOff}");
}
public void PutLiftShelfOn(AgvInfo agv, string nodeName) public void PutLiftShelfOn(AgvInfo agv, string nodeName)
{ {
if (JobParam.GetMissionInfo().projectType.Equals(ProjectType.空台车归还) || if (JobParam.GetMissionInfo().projectType.Equals(ProjectType.空台车归还) ||
...@@ -140,7 +299,7 @@ namespace DeviceLibrary ...@@ -140,7 +299,7 @@ namespace DeviceLibrary
{ {
AllocateTask(agv, $"{SettingString.PutShelfOn}_{nodeName}{SettingString._Steel}"); AllocateTask(agv, $"{SettingString.PutShelfOn}_{nodeName}{SettingString._Steel}");
} }
else if(JobParam.GetMissionInfo().projectType.Equals(ProjectType.移远成品入库)) else if (missionInfo.projectType.Equals(ProjectType.移远成品入库))
{ {
AllocateTask(agv, $"{SettingString.PutShelfOn}_{nodeName}{SettingString._Box}"); AllocateTask(agv, $"{SettingString.PutShelfOn}_{nodeName}{SettingString._Box}");
} }
...@@ -171,6 +330,7 @@ namespace DeviceLibrary ...@@ -171,6 +330,7 @@ namespace DeviceLibrary
AllocateTask(agv, $"{SettingString.PutShelfOn}"); AllocateTask(agv, $"{SettingString.PutShelfOn}");
} }
} }
public void TakeYiYuanLiftShelfOff(AgvInfo agv, string nodeName) public void TakeYiYuanLiftShelfOff(AgvInfo agv, string nodeName)
{ {
if (JobParam.GetMissionInfo().projectType.Equals(ProjectType.移远成品入库)) if (JobParam.GetMissionInfo().projectType.Equals(ProjectType.移远成品入库))
...@@ -179,9 +339,13 @@ namespace DeviceLibrary ...@@ -179,9 +339,13 @@ namespace DeviceLibrary
} }
else else
{ {
AllocateTask(agv, $"{SettingString.PutShelfOn}_{nodeName}"); AllocateTask(agv, $"{SettingString.TakeShelfOff}_{nodeName}");
} }
} }
/// <summary>
/// 根据当前任务类型拾取料车,非电梯拾取任务
/// </summary>
/// <param name="agv"></param>
public void PutShelfOn(AgvInfo agv) public void PutShelfOn(AgvInfo agv)
{ {
if (JobParam.GetMissionInfo().projectType.Equals(ProjectType.空台车归还) || if (JobParam.GetMissionInfo().projectType.Equals(ProjectType.空台车归还) ||
...@@ -218,12 +382,52 @@ namespace DeviceLibrary ...@@ -218,12 +382,52 @@ namespace DeviceLibrary
AllocateTask(agv, $"{SettingString.PutShelfOn}"); AllocateTask(agv, $"{SettingString.PutShelfOn}");
} }
} }
public void PutShelfOn(AgvInfo agv, MissionInfo missionInfo)
{
if (missionInfo != null)
{
if (missionInfo.projectType.Equals(ProjectType.空台车归还) ||
missionInfo.projectType.Equals(ProjectType.空台车领用))
{
AllocateTask(agv, $"{SettingString.PutShelfOn}{SettingString._Big}");
}
else if (missionInfo.projectType.Equals(ProjectType.半成品入库与领用)
&& !missionInfo.needBack)
{
AllocateTask(agv, $"{SettingString.PutShelfOn}{SettingString._Big}");
}
else if (missionInfo.projectType.Equals(ProjectType.半成品入库)
&& !missionInfo.needBack)
{
AllocateTask(agv, $"{SettingString.PutShelfOn}{SettingString._Big}");
}
else if (missionInfo.projectType.Equals(ProjectType.半成品领用)
&& !missionInfo.needBack)
{
AllocateTask(agv, $"{SettingString.PutShelfOn}{SettingString._Big}");
}
else if (missionInfo.projectType.Equals(ProjectType.钢网入库) ||
missionInfo.projectType.Equals(ProjectType.钢网领用))
{
AllocateTask(agv, $"{SettingString.PutShelfOn}{SettingString._Steel}");
}
else if (missionInfo.projectType.Equals(ProjectType.移远成品入库))
{
AllocateTask(agv, $"{SettingString.PutShelfOn}{SettingString._Box}");
}
else
{
AllocateTask(agv, $"{SettingString.PutShelfOn}");
}
}
}
protected void AllocateTask(AgvInfo agv, ChargePile chargePile) protected void AllocateTask(AgvInfo agv, ChargePile chargePile)
{ {
Task = new AgvTask() { AliceName = chargePile.AliceName, Name = chargePile.Name, Guid = chargePile.Guid }; Task = new AgvTask() { AliceName = chargePile.AliceName, Name = chargePile.Name, Guid = chargePile.Guid };
AgvTaskManager.AssignMission(agv, chargePile, Task); AgvTaskManager.AssignMission(agv, chargePile, Task);
} }
protected void AllocateStandbyTask(AgvInfo agv) protected void ToStandby(AgvInfo agv)
{ {
Task = AgvTaskManager.GetTaskByName($"{SettingString.Standby}", agv); Task = AgvTaskManager.GetTaskByName($"{SettingString.Standby}", agv);
AgvTaskManager.AssignMission(agv, $"{SettingString.Standby}"); AgvTaskManager.AssignMission(agv, $"{SettingString.Standby}");
...@@ -314,16 +518,16 @@ namespace DeviceLibrary ...@@ -314,16 +518,16 @@ namespace DeviceLibrary
/// <summary> /// <summary>
/// 是否需要确认 /// 是否需要确认
/// </summary> /// </summary>
/// <returns></returns> /// <returns>false,不需要确认</returns>
protected bool NeedConfirm() protected bool NeedConfirm()
{ {
if (JobParam.GetMissionInfo() != null) if (JobParam.GetMissionInfo() != null)
{ {
MissionInfo missionInfo = JobParam.GetMissionInfo(); MissionInfo missionInfo = JobParam.GetMissionInfo();
service.model.ProjectType type = JobParam.GetMissionInfo().projectType; service.model.ProjectType type = JobParam.GetMissionInfo().projectType;
if (type.Equals(service.model.ProjectType.空台车领用) || type.Equals(service.model.ProjectType.空台车归还) || if (type.Equals(service.model.ProjectType.空台车领用) ||
(type.Equals(service.model.ProjectType.半成品入库) && !missionInfo.needBack) type.Equals(service.model.ProjectType.空台车归还) ||
|| type.Equals(service.model.ProjectType.半成品入库与领用)) (!missionInfo.needBack))
{ {
return false; return false;
} }
...@@ -382,14 +586,15 @@ namespace DeviceLibrary ...@@ -382,14 +586,15 @@ namespace DeviceLibrary
{ {
MissionManager.SetMissionOccupiedAgv(missionInfo.missionId, string.Empty); MissionManager.SetMissionOccupiedAgv(missionInfo.missionId, string.Empty);
} }
/// <summary>
/// 当前电梯正在使用电梯
/// </summary>
/// <param name="liftId"></param>
/// <param name="agv"></param>
protected void SetLiftOccupied(string liftId, AgvInfo agv) protected void SetLiftOccupied(string liftId, AgvInfo agv)
{ {
lift.LiftContext.SetLiftOccupiedAgv(liftId, agv.IP); lift.LiftContext.SetLiftOccupiedAgv(liftId, agv.IP);
} }
protected void ResetLiftOccupied(string liftId)
{
lift.LiftContext.ResetLiftOccupiedAgv(liftId);
}
/// <summary> /// <summary>
/// 目的地是否有小车占用 /// 目的地是否有小车占用
/// </summary> /// </summary>
...@@ -398,24 +603,23 @@ namespace DeviceLibrary ...@@ -398,24 +603,23 @@ namespace DeviceLibrary
/// <returns></returns> /// <returns></returns>
protected bool TargetIsOccupied(AgvInfo agv, string targetName) protected bool TargetIsOccupied(AgvInfo agv, string targetName)
{ {
try if (LiftContext.OtherAGVIsInLift(agv, targetName))
return true;
else
{ {
if (agv.Scope.Equals("1F")) try
{ {
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP) AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP)
&& agv.Scope.Workshop.Equals(s.Scope.Workshop) && s.Scope.Equals("1F")); && agv.Scope.Workshop.Equals(s.Scope.Workshop));
if (agvInfo != null) if (agvInfo != null)
{ {
//if (agvInfo?.Place.Name.Contains(targetName) ?? false) if (agvInfo?.TaskRunState?.Task?.Name.Contains(targetName) ?? false)
// return true;
if (agvInfo?.TaskRunState?.Task?.Name.Equals(targetName) ?? false)
{ {
return true; return true;
} }
//else if (agvInfo?.Place?.Name.Contains(targetName) ?? false)
// return true;
} }
}
else
return false;
return false; return false;
} }
catch (Exception ex) catch (Exception ex)
...@@ -425,6 +629,12 @@ namespace DeviceLibrary ...@@ -425,6 +629,12 @@ namespace DeviceLibrary
} }
} }
}
/// <summary>
/// 获取任务下一个状态
/// </summary>
/// <param name="missionState"></param>
/// <returns></returns>
protected MissionState getNextState(MissionState missionState) protected MissionState getNextState(MissionState missionState)
{ {
if (missionState == MissionState.电梯运行) if (missionState == MissionState.电梯运行)
...@@ -433,24 +643,95 @@ namespace DeviceLibrary ...@@ -433,24 +643,95 @@ namespace DeviceLibrary
return MissionState.离开电梯; return MissionState.离开电梯;
else if (missionState == MissionState.离开电梯) else if (missionState == MissionState.离开电梯)
return MissionState.送料; return MissionState.送料;
else if (missionState == MissionState.前往电梯)
return MissionState.到达电梯;
else if (missionState == MissionState.到达电梯)
return MissionState.电梯运行;
else if (missionState == MissionState.返回电梯运行) else if (missionState == MissionState.返回电梯运行)
return MissionState.返回电梯到达; return MissionState.返回电梯到达;
else if (missionState == MissionState.返回电梯到达) else if (missionState == MissionState.返回电梯到达)
return MissionState.返回离开电梯; return MissionState.返回离开电梯;
else if (missionState == MissionState.返回离开电梯) else if (missionState == MissionState.返回离开电梯)
return MissionState.返回起始地; return MissionState.返回起始地;
else if (missionState == MissionState.等待成品回收)
return MissionState.返回电梯;
int intType = ((int)missionState) + 1;
return (MissionState)intType;
}
return missionState++; protected bool MissionIsBackState(MissionInfo missionInfo)
{
if (missionInfo == null) return false;
if (missionInfo.state >= MissionState.返回到达电梯内 && missionInfo.state <= MissionState.返回电梯运行)
return true;
if (missionInfo.state == MissionState.等待成品回收)
return true;
return false;
}
protected bool CheckMIssionInlift(MissionInfo missionInfo)
{
if (missionInfo.state >= MissionState.返回电梯到达 && missionInfo.state <= MissionState.返回离开电梯)
return true;
return false;
}
/// <summary>
/// 设置电梯内料架的任务状态
/// </summary>
/// <param name="missionState"></param>
/// <returns></returns>
protected bool setMissionState(MissionInfo missionInfo)
{
service.model.MissionInfo mission = manager.MissionManager.GetMission(missionInfo?.missionId ?? "");
if (mission != null)
{
MissionState missionState = getNextState(mission.state);
//任务状态变更
MissionManager.SetMissionState(mission.missionId, missionState, out string msg);
return true;
}
return false;
}
/// <summary>
/// 设置当前任务的状态
/// </summary>
/// <param name="missionState"></param>
protected void setMissionState(MissionState missionState)
{
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, missionState, out string msg);
} }
protected bool IsBackShelf(MissionInfo missionInfo) protected bool IsBackShelf(MissionInfo missionInfo)
{ {
if(missionInfo?.state>= MissionState.返回电梯运行 && missionInfo?.state<= MissionState.返回电梯到达) if (missionInfo?.state >= MissionState.返回电梯运行 && missionInfo?.state <= MissionState.返回电梯到达)
{ {
return true; return true;
} }
return false; return false;
} }
protected Job GetCallBackJob()
{
//Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集
//return (Model.Job)assembly.CreateInstance(JobParam.CallbackJob.Type.FullName);
object[] parameters = new object[1];
parameters[0] = JobParam;
Job job = (Job)Activator.CreateInstance(JobParam.CallbackJob.Type, parameters);
return job;
}
protected RunStep GetCallBackStep()
{
return JobParam.CallbackJob.RunStep;
}
/// <summary>
/// 生成Job回调
/// </summary>
/// <param name="type"></param>
/// <param name="callbackStep"></param>
/// <returns></returns>
protected void GenJobCallBack(Type type, RunStep callbackStep, JobParam jobParam = null)
{
JobParam.CallbackJob = new JobCallBack(type, callbackStep);
}
} }
} }
using Common; using Common;
using DeviceLibrary.bean;
using DeviceLibrary.lift;
using DeviceLibrary.manager; using DeviceLibrary.manager;
using System.Web.UI;
namespace DeviceLibrary.bean.job namespace DeviceLibrary
{ {
/// <summary> /// <summary>
/// 电梯到线体 /// 电梯到线体
...@@ -18,9 +21,9 @@ namespace DeviceLibrary.bean.job ...@@ -18,9 +21,9 @@ namespace DeviceLibrary.bean.job
{ {
} }
lift.LiftStatus liftStatus;
public override Job Run(AgvInfo agv) public override Job Run(AgvInfo agv)
{ {
Job job = this;
agv.SetJobContext(new bean.agv.JobContext() agv.SetJobContext(new bean.agv.JobContext()
{ {
MissionId = JobParam.GetMissionInfo().missionId, MissionId = JobParam.GetMissionInfo().missionId,
...@@ -32,10 +35,35 @@ namespace DeviceLibrary.bean.job ...@@ -32,10 +35,35 @@ namespace DeviceLibrary.bean.job
}); });
if (JobRunStep.IsStep(RunStep.NONE)) if (JobRunStep.IsStep(RunStep.NONE))
{ {
if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_00_ToStandby);
runInfo = $"在{JobParam.SrcNode.AliceName}有小车,去待机点";
JobRunStep.Msg = runInfo;
ToStandby(agv);
}
else
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_01_ToLift);
runInfo = $"去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo;
ToLift(agv, JobParam.SrcNode.Name);
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_00_ToStandby))
{
if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{
}
else
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_01_ToLift); JobRunStep.ToNextStep(RunStep.SD_LiftToLine_01_ToLift);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}"; runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, JobParam.SrcNode.Name); ToLift(agv, JobParam.SrcNode.Name);
}
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_01_ToLift)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_01_ToLift))
{ {
...@@ -58,7 +86,7 @@ namespace DeviceLibrary.bean.job ...@@ -58,7 +86,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_03_EnterLift); JobRunStep.ToNextStep(RunStep.SD_LiftToLine_03_EnterLift);
SetLiftOccupied(JobParam.SrcNode.Name, agv); SetLiftOccupied(JobParam.SrcNode.Name, agv);
runInfo = $"{JobParam.SrcNode.AliceName}门已开启,进电梯取料点"; runInfo = $"{JobParam.SrcNode.AliceName}门已开启,进电梯取料点";
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}"); ToPutShelfOn(agv, JobParam.SrcNode.Name);
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯到达, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯到达, out string msg);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
...@@ -72,7 +100,6 @@ namespace DeviceLibrary.bean.job ...@@ -72,7 +100,6 @@ namespace DeviceLibrary.bean.job
runInfo = $"到达{JobParam.SrcNode.AliceName}取料点,准备拾取料车"; runInfo = $"到达{JobParam.SrcNode.AliceName}取料点,准备拾取料车";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
PutLiftShelfOn(agv, JobParam.SrcNode.Name); PutLiftShelfOn(agv, JobParam.SrcNode.Name);
//AllocateTask(agv, $"{SettingString.PutShelfOn}_{JobParam.SrcNode.Name}");
} }
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_04_PutShelfOn)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_04_PutShelfOn))
...@@ -87,7 +114,7 @@ namespace DeviceLibrary.bean.job ...@@ -87,7 +114,7 @@ namespace DeviceLibrary.bean.job
runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,准备离开"; runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,准备离开";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}"); LeaveLift(agv, JobParam.SrcNode.Name);
} }
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_05_LeaveLift)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_05_LeaveLift))
...@@ -101,15 +128,54 @@ namespace DeviceLibrary.bean.job ...@@ -101,15 +128,54 @@ namespace DeviceLibrary.bean.job
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.离开电梯, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.离开电梯, out string msg);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
ClearLiftNodeOccupied(agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_06_CloseLiftDoor)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_06_CloseLiftDoor))
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_07_ToLine);
runInfo = $"关闭{JobParam.SrcNode.AliceName}门完成,去{JobParam.CurTargetNode.AliceName}的放料点";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.送料, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.送料, out string msg);
AllocateTask(agv, $"{GetTargetName(JobParam.CurTargetNode)}_{SettingString.TakeShelfOff}"); //是否需要跨两个门
if (NodeManager.NeedCrossTwoDoor(agv, JobParam.SrcNode, JobParam.CurTargetNode))
{
JobParam.CrossDoor.CurNode = JobParam.SrcNode;
JobParam.CrossDoor.NextNode = JobParam.CurTargetNode;
JobParam.CrossDoor.IsIn = true;
JobParam.CrossDoor.IsAir = false;
GenJobCallBack(this.GetType(), RunStep.SD_LiftToLine_07_CrossTwoDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
//是否需要跨门
else 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.SD_LiftToLine_07_CrossDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_07_CrossDoor);
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_07_CrossTwoDoor))
{
JobParam.CrossDoor.CurNode = JobParam.SrcNode;
JobParam.CrossDoor.NextNode = JobParam.CurTargetNode;
JobParam.CrossDoor.IsIn = true;
JobParam.CrossDoor.IsAir = true;
GenJobCallBack(this.GetType(), RunStep.SD_LiftToLine_07_CrossDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_07_CrossDoor))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_07_ToLine);
runInfo = $"去{JobParam.CurTargetNode.AliceName}的放料点";
ToTakeShelfOff(agv, GetTargetName(JobParam.CurTargetNode));
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_07_ToLine)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_07_ToLine))
...@@ -170,24 +236,52 @@ namespace DeviceLibrary.bean.job ...@@ -170,24 +236,52 @@ namespace DeviceLibrary.bean.job
{ {
if (JobParam.TargetNodes != null && JobParam.TargetNodes.Count > 0) if (JobParam.TargetNodes != null && JobParam.TargetNodes.Count > 0)
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_07_ToLine);
JobParam.CurTargetNode = JobParam.TargetNodes[0]; JobParam.CurTargetNode = JobParam.TargetNodes[0];
JobParam.TargetNodes.RemoveAt(0); JobParam.TargetNodes.RemoveAt(0);
System.Threading.Thread.Sleep(1000); if (NodeManager.NeedCrossDoor(agv, agv.Place,JobParam.CurTargetNode, out bool isin, out bool isair))
runInfo = $"去下一线体{JobParam.CurTargetNode.AliceName}的放料点"; {
JobParam.CrossDoor.CurNode = agv.Place;
JobParam.CrossDoor.NextNode = JobParam.CurTargetNode;
JobParam.CrossDoor.IsIn = isin;
JobParam.CrossDoor.IsAir = isair;
GenJobCallBack(this.GetType(), RunStep.SD_LiftToLine_07_CrossDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_07_CrossDoor);
runInfo = $"去下一线体";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{GetTargetName(JobParam.CurTargetNode)}_{SettingString.TakeShelfOff}"); }
} }
else else
{ {
if (JobParam.GetMissionInfo() != null && JobParam.GetMissionInfo().needBack) if (JobParam.GetMissionInfo() != null && JobParam.GetMissionInfo().needBack)
{ {
if (TargetIsOccupied(agv, JobParam.SrcNode.AliceName)) if (NodeManager.NeedCrossTwoDoor(agv,agv.Place,JobParam.SrcNode))
{
JobParam.CrossDoor.CurNode = agv.Place;
JobParam.CrossDoor.NextNode = JobParam.SrcNode;
JobParam.CrossDoor.IsIn = false;
JobParam.CrossDoor.IsAir = true;
GenJobCallBack(this.GetType(), RunStep.SD_LiftToLine_11_CrossTwoDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else if (NodeManager.NeedCrossDoor(agv, agv.Place,JobParam.SrcNode, out bool isin, out bool isair))
{
JobParam.CrossDoor.CurNode = agv.Place;
JobParam.CrossDoor.NextNode = JobParam.SrcNode;
JobParam.CrossDoor.IsIn = isin;
JobParam.CrossDoor.IsAir = isair;
GenJobCallBack(this.GetType(), RunStep.SD_LiftToLine_11_CrossTDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_11_ToStandby); JobRunStep.ToNextStep(RunStep.SD_LiftToLine_11_ToStandby);
runInfo = $"{JobParam.SrcNode.AliceName}有车,去停留点"; runInfo = $"{JobParam.SrcNode.AliceName}有车,去停留点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Standby}"); ToStandby(agv);
} }
else else
{ {
...@@ -196,29 +290,48 @@ namespace DeviceLibrary.bean.job ...@@ -196,29 +290,48 @@ namespace DeviceLibrary.bean.job
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯, out string msg);
AllocateTask(agv, JobParam.SrcNode.Name); ToLift(agv, JobParam.SrcNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
else if (JobParam.GetMissionInfo() != null && !JobParam.GetMissionInfo().needBack) else if (JobParam.GetMissionInfo() != null && !JobParam.GetMissionInfo().needBack)
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_16_TakeShelfOff); JobRunStep.ToNextStep(RunStep.SD_LiftToLine_16_TakeShelfOff);
runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,料车无需返回,准备卸车"; runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,料车无需返回,直接卸车";
AllocateTask(agv, SettingString.TakeShelfOff); TakeShelfOff(agv);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_11_CrossTwoDoor))
{
JobParam.CrossDoor.CurNode = JobParam.CurTargetNode;
JobParam.CrossDoor.NextNode = JobParam.SrcNode;
JobParam.CrossDoor.IsIn = false;
JobParam.CrossDoor.IsAir = false;
GenJobCallBack(this.GetType(), RunStep.SD_LiftToLine_11_CrossTDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_11_CrossTDoor))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_11_BackToLift);
runInfo = $"过门完成,分发结束,料车需返回,去电梯口";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯, out string msg);
ToLift(agv, JobParam.SrcNode.Name);
JobRunStep.Msg = runInfo;
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_11_BackToLift)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_11_BackToLift))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
if (TargetIsOccupied(agv, JobParam.SrcNode.AliceName)) if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_11_ToStandby); JobRunStep.ToNextStep(RunStep.SD_LiftToLine_11_ToStandby);
runInfo = $"{JobParam.SrcNode.AliceName}有车,去停留点"; runInfo = $"{JobParam.SrcNode.AliceName}有车,去停留点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Standby}"); ToStandby(agv);
} }
else else
{ {
...@@ -238,7 +351,7 @@ namespace DeviceLibrary.bean.job ...@@ -238,7 +351,7 @@ namespace DeviceLibrary.bean.job
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_11_ToStandby)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_11_ToStandby))
{ {
if (TargetIsOccupied(agv, JobParam.SrcNode.AliceName)) if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{ {
} }
else else
...@@ -248,13 +361,19 @@ namespace DeviceLibrary.bean.job ...@@ -248,13 +361,19 @@ namespace DeviceLibrary.bean.job
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯, out string msg);
AllocateTask(agv, JobParam.SrcNode.Name); ToLift(agv, JobParam.SrcNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_12_WaitDoorOpen)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_12_WaitDoorOpen))
{ {
if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor)) if (LiftContext.CheckHasEmptyFinished(agv, JobParam.SrcNode.Name, out JobParam.LiftStatus))
{
JobParam.CurTargetNode = JobParam.SrcNode;
MissionManager.SetMissionOccupied(JobParam.GetMissionInfo().missionId, agv);
job = new SwitchShelfJob(JobParam);
}
else if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor))
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_13_CheckLiftStatus); JobRunStep.ToNextStep(RunStep.SD_LiftToLine_13_CheckLiftStatus);
runInfo = $"{JobParam.SrcNode.AliceName}门已开,检查电梯内该层是否有料车"; runInfo = $"{JobParam.SrcNode.AliceName}门已开,检查电梯内该层是否有料车";
...@@ -275,14 +394,19 @@ namespace DeviceLibrary.bean.job ...@@ -275,14 +394,19 @@ namespace DeviceLibrary.bean.job
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_13_CheckLiftStatus)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_13_CheckLiftStatus))
{ {
if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor)) if (LiftContext.CheckHasEmptyFinished(agv, JobParam.SrcNode.Name, out JobParam.LiftStatus))
{ {
if (lift.LiftContext.HasShelfNeedLeave(JobParam.SrcNode.Name, agv.Client, out liftStatus)) JobParam.CurTargetNode = JobParam.SrcNode;
MissionManager.SetMissionOccupied(JobParam.GetMissionInfo().missionId, agv);
job = new SwitchShelfJob(JobParam);
}
else if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor))
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_01_ToTemp1); if (lift.LiftContext.HasShelfNeedLeave(JobParam.SrcNode.Name, agv.Client, out JobParam.LiftStatus))
runInfo = $"{JobParam.SrcNode.AliceName}内有料车,去临时点1放料点"; {
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}"); JobParam.CurTargetNode = JobParam.SrcNode;
JobRunStep.Msg = runInfo; MissionManager.SetMissionOccupied(JobParam.GetMissionInfo().missionId, agv);
job = new SwitchShelfJob(JobParam);
} }
else else
{ {
...@@ -290,7 +414,7 @@ namespace DeviceLibrary.bean.job ...@@ -290,7 +414,7 @@ namespace DeviceLibrary.bean.job
lift.LiftContext.SetLiftOccupiedAgv(JobParam.SrcNode.Name, agv.IP); lift.LiftContext.SetLiftOccupiedAgv(JobParam.SrcNode.Name, agv.IP);
runInfo = $"{JobParam.SrcNode.AliceName}无料车,去放料点"; runInfo = $"{JobParam.SrcNode.AliceName}无料车,去放料点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.TakeShelfOff}"); ToTakeShelfOff(agv, JobParam.SrcNode.Name);
} }
} }
else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.SrcNode.Name, JobParam.GetMissionInfo())) else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.SrcNode.Name, JobParam.GetMissionInfo()))
...@@ -308,7 +432,7 @@ namespace DeviceLibrary.bean.job ...@@ -308,7 +432,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_02_TakeShelfOffAtLift); JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_02_TakeShelfOffAtLift);
runInfo = $"到达{JobParam.SrcNode.AliceName}放料点,准备卸下料车"; runInfo = $"到达{JobParam.SrcNode.AliceName}放料点,准备卸下料车";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}_{JobParam.SrcNode.Name}"); TakeShelfOffAtLift(agv, JobParam.SrcNode.Name);
} }
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_02_TakeShelfOffAtLift)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_02_TakeShelfOffAtLift))
...@@ -319,7 +443,8 @@ namespace DeviceLibrary.bean.job ...@@ -319,7 +443,8 @@ namespace DeviceLibrary.bean.job
runInfo = $"在{JobParam.SrcNode.AliceName}卸下料车完成,准备离开"; runInfo = $"在{JobParam.SrcNode.AliceName}卸下料车完成,准备离开";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
ResetMissionOccupiedAgv(JobParam.GetMissionInfo()); ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}"); //AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}");
LeaveLift(agv, JobParam.SrcNode.Name);
//上报位置 //上报位置
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId, manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto, service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
...@@ -336,12 +461,13 @@ namespace DeviceLibrary.bean.job ...@@ -336,12 +461,13 @@ namespace DeviceLibrary.bean.job
bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv); bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv);
runInfo = $"离开{JobParam.SrcNode.AliceName},关门: {rtn}"; runInfo = $"离开{JobParam.SrcNode.AliceName},关门: {rtn}";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
System.Threading.Thread.Sleep(1000); System.Threading.Thread.Sleep(5000);
ClearLiftNodeOccupied(agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_04_CloseLiftDoor)) else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_04_CloseLiftDoor))
{ {
if (!lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().sourceFloor)) //if (!lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().sourceFloor))
{ {
JobRunStep.ToNextStep(RunStep.END); JobRunStep.ToNextStep(RunStep.END);
//任务状态变更 //任务状态变更
...@@ -349,75 +475,73 @@ namespace DeviceLibrary.bean.job ...@@ -349,75 +475,73 @@ namespace DeviceLibrary.bean.job
runInfo = $"{JobName}结束:{JobParam.SrcNode.AliceName}已关门"; runInfo = $"{JobName}结束:{JobParam.SrcNode.AliceName}已关门";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
else if (JobRunStep.IsTimeOut(0.5, out double time)) //else if (JobRunStep.IsTimeOut(0.5, out double time))
{ //{
lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv); // lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv);
System.Threading.Thread.Sleep(1000); // System.Threading.Thread.Sleep(1000);
} //}
} }
#endregion #endregion
#region 电梯内有料车 else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_16_TakeShelfOff))
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_01_ToTemp1))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_02_WaitLiftIdle); runInfo = $"在{JobParam.CurTargetNode.AliceName}卸下料车完成";
runInfo = $"到达{JobParam.SrcNode.AliceName}的临时点1的放料点,等待电梯空闲";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} //任务状态变更
} MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.完成, out string msg);
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_02_WaitLiftIdle)) //上报状态
{ manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
if (!lift.LiftContext.HasShelfNeedLeave(JobParam.SrcNode.Name, agv.Client, out liftStatus)) service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
$"卸货{JobParam.CurTargetNode.Name}"));
if (NodeManager.NeedCrossTwoDoor(agv, agv.Place, JobParam.SrcNode))
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_03_RequestLift); JobParam.CrossDoor.CurNode = agv.Place;
runInfo = $"请求使用{JobParam.SrcNode.AliceName}"; JobParam.CrossDoor.NextNode = JobParam.SrcNode;
JobRunStep.Msg = runInfo; JobParam.CrossDoor.IsIn = false;
//请求电梯 JobParam.CrossDoor.IsAir = true;
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true); GenJobCallBack(this.GetType(), RunStep.SD_LiftToLine_16_CrossTwoDoor, JobParam);
job = new CrossDoorJob(JobParam);
} }
} else if (NodeManager.NeedCrossDoor(agv, agv.Place, JobParam.SrcNode, out bool isin, out bool isair))
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_03_RequestLift))
{
if (!lift.LiftContext.CheckIfRequestOk(JobParam.SrcNode.Name, JobParam.GetMissionInfo()))
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_11_BackToLift); JobParam.CrossDoor.CurNode = agv.Place;
runInfo = $"请求使用{JobParam.SrcNode.AliceName}成功,去电梯口"; JobParam.CrossDoor.NextNode = JobParam.SrcNode;
JobRunStep.Msg = runInfo; JobParam.CrossDoor.IsIn = isin;
AllocateTask(agv, JobParam.SrcNode.Name); JobParam.CrossDoor.IsAir = isair;
GenJobCallBack(this.GetType(), RunStep.SD_LiftToLine_16_CrossTDoor, JobParam);
job = new CrossDoorJob(JobParam);
} }
else if (JobRunStep.IsTimeOut(20)) else
{ {
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_03_RequestLift); JobRunStep.ToNextStep(RunStep.END);
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true);
} }
} }
#endregion
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_16_TakeShelfOff)) }
else if(JobRunStep.IsStep(RunStep.SD_LiftToLine_16_CrossTwoDoor))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) JobParam.CrossDoor.CurNode = JobParam.CurTargetNode;
JobParam.CrossDoor.NextNode = JobParam.SrcNode;
JobParam.CrossDoor.IsIn = false;
JobParam.CrossDoor.IsAir = false;
GenJobCallBack(this.GetType(), RunStep.SD_LiftToLine_16_CrossTDoor, JobParam);
job = new CrossDoorJob(JobParam);
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_16_CrossTDoor))
{ {
JobRunStep.ToNextStep(RunStep.END); JobRunStep.ToNextStep(RunStep.END);
runInfo = $"在{JobParam.CurTargetNode.AliceName}卸下料车完成";
JobRunStep.Msg = runInfo;
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.完成, out string msg);
//上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
$"卸车"));
}
} }
else if (JobRunStep.IsStep(RunStep.END)) else if (JobRunStep.IsStep(RunStep.END))
{ {
JobRunStep.EndJob(); JobRunStep.EndJob();
return null; return null;
} }
return this; return job;
} }
} }
} }
using Common; using Common;
using DeviceLibrary.bean; using DeviceLibrary.bean;
using DeviceLibrary.bean.job;
using DeviceLibrary.lift; using DeviceLibrary.lift;
using DeviceLibrary.manager; using DeviceLibrary.manager;
using DeviceLibrary.service.model;
using System; using System;
using System.Threading; using System.Threading;
namespace DeviceLibrary namespace DeviceLibrary
{ {
/// <summary> /// <summary>
/// 1F,线体到电梯 /// 线体取料车送到电梯任务
/// </summary> /// </summary>
public class LineToLiftJob : Job public class LineToLiftJob : Job
{ {
...@@ -22,9 +24,9 @@ namespace DeviceLibrary ...@@ -22,9 +24,9 @@ namespace DeviceLibrary
{ {
} }
lift.LiftStatus liftStatus;
public override Job Run(AgvInfo agv) public override Job Run(AgvInfo agv)
{ {
Job job = this;
agv.SetJobContext(new bean.agv.JobContext() agv.SetJobContext(new bean.agv.JobContext()
{ {
MissionId = JobParam.GetMissionInfo().missionId, MissionId = JobParam.GetMissionInfo().missionId,
...@@ -36,11 +38,28 @@ namespace DeviceLibrary ...@@ -36,11 +38,28 @@ namespace DeviceLibrary
}); });
if (JobRunStep.IsStep(RunStep.NONE)) 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); JobRunStep.ToNextStep(RunStep.LineToLift_01_ToLine);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}的取料点"; runInfo = $"去{JobParam.SrcNode.AliceName}的取料点";
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}"); ToPutShelfOn(agv, $"{JobParam.SrcNode.Name}");
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_01_ToLine)) else if (JobRunStep.IsStep(RunStep.LineToLift_01_ToLine))
{ {
...@@ -57,7 +76,6 @@ namespace DeviceLibrary ...@@ -57,7 +76,6 @@ namespace DeviceLibrary
runInfo = $"到达{JobParam.SrcNode.AliceName}的取料点,开始拾取料车"; runInfo = $"到达{JobParam.SrcNode.AliceName}的取料点,开始拾取料车";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
PutShelfOn(agv); PutShelfOn(agv);
//AllocateTask(agv, SettingString.PutShelfOn);
} }
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_02_PutShelfOn)) else if (JobRunStep.IsStep(RunStep.LineToLift_02_PutShelfOn))
...@@ -68,18 +86,34 @@ namespace DeviceLibrary ...@@ -68,18 +86,34 @@ namespace DeviceLibrary
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId, 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, service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"取车")); $"取车"));
if (LiftContext.CheckHasEmptyFinished(agv, JobParam.CurTargetNode.Name, out liftStatus)) 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); JobParam.CrossDoor.IsIn = isin;
AllocateTask(agv, SettingString.Standby); JobParam.CrossDoor.IsAir = isair;
runInfo = $"{JobParam.CurTargetNode.AliceName}有空成品料车,先去待机点"; GenJobCallBack(this.GetType(), RunStep.LineToLift_02_CrossDoor, JobParam);
JobRunStep.Msg = runInfo; job = new CrossDoorJob(JobParam);
}
else
{
JobRunStep.ToNextStep(RunStep.LineToLift_02_CrossDoor);
}
}
} }
else if (TargetIsOccupied(agv, JobParam.CurTargetNode.Name)) else if (JobRunStep.IsStep(RunStep.LineToLift_02_CrossDoor))
{
if (TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
{ {
JobRunStep.ToNextStep(RunStep.LineToLift_ToStandby); JobRunStep.ToNextStep(RunStep.LineToLift_ToStandby);
AllocateTask(agv, SettingString.Standby); if (agv.Scope.Workshop.Equals("1F"))
{
ToStandby(agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}有小车,先去待机点"; runInfo = $"{JobParam.CurTargetNode.AliceName}有小车,先去待机点";
}
else
runInfo = $"{JobParam.CurTargetNode.AliceName}有小车,等待空闲";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
else else
...@@ -88,23 +122,24 @@ namespace DeviceLibrary ...@@ -88,23 +122,24 @@ namespace DeviceLibrary
runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,去{JobParam.CurTargetNode.AliceName}"; runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,去{JobParam.CurTargetNode.AliceName}";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg);
AllocateTask(agv, JobParam.CurTargetNode.Name); ToLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
}
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_ToStandby)) else if (JobRunStep.IsStep(RunStep.LineToLift_ToStandby))
{ {
if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name) if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
&& !LiftContext.CheckHasEmptyFinished(agv, JobParam.CurTargetNode.Name, out liftStatus))
{ {
JobRunStep.ToNextStep(RunStep.LineToLift_03_ToLift); JobRunStep.ToNextStep(RunStep.LineToLift_03_ToLift);
runInfo = $"{JobParam.CurTargetNode.AliceName}已空闲"; runInfo = $"{JobParam.CurTargetNode.AliceName}已空闲,前往目的地";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg);
AllocateTask(agv, JobParam.CurTargetNode.Name); //AllocateTask(agv, JobParam.CurTargetNode.Name);
ToLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_03_ToLift)) else if (JobRunStep.IsStep(RunStep.LineToLift_03_ToLift))
{ {
...@@ -125,42 +160,43 @@ namespace DeviceLibrary ...@@ -125,42 +160,43 @@ namespace DeviceLibrary
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_04_CheckLiftStatus)) else if (JobRunStep.IsStep(RunStep.LineToLift_04_CheckLiftStatus))
{ {
if (LiftContext.CheckHasEmptyFinished(agv, JobParam.CurTargetNode.Name, out liftStatus)) if (LiftContext.CheckHasEmptyFinished(agv, JobParam.CurTargetNode.Name, out JobParam.LiftStatus))
{
MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId ?? "");
if (missionInfo != null)
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_13_ToShelfPlace);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,内有成品空料车{missionInfo.missionId},去料架缓存点";//
ToTakeShelfOff(agv, SettingString.ShelfBuff);
JobRunStep.Msg = runInfo;
}
else
{ {
JobRunStep.ToNextStep(RunStep.LineToLift_05_01_ToStandby); JobRunStep.ToNextStep(RunStep.LineToLift_05_01_ToStandby);
//设置电梯占用 //设置电梯占用
//SetLiftOccupied(JobParam.CurTargetNode.Name, agv); //SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}内有成品空料车,去待机点等待电梯空闲";// runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,内有成品空料车但无工单信息,去待机点,需要手动清空电梯缓存并关闭电梯门";//
AllocateStandbyTask(agv); ToStandby(agv);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
}
else if (lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo().sourceFloor)) else if (lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo().sourceFloor))
{ {
if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out liftStatus)) if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out JobParam.LiftStatus))
{ {
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId ?? "");
if (IsBackShelf(missionInfo))
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_01_ToTemp1);
//设置电梯占用
SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有料车,去临时点1的卸料点,准备卸下车上料车";//
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
//service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 MissionManager.SetMissionOccupied(missionInfo, agv);
MissionManager.SetMissionState(missionInfo.missionId, getNextState(missionInfo.state), out string msg); job = new SwitchShelfJob(JobParam);
}
JobRunStep.Msg = runInfo;
} }
else else
{ {
JobRunStep.ToNextStep(RunStep.LineToLift_05_01_ToStandby); JobRunStep.ToNextStep(RunStep.LineToLift_05_01_ToStandby);
//设置电梯占用 //设置电梯占用
//SetLiftOccupied(JobParam.CurTargetNode.Name, agv); //SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有送料的料车,去待机点等待电梯空闲";// runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有送料的料车但无工单信息,去待机点,需要手动清空电梯缓存并关闭电梯门";//
AllocateStandbyTask(agv); ToStandby(agv);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
...@@ -171,7 +207,7 @@ namespace DeviceLibrary ...@@ -171,7 +207,7 @@ namespace DeviceLibrary
SetLiftOccupied(JobParam.CurTargetNode.Name, agv); SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点"; runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}"); ToTakeShelfOff(agv, JobParam.CurTargetNode.Name);
} }
} }
else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo())) else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
...@@ -186,178 +222,53 @@ namespace DeviceLibrary ...@@ -186,178 +222,53 @@ namespace DeviceLibrary
} }
Thread.Sleep(2000); Thread.Sleep(2000);
} }
#region 电梯内有料车
else if (JobRunStep.IsStep(RunStep.LineToLift_05_01_ToStandby)) else if (JobRunStep.IsStep(RunStep.LineToLift_05_01_ToStandby))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name) && !LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name))
{
if (!LiftContext.CheckHasEmptyFinished(agv, JobParam.GetMissionInfo().liftName, out liftStatus)
&& !LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_04_CheckLiftStatus);
runInfo = $"{JobParam.CurTargetNode.AliceName}无占用,请求电梯";
JobRunStep.Msg = runInfo;
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
System.Threading.Thread.Sleep(2000);
}
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_05_01_ToTemp1))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_02_TakeShelfOffAtTemp1);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的临时点1,将车上料车卸下";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_05_02_TakeShelfOffAtTemp1))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_03_ToLift);
runInfo = $"在{JobParam.CurTargetNode.AliceName}将车上料车卸在临时点1完成,去电梯口";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_05_03_ToLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_04_EnterLift);
runInfo = $"到达{JobParam.CurTargetNode.AliceName},去取料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.PutShelfOn}");
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_05_04_EnterLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.LineToLift_05_05_PutShelfOn); JobRunStep.ToNextStep(RunStep.LineToLift_03_ToLift);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的取料点,准备拾取料车"; runInfo = $"{JobParam.CurTargetNode.AliceName}已空闲";
ToLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
PutLiftShelfOn(agv, JobParam.CurTargetNode.Name, missionInfo);
//AllocateTask(agv, $"{SettingString.PutShelfOn}_{JobParam.CurTargetNode.Name}");
} }
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_05_05_PutShelfOn)) #region 电梯内有空成品料车
else if (JobRunStep.IsStep(RunStep.LineToLift_05_13_ToShelfPlace))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.LineToLift_05_06_LeaveLift); JobRunStep.ToNextStep(RunStep.LineToLift_05_14_TakeShelfOff);
runInfo = $"拾取{JobParam.CurTargetNode.AliceName}的料车完成,准备离开电梯"; runInfo = $"到达料架缓存点,准备卸下料车";
TakeShelfOff(agv);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
} }
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_05_06_LeaveLift)) else if (JobRunStep.IsStep(RunStep.LineToLift_05_14_TakeShelfOff))
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.LineToLift_05_15_CloseDoor); //设置任务状态为料架换缓存
//AGV离开 MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.料架缓存, out string msg);
bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,发送离开信号:{rtn}";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null)
{
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, getNextState(missionInfo.state), out string msg);
}
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_05_15_CloseDoor))
{
if (lift.LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_18_ToStore);
runInfo = $"{JobParam.CurTargetNode.AliceName}关门完成,将料车送到{liftStatus.destinationPoint}的放料点";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null)
{
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, getNextState(missionInfo.state), out string msg);
}
JobRunStep.Msg = runInfo;
ResetMissionOccupiedAgv(JobParam.GetMissionInfo()); ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
AllocateTask(agv, $"{liftStatus.destinationPoint}_{SettingString.TakeShelfOff}"); //执行取空成品任务
} Node src = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
else if (JobRunStep.IsTimeOut(0.5, out double val)) Node dest = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
{ MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId);
//AGV离开
lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"{JobParam.CurTargetNode.AliceName}离开信号超时重发";
JobRunStep.Msg = runInfo;
System.Threading.Thread.Sleep(3000);
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_05_18_ToStore))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_19_TakeShelfOff);
runInfo = $"到达{liftStatus.destinationPoint}的放料点,准备卸下";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_05_19_TakeShelfOff))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_10_ToTemp1);
runInfo = $"料车在{liftStatus.destinationPoint}卸下完成, 返回{JobParam.CurTargetNode.AliceName}的临时点1的取料点";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
//任务状态变更 JobParam jobParam = new JobParam(src, dest, null, missionInfo);
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.完成, out string msg); MissionManager.SetMissionOccupied(missionInfo, agv);
job = new F1LiftD2ToLiftC1Job(jobParam);
} }
JobRunStep.Msg = runInfo; else
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.PutShelfOn}");
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_05_10_ToTemp1))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
JobRunStep.ToNextStep(RunStep.LineToLift_05_11_PutTemp1ShelfOn); JobRunStep.ToNextStep(RunStep.END);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的临时点1的取料点,准备拾取料架"; runInfo = $"未搜索到电梯内的料车任务信息【{JobParam.LiftStatus?.missionId ?? ""}】,结束任务";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
//AllocateTask(agv, $"{SettingString.PutShelfOn}");
PutShelfOn(agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_05_11_PutTemp1ShelfOn))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_05_12_ToLift);
//runInfo = $"拾取料架完成,去{JobParam.CurTargetNode.AliceName}";
//JobRunStep.Msg = runInfo;
//AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.LineToLift_05_12_ToLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.LineToLift_04_CheckLiftStatus);
runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯";
JobRunStep.Msg = runInfo;
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
System.Threading.Thread.Sleep(2000);
}
} }
#endregion #endregion
#region 电梯内无料车 #region 电梯内无料车
...@@ -368,7 +279,7 @@ namespace DeviceLibrary ...@@ -368,7 +279,7 @@ namespace DeviceLibrary
JobRunStep.ToNextStep(RunStep.LineToLift_06_02_TakeShelfOffAtLift); JobRunStep.ToNextStep(RunStep.LineToLift_06_02_TakeShelfOffAtLift);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,准备卸下料车"; runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,准备卸下料车";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}_{JobParam.CurTargetNode.Name}"); TakeShelfOffAtLift(agv, JobParam.CurTargetNode.Name);
} }
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_06_02_TakeShelfOffAtLift)) else if (JobRunStep.IsStep(RunStep.LineToLift_06_02_TakeShelfOffAtLift))
...@@ -382,15 +293,10 @@ namespace DeviceLibrary ...@@ -382,15 +293,10 @@ namespace DeviceLibrary
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId, 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, service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"电梯卸车")); $"电梯卸车"));
if (JobParam.GetMissionInfo().projectType.Equals(service.model.ProjectType.成品入库))
{
//设置该电梯内的产品是成品入库
lift.LiftContext.SetFinishedState(JobParam.CurTargetNode.Name, true);
}
runInfo = $"料车在{JobParam.CurTargetNode.AliceName}卸下完成,准备离开"; runInfo = $"料车在{JobParam.CurTargetNode.AliceName}卸下完成,准备离开";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.到达电梯, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.到达电梯, out string msg);
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}"); LeaveLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
...@@ -400,12 +306,6 @@ namespace DeviceLibrary ...@@ -400,12 +306,6 @@ namespace DeviceLibrary
{ {
JobRunStep.ToNextStep(RunStep.END); JobRunStep.ToNextStep(RunStep.END);
bool rtn = false; bool rtn = false;
if (JobParam.GetMissionInfo().projectType.Equals(service.model.ProjectType.成品入库))
{
//AGV离开
rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
}
else
{ {
//AGV离开 //AGV离开
rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv); rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv);
...@@ -414,6 +314,7 @@ namespace DeviceLibrary ...@@ -414,6 +314,7 @@ namespace DeviceLibrary
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯运行, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯运行, out string msg);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
ClearLiftNodeOccupied(agv);
} }
} }
#endregion #endregion
...@@ -422,7 +323,7 @@ namespace DeviceLibrary ...@@ -422,7 +323,7 @@ namespace DeviceLibrary
JobRunStep.EndJob(); JobRunStep.EndJob();
return null; return null;
} }
return this; return job;
} }
} }
......
using Common; using Common;
using DeviceLibrary.manager; using DeviceLibrary.manager;
using System.Data.Entity.Infrastructure;
namespace DeviceLibrary.bean.job namespace DeviceLibrary.bean.job
{ {
...@@ -20,6 +21,7 @@ namespace DeviceLibrary.bean.job ...@@ -20,6 +21,7 @@ namespace DeviceLibrary.bean.job
} }
public override Job Run(AgvInfo agv) public override Job Run(AgvInfo agv)
{ {
Job job = this;
agv.SetJobContext(new bean.agv.JobContext() agv.SetJobContext(new bean.agv.JobContext()
{ {
MissionId = JobParam.GetMissionInfo().missionId, MissionId = JobParam.GetMissionInfo().missionId,
...@@ -31,10 +33,35 @@ namespace DeviceLibrary.bean.job ...@@ -31,10 +33,35 @@ namespace DeviceLibrary.bean.job
}); });
if (JobRunStep.IsStep(RunStep.NONE)) if (JobRunStep.IsStep(RunStep.NONE))
{ {
if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_01_ToStandby);
runInfo = $"{JobParam.SrcNode.AliceName}有小车,去待机点";
JobRunStep.Msg = runInfo;
ToStandby(agv);
}
else
{
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_01_ToLift);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo;
ToLift(agv, $"{JobParam.SrcNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_01_ToStandby))
{
if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{
}
else
{
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_01_ToLift); JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_01_ToLift);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}"; runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.SrcNode.Name}"); ToLift(agv, $"{JobParam.SrcNode.Name}");
}
} }
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_01_ToLift)) else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_01_ToLift))
{ {
...@@ -44,7 +71,7 @@ namespace DeviceLibrary.bean.job ...@@ -44,7 +71,7 @@ namespace DeviceLibrary.bean.job
//上报状态 //上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId, 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, service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{ JobParam.SrcNode.Name }")); $"到达{JobParam.SrcNode.Name}"));
runInfo = $"到达{JobParam.SrcNode.AliceName},等待门开启"; runInfo = $"到达{JobParam.SrcNode.AliceName},等待门开启";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
...@@ -56,9 +83,9 @@ namespace DeviceLibrary.bean.job ...@@ -56,9 +83,9 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_02_02_EnterLift); JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_02_02_EnterLift);
runInfo = $"{JobParam.SrcNode.AliceName}门已开启,去取料点"; runInfo = $"{JobParam.SrcNode.AliceName}门已开启,去取料点";
//任务状态变更 //任务状态变更
lift.LiftContext.SetLiftOccupiedAgv(JobParam.SrcNode.Name,agv.IP); lift.LiftContext.SetLiftOccupiedAgv(JobParam.SrcNode.Name, agv.IP);
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯到达, out string msg); 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; JobRunStep.Msg = runInfo;
} }
} }
...@@ -84,7 +111,8 @@ namespace DeviceLibrary.bean.job ...@@ -84,7 +111,8 @@ namespace DeviceLibrary.bean.job
$"电梯取车")); $"电梯取车"));
runInfo = $"在{JobParam.SrcNode.AliceName}取料车完成,准备离开"; runInfo = $"在{JobParam.SrcNode.AliceName}取料车完成,准备离开";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}"); //AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}");
LeaveLift(agv, JobParam.SrcNode.Name);
} }
} }
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_04_LeaveLift)) else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_04_LeaveLift))
...@@ -93,20 +121,38 @@ namespace DeviceLibrary.bean.job ...@@ -93,20 +121,38 @@ namespace DeviceLibrary.bean.job
{ {
JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_05_CloseLiftDoor); JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_05_CloseLiftDoor);
//关门 //关门
bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv,false); bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv, false);
runInfo = $"离开{JobParam.SrcNode.AliceName},关闭电梯门:{rtn}"; runInfo = $"离开{JobParam.SrcNode.AliceName},关闭电梯门:{rtn}";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回离开电梯, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回离开电梯, out string msg);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
ClearLiftNodeOccupied(agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_05_CloseLiftDoor)) 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); 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); 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; JobRunStep.Msg = runInfo;
} }
else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_06_ToStore)) else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_06_ToStore))
...@@ -117,7 +163,7 @@ namespace DeviceLibrary.bean.job ...@@ -117,7 +163,7 @@ namespace DeviceLibrary.bean.job
//上报状态 //上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId, 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, service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{ JobParam.CurTargetNode.Name }")); $"到达{JobParam.CurTargetNode.Name}"));
runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,卸下料车"; runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,卸下料车";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, SettingString.TakeShelfOff); AllocateTask(agv, SettingString.TakeShelfOff);
...@@ -127,23 +173,45 @@ namespace DeviceLibrary.bean.job ...@@ -127,23 +173,45 @@ namespace DeviceLibrary.bean.job
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) 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); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.完成, out string msg);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
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, 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, 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)) else if (JobRunStep.IsStep(RunStep.END))
{ {
JobRunStep.EndJob(); job = null;
return null;
} }
return this; return job;
} }
} }
} }
...@@ -27,14 +27,14 @@ namespace DeviceLibrary ...@@ -27,14 +27,14 @@ namespace DeviceLibrary
/// <param name="agv"></param> /// <param name="agv"></param>
public override Job Run(AgvInfo agv) public override Job Run(AgvInfo agv)
{ {
agv.SetJobContext(new bean.agv.JobContext() //agv.SetJobContext(new bean.agv.JobContext()
{ //{
AgvTask = agv.TaskRunState.Task, // AgvTask = agv.TaskRunState.Task,
JobFullName = this.ToString(), // JobFullName = this.ToString(),
JobStep = JobRunStep.PreStep(), // JobStep = JobRunStep.PreStep(),
Name = agv.Name, // Name = agv.Name,
JobParam=JobParam // JobParam=JobParam
}); //});
if (JobRunStep.IsStep(RunStep.NONE)) if (JobRunStep.IsStep(RunStep.NONE))
{ {
{ {
...@@ -43,7 +43,7 @@ namespace DeviceLibrary ...@@ -43,7 +43,7 @@ namespace DeviceLibrary
JobRunStep.ToNextStep(RunStep.STANDBY_WAIT_REACH_STANDBY); JobRunStep.ToNextStep(RunStep.STANDBY_WAIT_REACH_STANDBY);
runInfo = "从" + JobParam.SrcNode + "回到待机位"; runInfo = "从" + JobParam.SrcNode + "回到待机位";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateStandbyTask(agv); ToStandby(agv);
} }
} }
......
...@@ -294,7 +294,7 @@ namespace DeviceLibrary.bean.job ...@@ -294,7 +294,7 @@ namespace DeviceLibrary.bean.job
{ {
if (agv.TaskRunState.CheckTaskFinished(agv.Name)) if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{ {
if (TargetIsOccupied(agv, JobParam.SrcNode.AliceName)) if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{ {
JobRunStep.ToNextStep(RunStep.Steel_LiftToLine_19_ToStandby); JobRunStep.ToNextStep(RunStep.Steel_LiftToLine_19_ToStandby);
runInfo = $"{JobParam.SrcNode.AliceName}有车,去停留点"; runInfo = $"{JobParam.SrcNode.AliceName}有车,去停留点";
...@@ -319,7 +319,7 @@ namespace DeviceLibrary.bean.job ...@@ -319,7 +319,7 @@ namespace DeviceLibrary.bean.job
} }
else if (JobRunStep.IsStep(RunStep.Steel_LiftToLine_19_ToStandby)) else if (JobRunStep.IsStep(RunStep.Steel_LiftToLine_19_ToStandby))
{ {
if (TargetIsOccupied(agv, JobParam.SrcNode.AliceName)) if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
{ {
} }
else else
......
...@@ -36,7 +36,7 @@ namespace DeviceLibrary ...@@ -36,7 +36,7 @@ namespace DeviceLibrary
{ {
JobRunStep.ToNextStep(RunStep.LineToLift_01_ToLine); JobRunStep.ToNextStep(RunStep.LineToLift_01_ToLine);
runInfo = $"任务开始:去{JobParam.SteelShelfNode.AliceName}的取料点"; runInfo = $"任务开始:去{JobParam.SteelShelfNode.AliceName}的取料点";
AllocateTask(agv, $"{JobParam.SteelShelfNode.Name}_{SettingString.PutShelfOn}"); ToPutShelfOn(agv, JobParam.SteelShelfNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
...@@ -54,7 +54,7 @@ namespace DeviceLibrary ...@@ -54,7 +54,7 @@ namespace DeviceLibrary
runInfo = $"到达{JobParam.SrcNode.AliceName}的取料点,开始拾取料车"; runInfo = $"到达{JobParam.SrcNode.AliceName}的取料点,开始拾取料车";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, SettingString.PutShelfOn); PutShelfOn(agv);
} }
} }
else if (JobRunStep.IsStep(RunStep.LineToLift_02_PutShelfOn)) else if (JobRunStep.IsStep(RunStep.LineToLift_02_PutShelfOn))
...@@ -67,7 +67,7 @@ namespace DeviceLibrary ...@@ -67,7 +67,7 @@ namespace DeviceLibrary
service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto, service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"取车")); $"取车"));
runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,去{JobParam.SrcNode.AliceName}放料点"; runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,去{JobParam.SrcNode.AliceName}放料点";
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.TakeShelfOff}"); ToTakeShelfOff(agv, JobParam.SrcNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
} }
...@@ -113,7 +113,7 @@ namespace DeviceLibrary ...@@ -113,7 +113,7 @@ namespace DeviceLibrary
runInfo = $"在{JobParam.SrcNode.AliceName}确认完成,去{JobParam.CurTargetNode.AliceName}"; runInfo = $"在{JobParam.SrcNode.AliceName}确认完成,去{JobParam.CurTargetNode.AliceName}";
//任务状态变更 //任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg); MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg);
AllocateTask(agv, JobParam.CurTargetNode.Name); ToLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
} }
...@@ -143,7 +143,7 @@ namespace DeviceLibrary ...@@ -143,7 +143,7 @@ namespace DeviceLibrary
JobRunStep.ToNextStep(RunStep.LineToLift_05_01_ToTemp1); JobRunStep.ToNextStep(RunStep.LineToLift_05_01_ToTemp1);
SetLiftOccupied(JobParam.CurTargetNode.Name, agv); SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有料车,去临时点1的卸料点,准备卸下车上料车"; runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有料车,去临时点1的卸料点,准备卸下车上料车";
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}"); ToTmp1TakeOff(agv, JobParam.CurTargetNode.Name);
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId); service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null) if (missionInfo != null)
{ {
...@@ -157,7 +157,7 @@ namespace DeviceLibrary ...@@ -157,7 +157,7 @@ namespace DeviceLibrary
JobRunStep.ToNextStep(RunStep.LineToLift_06_01_EnterLift); JobRunStep.ToNextStep(RunStep.LineToLift_06_01_EnterLift);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点"; runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点";
JobRunStep.Msg = runInfo; JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}"); ToTakeShelfOff(agv, JobParam.CurTargetNode.Name);
} }
} }
else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo())) else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
......
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.bean.job;
using DeviceLibrary.lift;
using DeviceLibrary.manager;
using DeviceLibrary.service.model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static System.Windows.Forms.AxHost;
namespace DeviceLibrary
{
public class SwitchShelfJob : Job
{
/// <summary>
/// 电梯交换料车任务
/// </summary>
/// <param name="agvPlae">小车当前位置</param>
public SwitchShelfJob(JobParam jobParam) : base(jobParam)
{
JobName = "电梯交换料车任务";
MissionInfo info= manager.MissionManager.GetMission(JobParam?.LiftStatus?.missionId ?? "");
liftMission = new MissionInfo() {
missionId=info.missionId,
state= info.state,
liftName = info.liftName,
sourcePoint=info.sourcePoint,
destinationPoint=info.destinationPoint,
needBack=info.needBack
};
}
public SwitchShelfJob() : base() { JobName = "电梯交换料车任务"; }
/// <summary>
/// 电梯内料车的任务信息
/// </summary>
service.model.MissionInfo liftMission;
private string missionInfo()
{
try
{
return $"【当前任务:{JobParam?.GetMissionInfo()?.missionId ?? ""}," +
$"{MissionManager.GetMission(JobParam?.GetMissionInfo()?.missionId ?? "")?.state.ToString() ?? ""}】" +
$"【电梯内任务:{liftMission?.missionId ?? ""}," +
$"{MissionManager.GetMission(liftMission?.missionId ?? "")?.state.ToString() ?? ""}】";
}
catch
{
return "";
}
}
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
});
if (JobRunStep.IsStep(RunStep.NONE))
{
JobRunStep.ToNextStep(RunStep.Switch_01_ToTmp1);
runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点1,{missionInfo()}";
ToTmp1TakeOff(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
else if (JobRunStep.IsStep(RunStep.Switch_01_ToTmp1))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_02_TakeShelfOffAtTmp1);
runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点1将待送料车卸下,,{missionInfo()}";
TakeShelfOff(agv);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_02_TakeShelfOffAtTmp1))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_03_ToLift);
runInfo = $"去{JobParam.CurTargetNode.AliceName},,{missionInfo()}";
MoveToNode(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_03_ToLift))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_04_EnterLift);
if (setMissionState(liftMission))
{
runInfo = $"到{JobParam.CurTargetNode.AliceName}的取料点,并设置任务状态,,{missionInfo()}";
}
else
runInfo = $"到{JobParam.CurTargetNode.AliceName}的取料点,未找到电梯内料架任务";
MoveToNodePutShelf(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_04_EnterLift))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_05_PutLiftShelfOn);
runInfo = $"在{JobParam.CurTargetNode.AliceName}的取料点拾取电梯内的料车,,{missionInfo()}";
PutLiftShelfOn(agv, JobParam.CurTargetNode.Name, liftMission);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_05_PutLiftShelfOn))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_06_LeaveLift);
runInfo = $"拾取完成,离开{JobParam.CurTargetNode.AliceName},{missionInfo()}";
LeaveLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_06_LeaveLift))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_07_ToTmp2);
if (setMissionState(liftMission))
{
runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2放料点,并设置任务状态,{missionInfo()}";
}
else
runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2放料点,未找到电梯内的料架任务";
ToTmp2TakeOff(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_07_ToTmp2))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_08_TakeShelfOffAtTpm2);
runInfo = $"将{JobParam.CurTargetNode.AliceName}内的料车卸在临时点2,{missionInfo()}";
TakeShelfOff(agv);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_08_TakeShelfOffAtTpm2))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_09_ReToTmp1);
runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点1取料点,{missionInfo()}";
ToTmp1PutOn(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_09_ReToTmp1))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_10_PutShelfOnAtTmp1);
runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点1拾取待送料车,{missionInfo()}";
PutShelfOn(agv);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_10_PutShelfOnAtTmp1))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_11_ToLift);
runInfo = $"去{JobParam.CurTargetNode.AliceName},{missionInfo()}";
MoveToNode(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_11_ToLift))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_12_EnterLift);
runInfo = $"去{JobParam.CurTargetNode.AliceName}的放料点,{missionInfo()}";
MoveToNodeTakeOff(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_12_EnterLift))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_13_TakeLiftShelfOff);
runInfo = $"在{JobParam.CurTargetNode.AliceName}卸下料车,{missionInfo()}";
TakeShelfOffAtLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_13_TakeLiftShelfOff))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_14_LeaveLift);
MissionInfo mission = MissionManager.GetMission(JobParam.GetMissionInfo().missionId);
MissionState state = getNextState(mission.state);
if (mission.projectType.Equals(ProjectType.移远成品入库) && SettingString.LIFT_D2.Equals(JobParam.CurTargetNode.Name))
{
state = MissionState.等待成品回收;
}
setMissionState(state);
runInfo = $"离开{JobParam.CurTargetNode.AliceName},设置任务状态,并清空任务占用,{missionInfo()}";
ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
LeaveLift(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_14_LeaveLift))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_15_CloseDoor);
MissionInfo mission = MissionManager.GetMission(JobParam.GetMissionInfo().missionId);
if (mission.projectType.Equals(ProjectType.移远成品入库) && SettingString.LIFT_D2.Equals(JobParam.CurTargetNode.Name))
{
runInfo = $"关闭{JobParam.CurTargetNode.AliceName}";
}
else
{
runInfo = $"关闭{JobParam.CurTargetNode.AliceName},并更新电梯运行信息";
LiftContext.UpdateRequestInfo(mission, agv, MissionIsBackState(mission));
}
JobRunStep.Msg = runInfo;
Thread.Sleep(1000);
}
}
else if (JobRunStep.IsStep(RunStep.Switch_15_CloseDoor))
{
JobRunStep.ToNextStep(RunStep.Switch_15_WaitDoorClose);
MissionInfo mission = MissionManager.GetMission(JobParam.GetMissionInfo().missionId);
if (mission.projectType.Equals(ProjectType.移远成品入库) && SettingString.LIFT_D2.Equals(JobParam.CurTargetNode.Name))
{
LiftContext.FinishedProduct(JobParam.CurTargetNode.Name, agv);
Thread.Sleep(5000);
}
else
{
MissionState state = getNextState(mission.state);
setMissionState(state);
}
bool continueUse = false;
if ((mission.state >= MissionState.到达电梯 && mission.state <= MissionState.电梯运行)||
(mission.state >= MissionState.返回到达电梯内 && mission.state <= MissionState.返回电梯运行))
continueUse = true;
//关门
bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, continueUse);
Thread.Sleep(2000);
if (mission.projectType.Equals(ProjectType.移远成品入库) && SettingString.LIFT_D2.Equals(JobParam.CurTargetNode.Name))
{
LiftContext.CloseFinishedProduct(JobParam.CurTargetNode.Name, agv);
}
ClearLiftNodeOccupied(agv);
runInfo = $"离开{JobParam.CurTargetNode.AliceName},关闭门:{rtn},continueUse={continueUse}";
JobRunStep.Msg = runInfo;
}
else if (JobRunStep.IsStep(RunStep.Switch_15_WaitDoorClose))
{
//if (!lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name))
{
JobRunStep.ToNextStep(RunStep.Switch_16_ReToTmp2);
runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2取料点,{missionInfo()}";
ToTmp2PutOn(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
//else if (JobRunStep.IsTimeOut(5))
//{
// JobRunStep.ToNextStep(RunStep.Switch_15_WaitDoorClose);
// bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv);
// runInfo = $"重新发送关闭门{JobParam.CurTargetNode.AliceName},{rtn}";
//}
}
else if (JobRunStep.IsStep(RunStep.Switch_16_ReToTmp2))
{
if (AGVTaskIsFinished(agv))
{
JobRunStep.ToNextStep(RunStep.Switch_17_PutShelfOnAtTmp2);
runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点2拾取电梯内的料车,{missionInfo()}";
PutShelfOn(agv, liftMission);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.Switch_17_PutShelfOnAtTmp2))
{
if (AGVTaskIsFinished(agv))
{
if (CheckMIssionInlift(MissionManager.GetMission(liftMission.missionId)))
{
JobRunStep.ToNextStep(RunStep.Switch_19_ReturnShelf);
}
else
{
JobRunStep.ToNextStep(RunStep.Switch_18_SendShelf);
}
}
}
else if (JobRunStep.IsStep(RunStep.Switch_18_SendShelf))
{
JobRunStep.ToNextStep(RunStep.END);
MissionInfo missionInfo = MissionManager.GetMission(liftMission.missionId);
//if(missionInfo ==null)
//{
// job = null;
// runInfo = $"未查询到任务信息,结束任务:{liftMission.missionId}";
// JobRunStep.Msg = runInfo;
//}
//else
if (service.model.MissionInfo.IsFinishedProdcut(missionInfo))
{
if (JobParam.CurTargetNode.Name.Equals(SettingString.LIFT_D2))//电梯内的料架为移远成品空料车
{
Node src = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
Node dest = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
MissionManager.SetMissionOccupied(missionInfo, agv);
job = new F1LiftD2ToLiftC1Job(jobParam);
job.JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_06_CloseLiftDoor);
job.JobRunStep.Msg = $"从{JobParam.CurTargetNode.AliceName}取料完成,继续执行任务:{JsonHelper.SerializeObject(missionInfo)}";
}
else//电梯内的料架为移远成品满料车
{
Node src = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
Node dest = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
MissionManager.SetMissionOccupied(missionInfo, agv);
job = new F1LiftC1ToLiftD2Job(jobParam);
job.JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_06_CloseLiftDoor);
job.JobRunStep.Msg = $"从{JobParam.CurTargetNode.AliceName}取料完成,继续执行任务:{JsonHelper.SerializeObject(missionInfo)}";
}
}
else
{
Node src = manager.NodeManager.GetNode(missionInfo.liftName, NodeType.Lift);
string[] destTmp = missionInfo.destinationPoint.Split(',');
string[] dests = destTmp.Distinct().ToArray();
Node dest = manager.NodeManager.GetNode(dests.Length > 1 ? dests[0] : missionInfo.destinationPoint, NodeType.Node);
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
if (dests.Length > 1)
{
for (int i = 1; i < dests.Length; i++)
{
Node node = manager.NodeManager.GetNode(dests[i], NodeType.Node);
if (node != null)
jobParam.TargetNodes.Add(node);
else
{
LogUtil.error($"无法生成任务,因不存在的节点:{dests[i]}");
job = null;
}
}
}
job = new LiftToLinesJob(jobParam);
job.JobRunStep.ToNextStep(RunStep.SD_LiftToLine_06_CloseLiftDoor);
job.JobRunStep.Msg = $"从{JobParam.CurTargetNode.AliceName}取料完成,继续执行任务:{JsonHelper.SerializeObject(missionInfo)}";
}
}
else if (JobRunStep.IsStep(RunStep.Switch_19_ReturnShelf))
{
JobRunStep.ToNextStep(RunStep.END);
MissionInfo missionInfo = MissionManager.GetMission(liftMission.missionId);
Node src = manager.NodeManager.GetNode(missionInfo.liftName, NodeType.Lift);
Node dest = manager.NodeManager.GetNode(missionInfo.sourcePoint, NodeType.Node);
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
MissionManager.SetMissionOccupied(missionInfo, agv);
job = new ShelfBackLiftToStoreJob(jobParam);
job.JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_05_CloseLiftDoor);
job.JobRunStep.Msg = $"从{JobParam.CurTargetNode.AliceName}取料完成,继续执行任务:{JsonHelper.SerializeObject(missionInfo)}";
}
else if (JobRunStep.IsStep(RunStep.END))
{
}
return job;
}
}
}
using Common; using Common;
using DeviceLibrary.bean.job; using DeviceLibrary.bean.job;
using DeviceLibrary.lift;
using DeviceLibrary.manager; using DeviceLibrary.manager;
using System;
namespace DeviceLibrary.bean.jobType namespace DeviceLibrary.bean.jobType
{ {
...@@ -15,19 +17,26 @@ namespace DeviceLibrary.bean.jobType ...@@ -15,19 +17,26 @@ namespace DeviceLibrary.bean.jobType
return null; return null;
else else
{ {
if(agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))//agv.Scope.Floor.Equals(1) && if (agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))//agv.Scope.Floor.Equals(1) &&
{ {
service.model.MissionInfo missionInfo = manager.MissionManager.ShelfBackMission(agv); service.model.MissionInfo missionInfo = manager.MissionManager.ShelfBackMission(agv);
if(missionInfo!=null) if (missionInfo != null)
{ {
if (!liftname.Equals(missionInfo?.liftName)) if (!liftname.Equals(missionInfo?.liftName))
return null; return null;
if (CheckHasSameJob(agv,liftname))
{
return null;
}
if (AgvAtPlace(agv, liftname))
return null;
//if (service.model.MissionInfo.IsFinishedProdcut(missionInfo)) //if (service.model.MissionInfo.IsFinishedProdcut(missionInfo))
// return null; // return null;
Node src = manager.NodeManager.GetNode(liftname, NodeType.Lift); Node src = manager.NodeManager.GetNode(liftname, NodeType.Lift);
string[] dests = lift.destinationPoint.Split(','); string[] dests = lift.destinationPoint.Split(',');
Node dest = manager.NodeManager.GetNode(dests.Length > 1 ? dests[0] : lift.destinationPoint, NodeType.Node); Node dest = manager.NodeManager.GetNode(dests.Length > 1 ? dests[0] : lift.destinationPoint, NodeType.Node);
JobParam jobParam = new JobParam(src, dest,null,missionInfo); JobParam jobParam = new JobParam(src, dest, null, missionInfo);
LiftContext.SetLiftNodeOccupied(agv, liftname);
MissionManager.SetMissionOccupied(missionInfo, agv); MissionManager.SetMissionOccupied(missionInfo, agv);
return new ShelfBackLiftToStoreJob(jobParam); return new ShelfBackLiftToStoreJob(jobParam);
} }
...@@ -35,5 +44,22 @@ namespace DeviceLibrary.bean.jobType ...@@ -35,5 +44,22 @@ namespace DeviceLibrary.bean.jobType
} }
return null; return null;
} }
bool CheckHasSameJob(AgvInfo agv,string liftname)
{
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 && liftname.Equals(s?.CurJob?.JobParam?.CurTargetNode?.Name??""))));
if (agvInfo != null)
return true;
}
catch
{
return false;
}
return false;
}
} }
} }
...@@ -21,13 +21,13 @@ namespace DeviceLibrary.bean.jobType ...@@ -21,13 +21,13 @@ namespace DeviceLibrary.bean.jobType
{ {
if(agv.Scope.Floor.Equals(1) && agv.HasFinishedShelfInLift(out string liftname, out lift.LiftStatus lift)) if(agv.Scope.Floor.Equals(1) && agv.HasFinishedShelfInLift(out string liftname, out lift.LiftStatus lift))
{ {
//if (CheckOtherRobotState(agv, SettingString.LIFT_C1) || CheckOtherRobotState(agv, SettingString.LIFT_D2))
//{
// return null;
//}
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1SendFullFinishedC1ToD2Mission(agv); service.model.MissionInfo missionInfo = manager.MissionManager.GetF1SendFullFinishedC1ToD2Mission(agv);
if(missionInfo!=null) if(missionInfo!=null)
{ {
if (TargetIsOccupied(agv, SettingString.LIFT_C1))//TargetIsOccupied(agv, SettingString.LIFT_D2) ||
{
return null;
}
if (service.model.MissionInfo.IsFinishedProdcut(missionInfo)) if (service.model.MissionInfo.IsFinishedProdcut(missionInfo))
{ {
Node src = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift); Node src = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
...@@ -43,10 +43,11 @@ namespace DeviceLibrary.bean.jobType ...@@ -43,10 +43,11 @@ namespace DeviceLibrary.bean.jobType
} }
bool CheckHasSameJob(AgvInfo agv) bool CheckHasSameJob(AgvInfo agv)
{ {
return false;
try try
{ {
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop) 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.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) if (agvInfo != null)
return true; return true;
} }
......
...@@ -19,10 +19,10 @@ namespace DeviceLibrary.bean.jobType ...@@ -19,10 +19,10 @@ namespace DeviceLibrary.bean.jobType
{ {
if (agv.Scope.Floor.Equals(1) && agv.HasFinishedEmptyShelfInLift(out string liftname, out lift.LiftStatus lift)) if (agv.Scope.Floor.Equals(1) && agv.HasFinishedEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))
{ {
//if (CheckOtherRobotState(agv, SettingString.LIFT_C1) || CheckOtherRobotState(agv, SettingString.LIFT_D2)) if (TargetIsOccupied(agv, SettingString.LIFT_D2))
//{ {
// return null; return null;
//} }
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1FinishedD2ToC1Mission(agv); service.model.MissionInfo missionInfo = manager.MissionManager.GetF1FinishedD2ToC1Mission(agv);
if (missionInfo != null) if (missionInfo != null)
{ {
...@@ -38,10 +38,11 @@ namespace DeviceLibrary.bean.jobType ...@@ -38,10 +38,11 @@ namespace DeviceLibrary.bean.jobType
} }
bool CheckHasSameJob(AgvInfo agv) bool CheckHasSameJob(AgvInfo agv)
{ {
return false;
try try
{ {
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop) 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.IP.Equals(agv.IP) && s.CurJob != null && (s.CurJob is F1LiftD2ToLiftC1Job || s.CurJob is F1LiftC1ToLiftD2Job || s.CurJob is LineToLiftJob));
if (agvInfo != null) if (agvInfo != null)
return true; return true;
} }
......
using Common; using Common;
using DeviceLibrary.lift;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
...@@ -17,39 +18,57 @@ namespace DeviceLibrary ...@@ -17,39 +18,57 @@ namespace DeviceLibrary
{ {
return null; 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>
/// 检查其他机器人是否有电梯任务 /// 目标点是否有小车
/// </summary> /// </summary>
/// <param name="agvInfo"></param> /// <param name="agv"></param>
/// <param name="liftname"></param> /// <param name="targetName"></param>
/// <returns>true:有</returns> /// <returns></returns>
protected bool CheckOtherRobotState(AgvInfo agvInfo, string liftname) protected bool TargetIsOccupied(AgvInfo agv, string targetName)
{ {
var allAgv = AGVManager.agvInfo.FindAll(s => s.Auto && !agvInfo.IP.Equals(s.IP) &&
agvInfo.Scope.Workshop.Equals(s.Scope.Workshop));
try try
{ {
AgvInfo agvInfo1 = allAgv.Find(s => s.Place != null && s.Place.Name.Contains(liftname)); return LiftContext.OtherAGVIsInLift(agv, targetName);
//AgvInfo agvInfo1 = allAgv.Find(s => s.CurJob != null && s.CurJob.JobParam != null &&
// ((s.CurJob.JobParam.SrcNode != null && s.CurJob.JobParam.SrcNode.Name.Contains(liftname)) &&
// (s.CurJob.JobParam.CurTargetNode != null && s.CurJob.JobParam.CurTargetNode.Name.Contains(liftname))));
if (agvInfo1 != null)
return true;
} }
catch (Exception ex) catch (Exception ex)
{ {
foreach (var item in allAgv) LogUtil.error($"TargetIsOccupied:{agv.Name},{JsonHelper.SerializeObject(AGVManager.agvInfo)}", ex);
return false;
}
}
/// <summary>
/// 只有去电梯取料料架使用
/// </summary>
/// <param name="agv"></param>
/// <param name="targetName"></param>
/// <returns></returns>
protected bool AgvAtPlace(AgvInfo agv, string targetName)
{
try
{ {
LogUtil.error($"CheckOtherRobotState,{agvInfo.Name},{liftname}: {JsonHelper.SerializeObject(item)}", ex); 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 true;
} }
}
return false;
}
}
catch (Exception ex)
{
LogUtil.error($"AgvAtPlace:{agv.Name},{JsonHelper.SerializeObject(AGVManager.agvInfo)}", ex);
return false; return false;
} }
} }
}
} }
...@@ -6,6 +6,7 @@ using DeviceLibrary.manager; ...@@ -6,6 +6,7 @@ using DeviceLibrary.manager;
using DeviceLibrary.bean; using DeviceLibrary.bean;
using DeviceLibrary.bean.job; using DeviceLibrary.bean.job;
using System; using System;
using DeviceLibrary.lift;
namespace DeviceLibrary namespace DeviceLibrary
{ {
...@@ -26,6 +27,8 @@ namespace DeviceLibrary ...@@ -26,6 +27,8 @@ namespace DeviceLibrary
return null; return null;
else if (CheckHasSameJob(agv)) else if (CheckHasSameJob(agv))
return null; return null;
else if (CheckHasSendJob(agv))
return null;
else else
{ {
if (agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))//!agv.Scope.Floor.Equals(1) && if (agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))//!agv.Scope.Floor.Equals(1) &&
...@@ -35,7 +38,7 @@ namespace DeviceLibrary ...@@ -35,7 +38,7 @@ namespace DeviceLibrary
{ {
if (!liftname.Equals(missionInfo?.liftName)) if (!liftname.Equals(missionInfo?.liftName))
return null; return null;
if (TargetIsOccupied(agv, liftname)) if (AgvAtPlace(agv, liftname))
return null; return null;
if (service.model.MissionInfo.IsFinishedProdcut(missionInfo)) if (service.model.MissionInfo.IsFinishedProdcut(missionInfo))
return null; return null;
...@@ -59,6 +62,9 @@ namespace DeviceLibrary ...@@ -59,6 +62,9 @@ namespace DeviceLibrary
} }
} }
LiftContext.SetLiftNodeOccupied(agv, liftname);
MissionManager.SetMissionOccupied(missionInfo, agv);
MissionManager.Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return new LiftToLinesJob(jobParam); return new LiftToLinesJob(jobParam);
} }
} }
...@@ -68,12 +74,13 @@ namespace DeviceLibrary ...@@ -68,12 +74,13 @@ namespace DeviceLibrary
bool CheckHasSameJob(AgvInfo agv) bool CheckHasSameJob(AgvInfo agv)
{ {
return false;
try try
{ {
if (agv.Scope.Workshop.Equals("1F")) 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.CurJob is LiftToLinesJob ) && s.Scope.Workshop.Equals("1F")); && s.CurJob != null && (s.CurJob is LiftToLinesJob));
if (agvInfo != null) if (agvInfo != null)
return true; return true;
} }
...@@ -88,34 +95,32 @@ namespace DeviceLibrary ...@@ -88,34 +95,32 @@ namespace DeviceLibrary
} }
return false; return false;
} }
bool CheckHasSendJob(AgvInfo agv)
bool TargetIsOccupied(AgvInfo agv, string targetName)
{ {
return false;
try try
{ {
if (agv.Scope.Equals("1F")) if (agv.Scope.Workshop.Equals("1F"))
{ {
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP) AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && !s.IP.Equals(agv.IP)&&s.Scope.Workshop.Equals(agv.Scope.Workshop)
&& agv.Scope.Workshop.Equals(s.Scope.Workshop) && s.Scope.Equals("1F")); && s.CurJob != null && s.Scope.Workshop.Equals("1F") && (s.CurJob is LineToLiftJob || s.CurJob is F1LiftC1ToLiftD2Job
|| s.CurJob is F1LiftD2ToLiftC1Job));
if (agvInfo != null) if (agvInfo != null)
{
//if (agvInfo?.Place.Name.Contains(targetName) ?? false)
// return true;
if (agvInfo?.TaskRunState?.Task?.Name.Equals(targetName) ?? false)
{
return true; return true;
} }
}
}
else else
return false; {
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 (Exception ex) catch
{ {
LogUtil.error($"TargetIsOccupied:{agv.Name},{JsonHelper.SerializeObject(AGVManager.agvInfo)}", ex);
return false; return false;
} }
return false;
} }
} }
} }
using Common; using Common;
using DeviceLibrary.bean.job; using DeviceLibrary.bean.job;
using DeviceLibrary.lift;
using DeviceLibrary.manager; using DeviceLibrary.manager;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
...@@ -18,6 +19,8 @@ namespace DeviceLibrary.bean.jobType ...@@ -18,6 +19,8 @@ namespace DeviceLibrary.bean.jobType
{ {
if (!agv.IsIdle()) if (!agv.IsIdle())
return null; return null;
if (LiftContext.CheckHasEmptyFinished(agv, SettingString.LIFT_D2, out LiftStatus liftStatus))
return null;
service.model.MissionInfo missionInfo = manager.MissionManager.GetLineToLiftMission(agv, out string liftname); service.model.MissionInfo missionInfo = manager.MissionManager.GetLineToLiftMission(agv, out string liftname);
if (missionInfo != null) if (missionInfo != null)
{ {
...@@ -35,10 +38,10 @@ namespace DeviceLibrary.bean.jobType ...@@ -35,10 +38,10 @@ namespace DeviceLibrary.bean.jobType
Common.LogUtil.error($"无法生成任务,电梯不存在:{liftname}"); Common.LogUtil.error($"无法生成任务,电梯不存在:{liftname}");
return null; return null;
} }
if (CheckOtherRobotState(agv, liftname)) //if (TargetIsOccupied(agv, liftname))
{ //{
return null; // return null;
} //}
JobParam jobParam = new JobParam(src, dest, null, missionInfo); JobParam jobParam = new JobParam(src, dest, null, missionInfo);
MissionManager.SetMissionOccupied(missionInfo, agv); MissionManager.SetMissionOccupied(missionInfo, agv);
MissionManager.Log.Info($"执行任务[{agv.Name}][LineToLiftJobType]{JsonHelper.SerializeObject(missionInfo)}"); MissionManager.Log.Info($"执行任务[{agv.Name}][LineToLiftJobType]{JsonHelper.SerializeObject(missionInfo)}");
...@@ -49,19 +52,19 @@ namespace DeviceLibrary.bean.jobType ...@@ -49,19 +52,19 @@ namespace DeviceLibrary.bean.jobType
return null; return null;
} }
bool CheckHasSameJob(AgvInfo agv,string liftname) bool CheckHasSameJob(AgvInfo agv, string liftname)
{ {
return false;
try try
{ {
if (agv.Scope.Workshop.Equals("1F")) 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.Scope.Workshop.Equals(agv.Scope.Workshop) &&
s.Scope.Workshop.Equals("1F") !s.IP.Equals(agv.IP)&&s.CurJob != null && ( s.CurJob is F1LiftC1ToLiftD2Job
&& s.CurJob != null && (s.CurJob is LineToLiftJob || s.CurJob is F1LiftC1ToLiftD2Job || s.CurJob is F1LiftD2ToLiftC1Job));//s.CurJob is LineToLiftJob ||
|| s.CurJob is F1LiftD2ToLiftC1Job));
if (agvInfo != null) if (agvInfo != null)
{ {
if(agvInfo?.CurJob?.JobParam?.GetMissionInfo()?.liftName?.Equals(liftname)??true) if (agvInfo?.CurJob?.JobParam?.GetMissionInfo()?.liftName?.Equals(liftname) ?? true)
{ {
return true; return true;
} }
...@@ -71,11 +74,19 @@ namespace DeviceLibrary.bean.jobType ...@@ -71,11 +74,19 @@ namespace DeviceLibrary.bean.jobType
// return true; // return true;
} }
else else
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop) &&
!s.IP.Equals(agv.IP) && s.CurJob != null && (s.CurJob is LineToLiftJob));
if (agvInfo != null)
{
return true;
}
}
return false; return false;
} }
catch(Exception ex) catch (Exception ex)
{ {
LogUtil.error("LineToLiftJobType CheckHasSameJob",ex); LogUtil.error("LineToLiftJobType CheckHasSameJob", ex);
return true; return true;
} }
return false; return false;
......
using Common;
using DeviceLibrary.bean.job;
using DeviceLibrary.lift;
using DeviceLibrary.manager;
using DeviceLibrary.service.model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary.bean.jobType
{
/// <summary>
/// 从缓存点取料并送入电梯内
/// </summary>
public class ShelfBuffToLiftJobType : JobType
{
public override Job GetNewJob(AgvInfo agv)
{
if (!agv.IsIdle())
return null;
if (LiftContext.CheckHasEmptyFinished(agv, SettingString.LIFT_D2, out LiftStatus liftStatus))
return null;
service.model.MissionInfo missionInfo = manager.MissionManager.BuffToLiftMission(agv);
if (missionInfo != null)
{
if (CheckHasSameJob(agv, missionInfo.liftName))
return null;
Node src = manager.NodeManager.GetNode(SettingString.ShelfBuff, NodeType.Node);
Node dest = manager.NodeManager.GetNode(missionInfo.liftName, NodeType.Lift);
if (src == null)
{
Common.LogUtil.error($"无法生成任务,起始点不存在:{missionInfo.sourcePoint}");
return null;
}
if (dest == null)
{
Common.LogUtil.error($"无法生成任务,电梯不存在:{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)}");
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"))
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s => s.Auto && s.Scope.Workshop.Equals(agv.Scope.Workshop) &&
s.Scope.Workshop.Equals("1F")
&& s.CurJob != null && (s.CurJob is LineToLiftJob || s.CurJob is F1LiftC1ToLiftD2Job
|| s.CurJob is F1LiftD2ToLiftC1Job));
if (agvInfo != null)
{
if (agvInfo?.CurJob?.JobParam?.GetMissionInfo()?.liftName?.Equals(liftname) ?? true)
{
return true;
}
}
//if (agvInfo != null)
// return true;
}
else
return false;
}
catch (Exception ex)
{
LogUtil.error("LineToLiftJobType CheckHasSameJob", ex);
return true;
}
return false;
}
}
}
...@@ -5,6 +5,7 @@ using System.Linq; ...@@ -5,6 +5,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web.Management;
using static DeviceLibrary.OpManager; using static DeviceLibrary.OpManager;
namespace DeviceLibrary.lift namespace DeviceLibrary.lift
...@@ -41,11 +42,92 @@ namespace DeviceLibrary.lift ...@@ -41,11 +42,92 @@ namespace DeviceLibrary.lift
{ {
if (liftStatus?.HasEmptyFinishedShelf ?? false)//D2电梯有成品空架子,不返回门状态 if (liftStatus?.HasEmptyFinishedShelf ?? false)//D2电梯有成品空架子,不返回门状态
{ {
//返回一个成品任务id
liftStatus.missionId = manager.MissionManager.GetMissionIdByEmptyFinishedShelfInLift(SettingString.LIFT_C1);
return true; return true;
} }
} }
return false; return false;
} }
public static string GetLiftNodeOccupiedInfo()
{
try
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("电梯位置占用信息");
foreach (var item in lifts)
{
sb.Append(item.Key + ":");
sb.AppendLine("[点位占用:"+string.Join(";", item.Value.Agvs) +"][电梯使用:"+item.Value.UsingAgv+"]");
}
return sb.ToString();
}
catch
{
}
return "";
}
/// <summary>
/// 设置电梯节点的占用
/// </summary>
/// <param name="agv"></param>
/// <param name="liftName"></param>
public static void SetLiftNodeOccupied(AgvInfo agv, string liftName = "")
{
try
{
if (string.IsNullOrEmpty(liftName))
{
foreach (var item in lifts.Values)
{
if (item.Agvs != null && item.Agvs.Contains(agv.IP))
{
item.Agvs.Remove(agv.IP);
LogUtil.info($"【{agv.Name}】清除电梯节点占用:{string.Join(",",item.Agvs)}");
}
}
}
else
{
if (!lifts[liftName].Agvs.Contains(agv.IP))
{
lifts[liftName].Agvs.Add(agv.IP);
LogUtil.info($"【{agv.Name}】设置电梯【{liftName}】节点占用:{string.Join(",", lifts[liftName].Agvs)}");
}
}
}
catch (Exception ex)
{
LogUtil.error($"SetLiftOccupied: {agv.IP},{liftName}", ex);
}
}
/// <summary>
/// 同车间的其他小车是否在电梯处
/// </summary>
/// <param name="agv"></param>
/// <param name="liftName"></param>
/// <returns></returns>
public static bool OtherAGVIsInLift(AgvInfo agv, string liftName)
{
try
{
AgvInfo agvInfo = AGVManager.agvInfo.Find(s =>
s.Scope.Workshop.Equals(agv.Scope.Workshop) && !s.IP.Equals(agv.IP)&&s.Auto);
if (agvInfo != null)
{
return lifts[liftName].Agvs.Contains(agvInfo.IP);
}
else
return false;
}
catch(Exception ex)
{
LogUtil.error($"OtherAGVIsInLift: {agv.IP},{liftName}",ex);
}
return false;
}
/// <summary> /// <summary>
/// 电梯是否开门 /// 电梯是否开门
/// </summary> /// </summary>
...@@ -79,7 +161,7 @@ namespace DeviceLibrary.lift ...@@ -79,7 +161,7 @@ namespace DeviceLibrary.lift
/// <returns>true:是</returns> /// <returns>true:是</returns>
public static bool IsOccupied(AgvInfo agv, string liftId) public static bool IsOccupied(AgvInfo agv, string liftId)
{ {
return lifts[liftId].OccupiedAgv.Equals(agv.IP); return lifts[liftId].UsingAgv.Equals(agv.IP);
} }
/// <summary> /// <summary>
/// 请求使用电梯 /// 请求使用电梯
...@@ -135,6 +217,58 @@ namespace DeviceLibrary.lift ...@@ -135,6 +217,58 @@ namespace DeviceLibrary.lift
return rtn; return rtn;
} }
/// <summary> /// <summary>
/// 更新请求信息
/// </summary>
/// <param name="missionInfo"></param>
/// <param name="agvInfo"></param>
/// <param name="isback"></param>
/// <returns></returns>
public static bool UpdateRequestInfo(service.model.MissionInfo missionInfo, AgvInfo agvInfo, bool isback = false)
{
service.model.SendInInfo info;
bool rtn = false;
if (isback)//返回
{
if (!AGVManager.GetsysClientBy(missionInfo.sourceFloor, missionInfo.liftName, out string destclient))
{
Common.LogUtil.error($"请求电梯失败,因目的系统标识获取失败:floor={agvInfo.Scope.Floor},lift={missionInfo.liftName}");
return false;
}
info = new service.model.SendInInfo()
{
liftId = missionInfo.liftName,
destinationFloor = missionInfo.sourceFloor,
destinationPoint = missionInfo.sourcePoint,
destinationClient = destclient,
sourceFloor = missionInfo.destinationFloor,
sourceClient = agvInfo.Client,
updateInfo=true
};
}
else
{
if (!AGVManager.GetsysClientBy(missionInfo.destinationFloor, missionInfo.liftName, out string destclient))
{
Common.LogUtil.error($"请求电梯失败,因目的系统标识获取失败:floor={agvInfo.Scope.Floor},lift={missionInfo.liftName}");
return false;
}
info = new service.model.SendInInfo()
{
liftId = missionInfo.liftName,
sourceClient = agvInfo.Client,
sourceFloor = missionInfo.sourceFloor,
sourcePoint = missionInfo.sourcePoint,
destinationClient = destclient,
destinationFloor = missionInfo.destinationFloor,
destinationPoint = missionInfo.destinationPoint,
updateInfo = true
};
}
LogUtil.info($"更新电梯请求信息:{JsonHelper.SerializeObject(info)}");
rtn = HttpManager.RequestSendIn(info);
return rtn;
}
/// <summary>
/// 成品呼叫 /// 成品呼叫
/// </summary> /// </summary>
/// <param name="missionInfo"></param> /// <param name="missionInfo"></param>
...@@ -314,19 +448,19 @@ namespace DeviceLibrary.lift ...@@ -314,19 +448,19 @@ namespace DeviceLibrary.lift
/// <param name="agvIp"></param> /// <param name="agvIp"></param>
public static void SetLiftOccupiedAgv(string liftId, string agvIp) public static void SetLiftOccupiedAgv(string liftId, string agvIp)
{ {
lifts[liftId].OccupiedAgv = agvIp; lifts[liftId].UsingAgv = agvIp;
Common.LogUtil.info($"设置电梯占用:{liftId},{agvIp}【{JsonHelper.SerializeObject(lifts)}】"); Common.LogUtil.info($"使用电梯:{liftId},{agvIp}【{JsonHelper.SerializeObject(lifts)}】");
} }
public static void ResetLiftOccupiedAgv(string liftId) public static void ResetLiftOccupiedAgv(string liftId)
{ {
try try
{ {
lifts[liftId].OccupiedAgv = ""; lifts[liftId].UsingAgv = "";
Common.LogUtil.info($"清除电梯占用:{liftId}【{JsonHelper.SerializeObject(lifts)}】"); Common.LogUtil.info($"清除使用电梯:{liftId}【{JsonHelper.SerializeObject(lifts)}】");
} }
catch (Exception ex) catch (Exception ex)
{ {
Common.LogUtil.error($"清除电梯占用失败:{liftId}", ex); Common.LogUtil.error($"清除使用电梯失败:{liftId}", ex);
} }
} }
public static void ResetLiftOccupiedAgv(AgvInfo agv) public static void ResetLiftOccupiedAgv(AgvInfo agv)
...@@ -335,17 +469,17 @@ namespace DeviceLibrary.lift ...@@ -335,17 +469,17 @@ namespace DeviceLibrary.lift
{ {
foreach (var item in lifts.Values) foreach (var item in lifts.Values)
{ {
if (agv.IP.Equals(item.OccupiedAgv)) if (agv.IP.Equals(item.UsingAgv))
{ {
item.OccupiedAgv = ""; item.UsingAgv = "";
Common.LogUtil.info($"{agv.Name}清除电梯占用:【{JsonHelper.SerializeObject(lifts)}】"); Common.LogUtil.info($"{agv.Name}清除使用电梯:【{JsonHelper.SerializeObject(lifts)}】");
} }
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
Common.LogUtil.error($"{agv.Name}清除电梯占用失败", ex); Common.LogUtil.error($"{agv.Name}清除使用电梯失败", ex);
} }
} }
/// <summary> /// <summary>
...@@ -355,8 +489,8 @@ namespace DeviceLibrary.lift ...@@ -355,8 +489,8 @@ namespace DeviceLibrary.lift
/// <returns>true:占用</returns> /// <returns>true:占用</returns>
public static bool CheckLiftOccupied(string liftId) public static bool CheckLiftOccupied(string liftId)
{ {
LogUtil.debug($"检查电梯{liftId}是否被用:【{JsonHelper.SerializeObject(lifts)}】"); LogUtil.debug($"检查电梯{liftId}是否被使用:【{JsonHelper.SerializeObject(lifts)}】");
return !lifts[liftId].OccupiedAgv.Equals(""); return !lifts[liftId].UsingAgv.Equals("");
} }
/// <summary> /// <summary>
/// 获取电梯状态 /// 获取电梯状态
......
...@@ -9,7 +9,11 @@ namespace DeviceLibrary.lift ...@@ -9,7 +9,11 @@ namespace DeviceLibrary.lift
public class LiftInfo public class LiftInfo
{ {
public LiftStatus LiftStatus { get; set; } public LiftStatus LiftStatus { get; set; }
public string OccupiedAgv { get; set; } = ""; public string UsingAgv { get; set; } = "";
/// <summary>
/// 占用电梯的小车名
/// </summary>
public List<string> Agvs { get; set; } = new List<string>();
public LiftInfo() public LiftInfo()
{ {
LiftStatus = new LiftStatus(); LiftStatus = new LiftStatus();
......
...@@ -66,6 +66,7 @@ namespace DeviceLibrary ...@@ -66,6 +66,7 @@ namespace DeviceLibrary
jobTypes.Add(new F1LiftD2ToLiftC1JobType()); jobTypes.Add(new F1LiftD2ToLiftC1JobType());
jobTypes.Add(new LiftToLinesJobType()); jobTypes.Add(new LiftToLinesJobType());
jobTypes.Add(new BackLiftToLineJobType()); jobTypes.Add(new BackLiftToLineJobType());
jobTypes.Add(new ShelfBuffToLiftJobType());
jobTypes.Add(new LineToLiftJobType()); jobTypes.Add(new LineToLiftJobType());
jobTypes.Add(new LineOneToManyJobType()); jobTypes.Add(new LineOneToManyJobType());
jobTypes.Add(new SteelLineToLiftJobType()); jobTypes.Add(new SteelLineToLiftJobType());
......
...@@ -255,6 +255,33 @@ namespace DeviceLibrary.manager ...@@ -255,6 +255,33 @@ namespace DeviceLibrary.manager
} }
return null; return null;
} }
/// <summary>
/// 获取料架缓存点的任务
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
public static MissionInfo BuffToLiftMission(AgvInfo agv)
{
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.state.Equals(MissionState.料架缓存) &&
agv.Scope.Tasks.Contains(s.projectType.ToString())
));
if (missionInfo != null && AgvCanGetMission(missionInfo))
return missionInfo;
}
catch (Exception e)
{
Log.Error("BuffToLiftMission", e);
}
return null;
}
static bool AgvCanGetMission(MissionInfo missionInfo) static bool AgvCanGetMission(MissionInfo missionInfo)
{ {
return string.IsNullOrEmpty(missionInfo.occupiedAgv); return string.IsNullOrEmpty(missionInfo.occupiedAgv);
...@@ -276,8 +303,6 @@ namespace DeviceLibrary.manager ...@@ -276,8 +303,6 @@ namespace DeviceLibrary.manager
&& agv.Scope.Tasks.Contains(s.projectType.ToString()) && !s.projectType.Equals(ProjectType.移远成品入库)); && agv.Scope.Tasks.Contains(s.projectType.ToString()) && !s.projectType.Equals(ProjectType.移远成品入库));
if (missionInfo != null && AgvCanGetMission(missionInfo)) if (missionInfo != null && AgvCanGetMission(missionInfo))
{ {
SetMissionOccupied(missionInfo, agv);
Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo; return missionInfo;
} }
} }
...@@ -308,7 +333,6 @@ namespace DeviceLibrary.manager ...@@ -308,7 +333,6 @@ namespace DeviceLibrary.manager
&& agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault(); && agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo)) if (missionInfo != null && AgvCanGetMission(missionInfo))
{ {
Log.Info($"执行料架返回任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo; return missionInfo;
} }
} }
...@@ -331,7 +355,6 @@ namespace DeviceLibrary.manager ...@@ -331,7 +355,6 @@ namespace DeviceLibrary.manager
&& agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault(); && agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo)) if (missionInfo != null && AgvCanGetMission(missionInfo))
{ {
Log.Info($"执行钢网分发线体任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo; return missionInfo;
} }
} }
...@@ -354,8 +377,6 @@ namespace DeviceLibrary.manager ...@@ -354,8 +377,6 @@ namespace DeviceLibrary.manager
&& agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault(); && agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo)) if (missionInfo != null && AgvCanGetMission(missionInfo))
{ {
Log.Info($"执行钢网去立库任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo; return missionInfo;
} }
} }
...@@ -382,7 +403,6 @@ namespace DeviceLibrary.manager ...@@ -382,7 +403,6 @@ namespace DeviceLibrary.manager
&& s.projectType.Equals(ProjectType.移远成品入库)).FirstOrDefault(); && s.projectType.Equals(ProjectType.移远成品入库)).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo)) if (missionInfo != null && AgvCanGetMission(missionInfo))
{ {
Log.Info($"执行1F成品回收任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo; return missionInfo;
} }
} }
...@@ -411,7 +431,6 @@ namespace DeviceLibrary.manager ...@@ -411,7 +431,6 @@ namespace DeviceLibrary.manager
&& s.projectType.Equals(ProjectType.移远成品入库)).FirstOrDefault(); && s.projectType.Equals(ProjectType.移远成品入库)).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo) && missionInfo.missionId.StartsWith("P16")) if (missionInfo != null && AgvCanGetMission(missionInfo) && missionInfo.missionId.StartsWith("P16"))
{ {
Log.Info($"执行1F成品入库任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo; return missionInfo;
} }
} }
...@@ -442,7 +461,6 @@ namespace DeviceLibrary.manager ...@@ -442,7 +461,6 @@ namespace DeviceLibrary.manager
if (missionInfo != null && AgvCanGetMission(missionInfo)) if (missionInfo != null && AgvCanGetMission(missionInfo))
{ {
SetMissionOccupied(missionInfo, agv); SetMissionOccupied(missionInfo, agv);
Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo; return missionInfo;
} }
} }
...@@ -489,6 +507,11 @@ namespace DeviceLibrary.manager ...@@ -489,6 +507,11 @@ namespace DeviceLibrary.manager
SetMissionOccupiedAgv(missionInfo.missionId, agv.Name); SetMissionOccupiedAgv(missionInfo.missionId, agv.Name);
MissionChangedEvent?.Invoke(); MissionChangedEvent?.Invoke();
} }
public static void SetMissionOccupied(string missionId, AgvInfo agv)
{
SetMissionOccupiedAgv(missionId, agv.Name);
MissionChangedEvent?.Invoke();
}
/// <summary> /// <summary>
/// 设置任务状态 /// 设置任务状态
/// </summary> /// </summary>
...@@ -581,7 +604,7 @@ namespace DeviceLibrary.manager ...@@ -581,7 +604,7 @@ namespace DeviceLibrary.manager
public static void AddSteelTarNodes(string missionId, string nodes) public static void AddSteelTarNodes(string missionId, string nodes)
{ {
MissionInfo missionInfo = GetMission(missionId); MissionInfo missionInfo = GetMission(missionId);
if(missionInfo!=null) if (missionInfo != null)
{ {
missionInfo.destinationPoint = nodes; missionInfo.destinationPoint = nodes;
{ {
......
...@@ -8,6 +8,9 @@ using DeviceLibrary.manager; ...@@ -8,6 +8,9 @@ using DeviceLibrary.manager;
using System.Windows.Forms; using System.Windows.Forms;
using System.Drawing; using System.Drawing;
using static DeviceLibrary.Node; using static DeviceLibrary.Node;
using System.Runtime.CompilerServices;
using static System.Net.Mime.MediaTypeNames;
using System.Runtime.ConstrainedExecution;
namespace DeviceLibrary.manager namespace DeviceLibrary.manager
{ {
...@@ -20,6 +23,7 @@ namespace DeviceLibrary.manager ...@@ -20,6 +23,7 @@ namespace DeviceLibrary.manager
public static void InitNodesInfos() public static void InitNodesInfos()
{ {
InitLinesInAirShower();
nodeInfo = new List<Node>(); nodeInfo = new List<Node>();
XmlConfigOperation.LoadNodeInfos(nodeInfo); XmlConfigOperation.LoadNodeInfos(nodeInfo);
WriteAllNodeInfos(); WriteAllNodeInfos();
...@@ -32,7 +36,7 @@ namespace DeviceLibrary.manager ...@@ -32,7 +36,7 @@ namespace DeviceLibrary.manager
XmlConfigOperation.LoadNodeInfos(nodes); XmlConfigOperation.LoadNodeInfos(nodes);
nodeInfo = nodes; nodeInfo = nodes;
} }
catch(Exception ex) catch (Exception ex)
{ {
MessageBox.Show("重载节点失败:" + ex.StackTrace, "提示"); MessageBox.Show("重载节点失败:" + ex.StackTrace, "提示");
} }
...@@ -49,7 +53,8 @@ namespace DeviceLibrary.manager ...@@ -49,7 +53,8 @@ namespace DeviceLibrary.manager
DgvNode.AutoGenerateColumns = false; DgvNode.AutoGenerateColumns = false;
DgvNode.AutoSize = true; DgvNode.AutoSize = true;
DgvNode.DataSource = bindingSource; DgvNode.DataSource = bindingSource;
DgvNode.RowPostPaint += delegate { DgvNode.RowPostPaint += delegate
{
DgvNode.RowsDefaultCellStyle.BackColor = Color.White; DgvNode.RowsDefaultCellStyle.BackColor = Color.White;
DgvNode.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue; DgvNode.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue;
}; };
...@@ -88,7 +93,7 @@ namespace DeviceLibrary.manager ...@@ -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(); BindingSource bindingSource = new BindingSource();
foreach (Node node in NodeManager.nodeInfo) foreach (Node node in NodeManager.nodeInfo)
...@@ -98,8 +103,8 @@ namespace DeviceLibrary.manager ...@@ -98,8 +103,8 @@ namespace DeviceLibrary.manager
bindingSource.Add(node); bindingSource.Add(node);
} }
dataGridView.DataSource = bindingSource; dataGridView.DataSource = bindingSource;
if(dataGridView.Rows.Count>=curRow if (dataGridView.Rows.Count >= curRow
&& dataGridView.Columns.Count>=curColum) && dataGridView.Columns.Count >= curColum)
{ {
dataGridView.CurrentCell = dataGridView.Rows[curRow].Cells[curColum]; ; dataGridView.CurrentCell = dataGridView.Rows[curRow].Cells[curColum]; ;
} }
...@@ -129,7 +134,7 @@ namespace DeviceLibrary.manager ...@@ -129,7 +134,7 @@ namespace DeviceLibrary.manager
else else
return true; return true;
} }
public static bool CheckNodes(string nodenames,out string names) public static bool CheckNodes(string nodenames, out string names)
{ {
string[] nodes = nodenames.Split(','); string[] nodes = nodenames.Split(',');
names = ""; names = "";
...@@ -193,5 +198,110 @@ namespace DeviceLibrary.manager ...@@ -193,5 +198,110 @@ namespace DeviceLibrary.manager
// LogUtil.info(item.ToString()); // 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
} }
} }
...@@ -7,6 +7,7 @@ using System.Runtime.Serialization; ...@@ -7,6 +7,7 @@ using System.Runtime.Serialization;
using Common; using Common;
using DeviceLibrary.service.model; using DeviceLibrary.service.model;
using DeviceLibrary.manager; using DeviceLibrary.manager;
using System.Reflection;
namespace DeviceLibrary namespace DeviceLibrary
{ {
...@@ -35,6 +36,13 @@ namespace DeviceLibrary ...@@ -35,6 +36,13 @@ namespace DeviceLibrary
} }
else else
{ {
int.TryParse(createMissionInfo.missionId.Substring(1, 2), out int projectType);
if (projectType > 16)
{
result.code = -1;
result.msg = $"创建任务失败,不存在的任务类型,请确认编号规则:{createMissionInfo.missionId}";
Log.Error(result.msg);
}
if (!NodeManager.CheckNode(createMissionInfo.sourcePoint)) if (!NodeManager.CheckNode(createMissionInfo.sourcePoint))
{ {
result.code = -1; result.code = -1;
......
...@@ -144,6 +144,19 @@ namespace DeviceLibrary.service.model ...@@ -144,6 +144,19 @@ namespace DeviceLibrary.service.model
return false; return false;
return missionInfo.projectType.Equals(ProjectType.移远成品入库); return missionInfo.projectType.Equals(ProjectType.移远成品入库);
} }
/// <summary>
/// 拷贝一个新的实例
/// </summary>
/// <returns></returns>
//public MissionInfo ToCopy()
//{
// MissionInfo posInfo = new MissionInfo();
// System.Reflection.PropertyInfo[] info1 = posInfo.GetType().GetProperties();
// System.Reflection.PropertyInfo[] info2 = this.GetType().GetProperties();
// for (int i = 0; i < info1.Length; i++)
// info1[i].SetValue(posInfo, info2[i].GetValue(this));
// return posInfo;
//}
} }
public enum MissionState public enum MissionState
...@@ -203,7 +216,8 @@ namespace DeviceLibrary.service.model ...@@ -203,7 +216,8 @@ namespace DeviceLibrary.service.model
/// 完成 /// 完成
/// </summary> /// </summary>
完成, 完成,
等待成品回收 等待成品回收,
料架缓存
} }
/// <summary> /// <summary>
/// 项目类型 /// 项目类型
......
...@@ -39,5 +39,9 @@ namespace DeviceLibrary.service.model ...@@ -39,5 +39,9 @@ namespace DeviceLibrary.service.model
/// 目的地点位 /// 目的地点位
/// </summary> /// </summary>
public string destinationPoint { get; set; } public string destinationPoint { get; set; }
/// <summary>
/// 更新电梯信息
/// </summary>
public bool updateInfo { get; set; } = false;
} }
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!