Commit 34d4da0b 张东亮

成品入库,播放音效

1 个父辈 235cbc78
......@@ -51,8 +51,6 @@
this.txtShow = new System.Windows.Forms.TextBox();
this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.textBox1 = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
this.tableLayoutPanel3.SuspendLayout();
this.tabControl1.SuspendLayout();
this.tabPage2.SuspendLayout();
......@@ -269,8 +267,6 @@
//
// tabPage3
//
this.tabPage3.Controls.Add(this.button1);
this.tabPage3.Controls.Add(this.textBox1);
this.tabPage3.Controls.Add(this.label12);
this.tabPage3.Controls.Add(this.groupBox2);
this.tabPage3.Location = new System.Drawing.Point(4, 22);
......@@ -359,23 +355,6 @@
this.flowLayoutPanel1.Size = new System.Drawing.Size(1274, 405);
this.flowLayoutPanel1.TabIndex = 0;
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(319, 32);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(218, 21);
this.textBox1.TabIndex = 47;
//
// button1
//
this.button1.Location = new System.Drawing.Point(339, 73);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(163, 41);
this.button1.TabIndex = 48;
this.button1.Text = "根据任务编号删除任务";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// FrmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
......@@ -402,7 +381,6 @@
this.tblLayoutUnlock.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.dgvInfos)).EndInit();
this.tabPage3.ResumeLayout(false);
this.tabPage3.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.tabPage5.ResumeLayout(false);
this.tabPage5.PerformLayout();
......@@ -434,8 +412,6 @@
private System.Windows.Forms.DataGridView dgvInfos;
private System.Windows.Forms.TabPage tabPage5;
private System.Windows.Forms.TextBox txtShow;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;
}
}
......@@ -194,16 +194,16 @@ namespace AGVControl
private void button1_Click(object sender, EventArgs e)
{
try
{
string missionId = textBox1.Text.Trim();
MissionInfo missionInfo = MissionManager.GetMission(missionId);
if(missionInfo != null)
{
MissionManager.DeleteById(missionId);
}
}
catch { }
//try
//{
// string missionId = textBox1.Text.Trim();
// MissionInfo missionInfo = MissionManager.GetMission(missionId);
// if(missionInfo != null)
// {
// MissionManager.DeleteById(missionId);
// }
//}
//catch { }
}
private void dgvInfos_CellContentClick(object sender, DataGridViewCellEventArgs e)
......
......@@ -83,12 +83,12 @@ namespace AGVControl
{
if (!chkBxAuto.Checked && !Agv.JobContext.MissionId.Equals(""))
{
if (MessageBox.Show($"正在执行任务[{Agv.JobContext.MissionId}],切到手动后该任务无法继续执行,确定切到手动状态?", "警告", MessageBoxButtons.YesNo).Equals(
DialogResult.No))
{
chkBxAuto.Checked = true;
return;
}
//if (MessageBox.Show($"正在执行任务[{Agv.JobContext.MissionId}],切到手动后该任务无法继续执行,确定切到手动状态?", "警告", MessageBoxButtons.YesNo).Equals(
// DialogResult.No))
//{
// chkBxAuto.Checked = true;
// return;
//}
LogUtil.info($"人员切换到手动,{Agv.Name}当前执行的任务为{Agv.JobContext.MissionId}");
}
btnReSendTask.Enabled = chkBxAuto.Checked;
......
......@@ -16,6 +16,7 @@ namespace Common
public const string PutShelfOn = "PutShelfOn";
public const string TakeShelfOff = "TakeShelfOff";
public const string Temp1 = "Temp1";
public const string Temp2 = "Temp2";
public const string DoorAirOut = "DoorAirOut";
public const string AutoCharge = "AutoCharge";
public const string PlaySound = "PlaySound";
......
......@@ -10,10 +10,9 @@ namespace Common
{
public class LogUtil
{
public static readonly ILog AIOLog = LogManager.GetLogger("AGVDispatch");
private static LogUtil instance = new LogUtil();
public delegate void ShowLog(string msg,Color color);
public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public static readonly ILog LOGGER = LogManager.GetLogger("AGVDispatch");
public static Dictionary<int, DateTime> lastErrorLogTime = new Dictionary<int, DateTime>();
public static System.Windows.Forms.RichTextBox logBox = null;
......
......@@ -65,18 +65,22 @@
<Compile Include="bean\agv\Mir_Error.cs" />
<Compile Include="bean\agv\Scope.cs" />
<Compile Include="bean\ChargePiles.cs" />
<Compile Include="bean\jobType\F1LiftC1ToLiftD2JobType.cs" />
<Compile Include="bean\jobType\F1LiftD2ToLiftC1JobType.cs" />
<Compile Include="bean\jobType\LineToLineJobType.cs" />
<Compile Include="bean\jobType\RecoveryJobType.cs" />
<Compile Include="bean\jobType\LineOneToManyJobType.cs" />
<Compile Include="bean\job\ChargeJob.cs" />
<Compile Include="bean\job\F1LiftC1ToLiftD2Job.cs" />
<Compile Include="bean\job\F1LiftD2ToLiftC1Job.cs" />
<Compile Include="bean\job\LineOneToManyJob.cs" />
<Compile Include="bean\job\LineToLineJob.cs" />
<Compile Include="bean\job\LiftToLinesJob.cs" />
<Compile Include="bean\job\F1LiftToStoreJob.cs" />
<Compile Include="bean\job\F1StoreToLiftJob.cs" />
<Compile Include="bean\job\LineToLiftJob.cs" />
<Compile Include="bean\JobParam.cs" />
<Compile Include="bean\jobType\F1LiftToStoreJobType.cs" />
<Compile Include="bean\jobType\F1StoreToLiftJobType.cs" />
<Compile Include="bean\jobType\LineToLiftJobType.cs" />
<Compile Include="bean\TaskRunState.cs" />
<Compile Include="bean\jobType\LiftToLinesJobType.cs" />
<Compile Include="bean\job\StandyJob.cs" />
......@@ -112,6 +116,7 @@
<Compile Include="service\model\ConfirmOperation.cs" />
<Compile Include="service\model\DeleteMission.cs" />
<Compile Include="service\model\DoorInfo.cs" />
<Compile Include="service\model\FinishedInfo.cs" />
<Compile Include="service\model\MissionInfo.cs" />
<Compile Include="service\model\SendInInfo.cs" />
<Compile Include="service\model\TransportStatus.cs" />
......
......@@ -191,6 +191,7 @@ namespace DeviceLibrary.bean
/// 去线体
/// </summary>
SD_LineToLine_03_ToLine,
SD_LineToLine_04_PlaySound,
/// <summary>
/// 等待确认
/// </summary>
......@@ -240,6 +241,147 @@ namespace DeviceLibrary.bean
SD_Line_OnToMany_08_TakeShelfOff,
#endregion
#region 1F 成品空料架从D2C1
/// <summary>
/// 去电梯口
/// </summary>
S1F_LiftD2ToLiftC1_01_ToLiftD2,
/// <summary>
/// 等待电梯门开
/// </summary>
S1F_LiftD2ToLiftC1_02_WaitDoorOpen,
/// <summary>
///
/// </summary>
S1F_LiftD2ToLiftC1_03_EnterLift,
/// <summary>
/// 顶起料车
/// </summary>
S1F_LiftD2ToLiftC1_04_PutShelfOn,
/// <summary>
/// 离开电梯
/// </summary>
S1F_LiftD2ToLiftC1_05_LeaveLift,
/// <summary>
/// 关闭电梯门
/// </summary>
S1F_LiftD2ToLiftC1_06_CloseLiftDoor,
S1F_LiftD2ToLiftC1_07_ToLiftC1,
S1F_LiftD2ToLiftC1_08_CheckC1Status,
#region 电梯内无料车
S1F_LiftD2ToLiftC1_09_EnterLift,
S1F_LiftD2ToLiftC1_10_TakeShelfOffAtLift,
S1F_LiftD2ToLiftC1_11_LeaveLift,
#endregion
#region 电梯内有料车
S1F_LiftD2ToLiftC1_12_ToTemp1,
S1F_LiftD2ToLiftC1_13_TakeShelfOffAtTemp1,
S1F_LiftD2ToLiftC1_14_ToLift,
S1F_LiftD2ToLiftC1_15_EnterLift,
S1F_LiftD2ToLiftC1_16_PutShelfOn,
S1F_LiftD2ToLiftC1_17_LeaveLift,
#region 库房料车
S1F_LiftD2ToLiftC1_18_CloseDoor,
S1F_LiftD2ToLiftC1_19_01_ToStore,
S1F_LiftD2ToLiftC1_19_02_TakeShelfOff,
S1F_LiftD2ToLiftC1_19_03_ToTemp1,
S1F_LiftD2ToLiftC1_19_04_PutTemp1ShelfOn,
S1F_LiftD2ToLiftC1_19_05_ToLift,
#endregion
#region 空成品料车
S1F_LiftD2ToLiftC1_20_01_ToTemp2,
S1F_LiftD2ToLiftC1_20_02_TakeShelfOff,
S1F_LiftD2ToLiftC1_20_03_ToTemp1,
S1F_LiftD2ToLiftC1_20_04_PutShelfOn,
S1F_LiftD2ToLiftC1_20_05_ToLiftC1,
S1F_LiftD2ToLiftC1_20_06_EnterLiftC1,
S1F_LiftD2ToLiftC1_20_07_TakeShelfOff,
S1F_LiftD2ToLiftC1_20_08_LeaveLiftC1,
S1F_LiftD2ToLiftC1_20_09_CloseDoor,
S1F_LiftD2ToLiftC1_20_10_ToTemp2,
S1F_LiftD2ToLiftC1_20_11_TakeShelfOn,
S1F_LiftD2ToLiftC1_20_12_Switch,
#endregion
#endregion
#endregion
#region 1F 成品入库从C1D2
/// <summary>
/// 去电梯口
/// </summary>
S1F_LiftC1ToLiftD2_01_ToLiftC1,
/// <summary>
/// 等待电梯门开
/// </summary>
S1F_LiftC1ToLiftD2_02_WaitDoorOpen,
/// <summary>
///
/// </summary>
S1F_LiftC1ToLiftD2_03_EnterLift,
/// <summary>
/// 顶起料车
/// </summary>
S1F_LiftC1ToLiftD2_04_PutShelfOn,
/// <summary>
/// 离开电梯
/// </summary>
S1F_LiftC1ToLiftD2_05_LeaveLift,
/// <summary>
/// 关闭电梯门
/// </summary>
S1F_LiftC1ToLiftD2_06_CloseLiftDoor,
S1F_LiftC1ToLiftD2_07_ToLiftD2,
S1F_LiftC1ToLiftD2_08_CheckD2Status,
#region 电梯内无料车
S1F_LiftC1ToLiftD2_09_EnterLift,
S1F_LiftC1ToLiftD2_10_TakeShelfOffAtLift,
S1F_LiftC1ToLiftD2_11_LeaveLift,
#endregion
#region 电梯内有料车
S1F_LiftC1ToLiftD2_12_ToTemp1,
S1F_LiftC1ToLiftD2_13_TakeShelfOffAtTemp1,
S1F_LiftC1ToLiftD2_14_ToLift,
S1F_LiftC1ToLiftD2_15_EnterLift,
S1F_LiftC1ToLiftD2_16_PutShelfOn,
S1F_LiftC1ToLiftD2_17_LeaveLift,
#region 库房料车
S1F_LiftC1ToLiftD2_18_CloseDoor,
S1F_LiftC1ToLiftD2_19_01_ToStore,
S1F_LiftC1ToLiftD2_19_02_TakeShelfOff,
S1F_LiftC1ToLiftD2_19_03_ToTemp1,
S1F_LiftC1ToLiftD2_19_04_PutTemp1ShelfOn,
S1F_LiftC1ToLiftD2_19_05_ToLift,
#endregion
#region 空成品料车
S1F_LiftC1ToLiftD2_20_01_ToTemp2,
S1F_LiftC1ToLiftD2_20_02_TakeShelfOff,
S1F_LiftC1ToLiftD2_20_03_ToTemp1,
S1F_LiftC1ToLiftD2_20_04_PutShelfOn,
S1F_LiftC1ToLiftD2_20_05_ToLiftC1,
S1F_LiftC1ToLiftD2_20_06_EnterLiftC1,
S1F_LiftC1ToLiftD2_20_07_TakeShelfOff,
S1F_LiftC1ToLiftD2_20_08_LeaveLiftC1,
S1F_LiftC1ToLiftD2_20_09_CloseDoor,
S1F_LiftC1ToLiftD2_20_10_ToTemp2,
S1F_LiftC1ToLiftD2_20_11_TakeShelfOn,
S1F_LiftC1ToLiftD2_20_12_Switch,
#endregion
#endregion
#endregion
/// <summary>
/// 结束
/// </summary>
......
......@@ -229,6 +229,47 @@ namespace DeviceLibrary
return false;
}
/// <summary>
/// 是否有成品空料车在电梯中准备送出
/// </summary>
/// <param name="liftname"></param>
/// <returns></returns>
public bool HasFinishedEmptyShelfInLift(out string liftname, out lift.LiftStatus liftStatus)
{
liftname = "";
liftStatus = null;
string[] lifts = Scope.Remark.Split(',');
foreach (string item in lifts)
{
if (lift.LiftContext.HasFinishedShelfNeedLeave(item, Client, out liftStatus)
&& liftStatus.HasEmptyFinishedShelf)
{
liftname = item;
return true;
}
}
return false;
}
/// <summary>
/// 是否有成品满料车在电梯中准备送出
/// </summary>
/// <param name="liftname"></param>
/// <returns></returns>
public bool HasFinishedShelfInLift(out string liftname, out lift.LiftStatus liftStatus)
{
liftname = "";
liftStatus = null;
string[] lifts = Scope.Remark.Split(',');
foreach (string item in lifts)
{
if (lift.LiftContext.HasFinishedShelfNeedLeave(item, Client, out liftStatus))
{
liftname = item;
return true;
}
}
return false;
}
/// <summary>
/// 任务重发
/// </summary>
public void Resend()
......
......@@ -92,7 +92,7 @@ namespace DeviceLibrary.bean.job
{
JobRunStep.ToNextStep(RunStep.S1F_LiftToStore_05_CloseLiftDoor);
//关门
bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv);
bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv,false);
runInfo = $"离开{JobParam.SrcNode.AliceName},关闭电梯门:{rtn}";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回离开电梯, out string msg);
......
......@@ -12,7 +12,7 @@ namespace DeviceLibrary
{
JobParam = jobParam;
if (jobParam != null && jobParam.GetMissionInfo() != null)
JobName = jobParam.GetMissionInfo().JobName;
JobName = jobParam.GetMissionInfo().jobName;
}
public Job() { }
public JobParam JobParam { get; set; }
......@@ -66,7 +66,7 @@ namespace DeviceLibrary
/// </summary>
public string JobName { get; set; } = "";
protected void AllocateTask(AgvInfo agv, string taskName)
public void AllocateTask(AgvInfo agv, string taskName)
{
Task = AgvTaskManager.GetTaskByName(taskName, agv);
AgvTaskManager.AssignMission(agv, taskName);
......@@ -81,6 +81,16 @@ namespace DeviceLibrary
Task = AgvTaskManager.GetTaskByName($"{SettingString.Standby}", agv);
AgvTaskManager.AssignMission(agv, $"{SettingString.Standby}");
}
protected void PlaySound(AgvInfo agv)
{
Task = AgvTaskManager.GetTaskByName($"{SettingString.PlaySound}", agv);
AgvTaskManager.AssignMission(agv, $"{SettingString.PlaySound}");
}
protected void StopSound(AgvInfo agv)
{
Task = AgvTaskManager.GetTaskByName($"{SettingString.StopSound}", agv);
AgvTaskManager.AssignMission(agv, $"{SettingString.StopSound}");
}
/// <summary>
/// 设置PLC值
/// </summary>
......
......@@ -95,7 +95,7 @@ namespace DeviceLibrary.bean.job
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_06_CloseLiftDoor);
//关门
bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv);
bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv, false);
runInfo = $"离开{JobParam.SrcNode.AliceName},关闭门:{rtn}";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.离开电梯, out string msg);
......@@ -134,6 +134,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_09_WaitConfirm);
runInfo = $"等待{JobParam.CurTargetNode.AliceName}的人员确认";
JobRunStep.Msg = runInfo;
PlaySound(agv);
}
else
{
......@@ -154,6 +155,7 @@ namespace DeviceLibrary.bean.job
$"卸货{ JobParam.CurTargetNode.Name }"));
//重置确认信息
JobParam.CurTargetNode.ExtendEquip.Reset();
StopSound(agv);
}
else if (JobRunStep.IsTimeOut(WaitTimeOut, out double timeoutval))
{
......@@ -230,6 +232,10 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_12_WaitDoorOpen);
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true);
//上报运输状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.error, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
$"等待电梯到达超时"));
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_13_CheckLiftStatus))
......
......@@ -85,6 +85,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.SD_Line_OneToMany_05_WaitConfirm);
runInfo = $"等待{JobParam.CurTargetNode.AliceName}的人员确认";
JobRunStep.Msg = runInfo;
PlaySound(agv);
}
else
{
......@@ -108,6 +109,7 @@ namespace DeviceLibrary.bean.job
$"卸货{ JobParam.CurTargetNode.Name }"));
//关闭按钮确认
JobParam.CurTargetNode.ExtendEquip.Reset();
StopSound(agv);
}
else if (JobRunStep.IsTimeOut(WaitTimeOut, out double timeoutval))
{
......@@ -119,39 +121,43 @@ namespace DeviceLibrary.bean.job
}
else if (JobRunStep.IsStep(RunStep.SD_Line_OneToMany_06_CheckNextLine))
{
if (JobParam.TargetNodes != null && JobParam.TargetNodes.Count > 0)
{
JobRunStep.ToNextStep(RunStep.SD_Line_OneToMany_03_ToLine);
JobParam.CurTargetNode = JobParam.TargetNodes[0];
JobParam.TargetNodes.RemoveAt(0);
System.Threading.Thread.Sleep(1000);
runInfo = $"去下一线体{JobParam.CurTargetNode.AliceName}的放料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}");
}
else
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
if (JobParam.GetMissionInfo() != null && JobParam.GetMissionInfo().needBack)
{
JobRunStep.ToNextStep(RunStep.SD_Line_OneToMany_07_BackToPickUpPosition);
runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,分发结束,需要返回{JobParam.SrcNode.Name}的放料点";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回起始地, out string msg);
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.TakeShelfOff}");
JobRunStep.Msg = runInfo;
}
else if (JobParam.GetMissionInfo() != null && !JobParam.GetMissionInfo().needBack)
if (JobParam.TargetNodes != null && JobParam.TargetNodes.Count > 0)
{
JobRunStep.ToNextStep(RunStep.SD_Line_OnToMany_08_TakeShelfOff);
runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,分发结束,无需返回,直接卸下";
JobRunStep.ToNextStep(RunStep.SD_Line_OneToMany_03_ToLine);
JobParam.CurTargetNode = JobParam.TargetNodes[0];
JobParam.TargetNodes.RemoveAt(0);
System.Threading.Thread.Sleep(1000);
runInfo = $"去下一线体{JobParam.CurTargetNode.AliceName}的放料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}");
}
else
{
LogUtil.error(JobParam.GetMissionInfo().ToString());
if (JobParam.GetMissionInfo() != null && JobParam.GetMissionInfo().needBack)
{
JobRunStep.ToNextStep(RunStep.SD_Line_OneToMany_07_BackToPickUpPosition);
runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,分发结束,需要返回{JobParam.SrcNode.Name}的放料点";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回起始地, out string msg);
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.TakeShelfOff}");
JobRunStep.Msg = runInfo;
}
else if (JobParam.GetMissionInfo() != null && !JobParam.GetMissionInfo().needBack)
{
JobRunStep.ToNextStep(RunStep.SD_Line_OnToMany_08_TakeShelfOff);
runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,分发结束,无需返回,直接卸下";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
}
else
{
LogUtil.error(JobParam.GetMissionInfo().ToString());
}
}
}
}
else if (JobRunStep.IsStep(RunStep.SD_Line_OneToMany_07_BackToPickUpPosition))
{
......
......@@ -8,15 +8,15 @@ namespace DeviceLibrary
/// <summary>
/// 1F,库房到电梯(满料运送)
/// </summary>
public class F1StoreToLiftJob : Job
public class LineToLiftJob : Job
{
/// <summary>
/// 1F满架运送任务
/// </summary>
public F1StoreToLiftJob(JobParam jobParam) : base(jobParam)
public LineToLiftJob(JobParam jobParam) : base(jobParam)
{
}
public F1StoreToLiftJob() : base()
public LineToLiftJob() : base()
{
}
......@@ -36,8 +36,6 @@ namespace DeviceLibrary
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_01_ToStore);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}的取料点";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.已分配, out string msg);
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}");
JobRunStep.Msg = runInfo;
......@@ -89,7 +87,7 @@ namespace DeviceLibrary
runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯并等待开门";
JobRunStep.Msg = runInfo;
//开始请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(),agv);
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_04_CheckLiftStatus))
......@@ -122,7 +120,12 @@ namespace DeviceLibrary
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_04_CheckLiftStatus);
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(),agv);
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
//上报运输状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.error, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
$"等待电梯到达超时"));
}
}
#region 电梯内有料车
......@@ -182,7 +185,7 @@ namespace DeviceLibrary
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_07_CloseDoor);
//AGV离开
bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv);
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)
......@@ -195,7 +198,7 @@ namespace DeviceLibrary
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_07_CloseDoor))
{
if(lift.LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name))
if (lift.LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_08_ToStore);
runInfo = $"{JobParam.CurTargetNode.AliceName}关门完成,将料车送到{liftStatus.destinationPoint}的放料点";
......@@ -208,10 +211,10 @@ namespace DeviceLibrary
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{liftStatus.destinationPoint}_{SettingString.TakeShelfOff}");
}
else if(JobRunStep.IsTimeOut(0.5,out double val))
else if (JobRunStep.IsTimeOut(0.5, out double val))
{
//AGV离开
lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv);
lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"{JobParam.CurTargetNode.AliceName}离开信号超时重发";
JobRunStep.Msg = runInfo;
System.Threading.Thread.Sleep(3000);
......@@ -272,7 +275,7 @@ namespace DeviceLibrary
runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯";
JobRunStep.Msg = runInfo;
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(),agv);
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
System.Threading.Thread.Sleep(2000);
}
}
......@@ -298,7 +301,11 @@ namespace DeviceLibrary
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"电梯卸车"));
if (JobParam.GetMissionInfo().projectType.Equals(service.model.ProjectType.成品入库))
{
//设置该电梯内的产品是成品入库
lift.LiftContext.SetFinishedState(JobParam.CurTargetNode.Name, true);
}
runInfo = $"料车在{JobParam.CurTargetNode.AliceName}卸下完成,准备离开";
ResetOccupiedAgv(JobParam.GetMissionInfo());
//任务状态变更
......@@ -312,8 +319,17 @@ namespace DeviceLibrary
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.END);
//AGV离开
bool rtn= lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv);
bool rtn = false;
if (JobParam.GetMissionInfo().projectType.Equals(service.model.ProjectType.成品入库))
{
//AGV离开
rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
}
else
{
//AGV离开
rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv);
}
runInfo = $"任务结束:离开{JobParam.CurTargetNode.AliceName}完成并发送离开信号:{rtn}";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯运行, out string msg);
......
 using Common;
using Common;
using DeviceLibrary.manager;
namespace DeviceLibrary.bean.job
......@@ -68,7 +68,7 @@ namespace DeviceLibrary.bean.job
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.SD_LineToLine_04_WaitConfirm);
JobRunStep.ToNextStep(RunStep.SD_LineToLine_04_PlaySound);
//确认按钮生效
JobParam.CurTargetNode.ExtendEquip.AllowConfirm();
//上报运输状态
......@@ -78,11 +78,29 @@ namespace DeviceLibrary.bean.job
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的放料点";
JobRunStep.Msg = runInfo;
PlaySound(agv);
}
}
else if (JobRunStep.IsStep(RunStep.SD_LineToLine_04_PlaySound))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
if (OpManager.WaitConfirm.Line(JobParam.CurTargetNode))
{
StopSound(agv);
}
else if (JobRunStep.IsTimeOut(WaitTimeOut, out double timeoutval))
{
//报警,$"等待{JobParam.CurTargetNode.AliceName}的人员确认超时{timeoutval}分"
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.error, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.agvButton,
$"等待{ JobParam.CurTargetNode.Name }确认超时{timeoutval}分"));
}
}
}
else if (JobRunStep.IsStep(RunStep.SD_LineToLine_04_WaitConfirm))
{
if (OpManager.WaitConfirm.Line(JobParam.CurTargetNode))
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
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.agvButton,
......@@ -96,7 +114,7 @@ namespace DeviceLibrary.bean.job
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回起始地, out string msg);
JobRunStep.Msg = runInfo;
}
else if(JobParam.GetMissionInfo() != null && !JobParam.GetMissionInfo().needBack)
else if (JobParam.GetMissionInfo() != null && !JobParam.GetMissionInfo().needBack)
{
JobRunStep.ToNextStep(RunStep.SD_LineToLine_06_TakeShelfOff);
runInfo = $"将料车在{JobParam.CurTargetNode.AliceName}卸下";
......@@ -110,13 +128,7 @@ namespace DeviceLibrary.bean.job
//关闭按钮确认
JobParam.CurTargetNode.ExtendEquip.Reset();
}
else if (JobRunStep.IsTimeOut(WaitTimeOut, out double timeoutval))
{
//报警,$"等待{JobParam.CurTargetNode.AliceName}的人员确认超时{timeoutval}分"
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.error, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.agvButton,
$"等待{ JobParam.CurTargetNode.Name }确认超时{timeoutval}分"));
}
}
else if (JobRunStep.IsStep(RunStep.SD_LineToLine_05_BackToSrcLine))
{
......
using Common;
using DeviceLibrary.bean.job;
namespace DeviceLibrary.bean.jobType
{
/// <summary>
/// 1F,电梯C1到电梯D2。成品料架入库
/// </summary>
public class F1LiftC1ToLiftD2JobType : JobType
{
public override Job GetNewJob(AgvInfo agv)
{
if (!agv.IsIdle())
return null;
else
{
if(agv.Scope.Floor.Equals(1) && agv.HasFinishedShelfInLift(out string liftname, out lift.LiftStatus lift))
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1SendFullFinishedC1ToD2Mission(agv);
if(missionInfo!=null)
{
if (service.model.MissionInfo.IsFinishedProdcut(missionInfo))
{
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);
return new F1LiftC1ToLiftD2Job(jobParam);
}
}
}
}
return null;
}
}
}
using Common;
using DeviceLibrary.bean.job;
namespace DeviceLibrary.bean.jobType
{
/// <summary>
/// 1F,电梯D2到电梯C1。成品料架回收
/// </summary>
public class F1LiftD2ToLiftC1JobType : JobType
{
public override Job GetNewJob(AgvInfo agv)
{
if (!agv.IsIdle())
return null;
else
{
if(agv.Scope.Floor.Equals(1) && agv.HasFinishedEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1FinishedD2ToC1Mission(agv);
if(missionInfo!=null)
{
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);
return new F1LiftD2ToLiftC1Job(jobParam);
}
}
}
return null;
}
}
}
......@@ -19,6 +19,8 @@ namespace DeviceLibrary.bean.jobType
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1ReceiveMission(agv);
if(missionInfo!=null)
{
if (service.model.MissionInfo.IsFinishedProdcut(missionInfo))
return null;
Node src = manager.NodeManager.GetNode(liftname, NodeType.Lift);
string[] dests = lift.destinationPoint.Split(',');
Node dest = manager.NodeManager.GetNode(dests.Length > 1 ? dests[0] : lift.destinationPoint, NodeType.Node);
......
......@@ -33,7 +33,7 @@ namespace DeviceLibrary
Node src = manager.NodeManager.GetNode(liftname, NodeType.Lift);
string[] destTmp = lift.destinationPoint.Split(',');
string[] dests = destTmp.Distinct().ToArray();
Node dest = manager.NodeManager.GetNode(dests.Length > 1 ? dests[0] : lift.destinationPoint, NodeType.Node);
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)
{
......
using System;
using DeviceLibrary.manager;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
......@@ -7,9 +8,9 @@ using System.Threading.Tasks;
namespace DeviceLibrary.bean.jobType
{
/// <summary>
/// 取料并送入电梯内
/// 从线体取料并送入电梯内
/// </summary>
public class F1StoreToLiftJobType:JobType
public class LineToLiftJobType:JobType
{
public override Job GetNewJob(AgvInfo agv)
{
......@@ -17,7 +18,7 @@ namespace DeviceLibrary.bean.jobType
return null;
else if (agv.Scope.Floor.Equals(1))
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetDeliverMission(agv,out string liftname);
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1DeliverMission(agv,out string liftname);
if(missionInfo!=null)
{
Node src = manager.NodeManager.GetNode(missionInfo.sourcePoint, NodeType.Node);
......@@ -33,7 +34,32 @@ namespace DeviceLibrary.bean.jobType
return null;
}
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
return new F1StoreToLiftJob(jobParam);
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.已分配, out string msg);
return new LineToLiftJob(jobParam);
}
}
else
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetFinishedDeliverMission(agv, out string liftname);
if (missionInfo != null)
{
Node src = manager.NodeManager.GetNode(missionInfo.sourcePoint, NodeType.Node);
Node dest = manager.NodeManager.GetNode(liftname, NodeType.Lift);
if (src == null)
{
Common.LogUtil.error($"无法生成任务,起始点不存在:{missionInfo.sourcePoint}");
return null;
}
if (dest == null)
{
Common.LogUtil.error($"无法生成任务,电梯不存在:{liftname}");
return null;
}
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.已分配, out string msg);
return new LineToLiftJob(jobParam);
}
}
return null;
......
......@@ -34,17 +34,17 @@ namespace DeviceLibrary.lift
return true;
return false;
}
/// <summary>
/// 请求使用电梯
/// </summary>
/// <param name="liftId"></param>
/// <param name="missionInfo"></param>
/// <param name="isback">是否是返回</param>
public static bool Request(service.model.MissionInfo missionInfo, AgvInfo agvInfo, bool isback = false)
public static bool Request(service.model.MissionInfo missionInfo, AgvInfo agvInfo, bool isback = false, bool needCall = true)
{
service.model.SendInInfo info;
bool rtn=false;
bool rtn = false;
if (isback)//返回
{
if (!AGVManager.GetsysClientBy(missionInfo.sourceFloor, missionInfo.liftName, out string destclient))
......@@ -56,14 +56,14 @@ namespace DeviceLibrary.lift
{
liftId = missionInfo.liftName,
destinationFloor = missionInfo.sourceFloor,
destinationPoint = missionInfo.sourcePoint,
destinationPoint = missionInfo.sourcePoint,
destinationClient = destclient,
sourceFloor = missionInfo.destinationFloor,
sourceClient = agvInfo.Client
sourceClient = agvInfo.Client,
};
rtn= HttpManager.RequestSendIn(info);
rtn = HttpManager.RequestSendIn(info);
if (rtn)
HttpManager.AGVCall(new service.model.DoorInfo { liftId= missionInfo.liftName, sourceClient=agvInfo.Client, sourceFloor=missionInfo.destinationFloor});
HttpManager.AGVCall(new service.model.DoorInfo { liftId = missionInfo.liftName, sourceClient = agvInfo.Client, sourceFloor = missionInfo.destinationFloor });
}
else
{
......@@ -83,7 +83,7 @@ namespace DeviceLibrary.lift
destinationPoint = missionInfo.destinationPoint,
};
rtn = HttpManager.RequestSendIn(info);
if (rtn)
if (rtn && needCall)
HttpManager.AGVCall(new service.model.DoorInfo { liftId = missionInfo.liftName, sourceClient = agvInfo.Client, sourceFloor = missionInfo.sourceFloor });
}
return rtn;
......@@ -91,12 +91,12 @@ namespace DeviceLibrary.lift
/// <summary>
/// AGV离开
/// </summary>
/// <param name="liftId"></param>
/// <param name="agvInfo"></param>
/// <param name="continueUse">是否继续使用电梯</param>
/// <returns></returns>
public static bool AGVLeave(string liftId, AgvInfo agvInfo)
public static bool AGVLeave(string liftId, AgvInfo agvInfo, bool continueUse = true)
{
bool rtn = HttpManager.AGVLeave(new service.model.DoorInfo() { liftId = liftId, sourceClient = agvInfo.Client, sourceFloor = agvInfo.Scope.Floor });
bool rtn = HttpManager.AGVLeave(new service.model.DoorInfo() { liftId = liftId, sourceClient = agvInfo.Client, sourceFloor = agvInfo.Scope.Floor, continueUse = continueUse });
ResetLiftOccupiedAgv(liftId);
Common.LogUtil.info($"{agvInfo.Name} 离开 {liftId}:{rtn}");
return rtn;
......@@ -113,7 +113,19 @@ namespace DeviceLibrary.lift
Common.LogUtil.info($"{agvInfo.Name} 呼叫 {rtn}");
return rtn;
}
/// <summary>
/// 成品入库送到楼下
/// 只针对D2电梯
/// </summary>
/// <param name="liftId"></param>
/// <param name="hasFullFinished"></param>
/// <returns></returns>
public static bool SetFinishedState(string liftId, bool hasFullFinished)
{
bool rtn = HttpManager.SetFinishedState(new service.model.FinishedInfo() { liftId = liftId, HasFullFinishedShelf = hasFullFinished });
Common.LogUtil.info($"设置电梯{liftId}成品状态为{hasFullFinished}");
return rtn;
}
/// <summary>
/// 检查离开信号发送情况
/// </summary>
......@@ -141,6 +153,21 @@ namespace DeviceLibrary.lift
return false;
}
/// <summary>
/// 有成品架子需要离开
/// </summary>
/// <param name="liftId"></param>
/// <param name="client"></param>
/// <param name="liftStatus"></param>
/// <returns></returns>
public static bool HasFinishedShelfNeedLeave(string liftId, string client, out LiftStatus liftStatus)
{
liftStatus = GetLiftStatus(liftId);
liftStatus.missionId = manager.MissionManager.GetMissionIdByFinishedShelfInLift(liftId);
if (!liftStatus.missionId.Equals(""))
return true;
return false;
}
/// <summary>
/// 检查该任务agv是否获得电梯控制权
/// </summary>
/// <param name="liftId"></param>
......@@ -157,7 +184,7 @@ namespace DeviceLibrary.lift
/// 占用电梯的agv
/// </summary>
/// <param name="agvIp"></param>
public static void SetLiftOccupiedAgv(string liftId,string agvIp)
public static void SetLiftOccupiedAgv(string liftId, string agvIp)
{
lifts[liftId].OccupiedAgv = agvIp;
}
......
......@@ -44,5 +44,9 @@ namespace DeviceLibrary.lift
/// 目的地点位
/// </summary>
public string destinationPoint { get; set; } = "";
/// <summary>
/// 成品空架子标识
/// </summary>
public bool HasEmptyFinishedShelf { get; set; } = false;
}
}
......@@ -63,7 +63,7 @@ namespace DeviceLibrary
jobTypes = new List<JobType>();
jobTypes.Add(new LiftToLinesJobType());
jobTypes.Add(new F1LiftToStoreJobType());
jobTypes.Add(new F1StoreToLiftJobType());
jobTypes.Add(new LineToLiftJobType());
//jobTypes.Add(new LineToLineJobType());
jobTypes.Add(new LineOneToManyJobType());
jobTypes.Add(new ChargeJobType());
......
......@@ -106,8 +106,7 @@ namespace DeviceLibrary
if (node != null)
break;
}
}
}
}
if (task != null)
......
......@@ -316,6 +316,44 @@ namespace DeviceLibrary
return false;
}
static string finished = AppConfigHelper.GetValue(SettingString.Lift_Server) + "finishedProdcut";
/// <summary>
/// AGV呼叫
/// </summary>
/// <param name="doorInfo"></param>
/// <returns></returns>
public static bool SetFinishedState(service.model.FinishedInfo info)
{
try
{
string resultStr = HttpHelper.Post(finished, JsonHelper.SerializeObject(info));
Result data = JsonHelper.DeserializeJsonToObject<Result>(resultStr);
if (data == null)
{
log.Warn($"SetFinishedState fail:{JsonHelper.SerializeObject(info)}");
return false;
}
else
{
if (data.code.Equals(0))
{
log.Info($"SetFinishedState info:{JsonHelper.SerializeObject(info)},result:code={data.code},msg={data.msg},data={data.data}");
return true;
}
else
{
log.Warn($"SetFinishedState info:{JsonHelper.SerializeObject(info)},result:code={data.code},msg={data.msg},data={data.data}");
return false;
}
}
}
catch (Exception e)
{
log.Error("SetFinishedState", e);
}
return false;
}
......
......@@ -8,7 +8,6 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using DeviceLibrary.service.model;
namespace DeviceLibrary.manager
{
public class MissionManager
......@@ -104,7 +103,16 @@ namespace DeviceLibrary.manager
public static string GetMissionIdByShelfInLift(string liftId)
{
int id = MissionInfos.FindIndex(s=> liftId.Equals(s.liftName) &&
(s.State==MissionState.电梯运行 || s.State == MissionState.返回电梯运行));
(s.state==MissionState.电梯运行 || s.state == MissionState.返回电梯运行));
if (id > -1)
return MissionInfos[id].missionId;
return "";
}
public static string GetMissionIdByFinishedShelfInLift(string liftId)
{
int id = MissionInfos.FindIndex(s => liftId.Equals(s.liftName) && s.projectType.Equals(ProjectType.成品入库)
&& (s.state.Equals(MissionState.等待成品回收) || s.state == MissionState.电梯运行
|| s.state == MissionState.返回电梯运行));
if (id > -1)
return MissionInfos[id].missionId;
return "";
......@@ -155,11 +163,11 @@ namespace DeviceLibrary.manager
}
/// <summary>
/// 获取送料任务,以准备执行 F1StoreToLiftJobType
/// 获取1F送料任务,以准备执行 F1StoreToLiftJobType
/// </summary>
/// <param name="missionType"></param>
/// <returns></returns>
public static MissionInfo GetDeliverMission(AgvInfo agv, out string liftname)
public static MissionInfo GetF1DeliverMission(AgvInfo agv, out string liftname)
{
MissionInfo missionInfo = null;
liftname = "";
......@@ -168,7 +176,7 @@ namespace DeviceLibrary.manager
if (Monitor.TryEnter(lockObj, 1000))
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
s.State.Equals(MissionState.创建) &&
s.state.Equals(MissionState.创建) &&
agv.Scope.Tasks.Contains(s.projectType.ToString()));
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
......@@ -193,10 +201,45 @@ namespace DeviceLibrary.manager
}
return null;
}
public static MissionInfo GetFinishedDeliverMission(AgvInfo agv, out string liftname)
{
MissionInfo missionInfo = null;
liftname = "";
try
{
if (Monitor.TryEnter(lockObj, 1000))
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
s.state.Equals(MissionState.创建) &&
agv.Scope.Tasks.Contains(s.projectType.ToString())&&
s.projectType.Equals(ProjectType.成品入库));
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
liftname = GetLiftName(missionInfo);
if (liftname.Equals(""))
{
return null;
}
SetMissionOccupied(missionInfo, agv);
Log.Info($"执行成品入库任务[{agv.Name}][起始地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
}
return null;
}
static bool AgvCanGetMission(MissionInfo missionInfo)
{
return string.IsNullOrEmpty(missionInfo.OccupiedAgv);
return string.IsNullOrEmpty(missionInfo.occupiedAgv);
}
/// <summary>
/// 获取接收料任务,以准备执行 LiftToLinesJobType
......@@ -211,7 +254,7 @@ namespace DeviceLibrary.manager
if (Monitor.TryEnter(lockObj, 1000))
{
missionInfo = MissionInfos.Find(s => s.destinationWorkshop.Equals(agv.Scope.Workshop) &&
(s.State >= MissionState.到达电梯 && s.State <= MissionState.电梯到达) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
(s.state >= MissionState.到达电梯 && s.state <= MissionState.电梯到达) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo, agv);
......@@ -243,7 +286,7 @@ namespace DeviceLibrary.manager
if (Monitor.TryEnter(lockObj, 1000))
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.State >= MissionState.返回到达电梯内 && s.State <= MissionState.返回电梯到达) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
(s.state >= MissionState.返回到达电梯内 && s.state <= MissionState.返回电梯到达) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo, agv);
......@@ -262,6 +305,74 @@ namespace DeviceLibrary.manager
}
return null;
}
/// <summary>
/// 获取1楼回收空成品料任务
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
public static MissionInfo GetF1FinishedD2ToC1Mission(AgvInfo agv)
{
MissionInfo missionInfo = null;
try
{
if (Monitor.TryEnter(lockObj, 1000))
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.state.Equals(MissionState.等待成品回收)) && agv.Scope.Tasks.Contains(s.projectType.ToString())
&& s.projectType.Equals(ProjectType.成品入库));
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo, agv);
Log.Info($"执行1F成品回收任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
}
return null;
}
/// <summary>
/// 获取1楼送满成品料任务
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
public static MissionInfo GetF1SendFullFinishedC1ToD2Mission(AgvInfo agv)
{
MissionInfo missionInfo = null;
try
{
if (Monitor.TryEnter(lockObj, 1000))
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.state >= MissionState.到达电梯 && s.state <= MissionState.电梯到达)
&& agv.Scope.Tasks.Contains(s.projectType.ToString())
&& s.projectType.Equals(ProjectType.成品入库));
if (missionInfo != null && AgvCanGetMission(missionInfo)&& missionInfo.missionId.StartsWith("P101"))
{
SetMissionOccupied(missionInfo, agv);
Log.Info($"执行1F成品入库任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
}
return null;
}
/// <summary>
/// 获取同一层任务:点到点,以准备执行
......@@ -277,7 +388,7 @@ namespace DeviceLibrary.manager
{
missionInfo = MissionInfos.Find(s => s.destinationWorkshop.Equals(agv.Scope.Workshop) &&
s.sourceWorkshop.Equals(agv.Scope.Workshop) && s.projectType.Equals(ProjectType.半成品领用) &&
(s.State == MissionState.创建) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
(s.state == MissionState.创建) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo, agv);
......@@ -313,7 +424,7 @@ namespace DeviceLibrary.manager
s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.projectType.Equals(ProjectType.PCB领用) || s.projectType.Equals(ProjectType.包材领用))
&&
(s.State >= MissionState.创建) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
(s.state >= MissionState.创建) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo,agv);
......
......@@ -103,7 +103,7 @@ namespace DeviceLibrary
}
else
{
if (missionInfo.State.Equals(MissionState.创建))
if (missionInfo.state.Equals(MissionState.创建))
{
MissionManager.SetMissionState(missionInfo.missionId, MissionState.取消,out string msg);
result.msg = msg;
......
......@@ -20,5 +20,9 @@ namespace DeviceLibrary.service.model
/// 架子来源层
/// </summary>
public int sourceFloor { get; set; } = 0;
/// <summary>
/// 继续使用电梯
/// </summary>
public bool continueUse { get; set; } = true;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary.service.model
{
public class FinishedInfo
{
/// <summary>
/// 电梯标识
/// </summary>
public string liftId { get; set; } = "";
public bool HasFullFinishedShelf { get; set; } = false;
}
}
......@@ -18,7 +18,7 @@ namespace DeviceLibrary.service.model
/// <summary>
/// 任务状态
/// </summary>
public MissionState State { get; set; }
public MissionState state { get; set; }
/// <summary>
/// 使用的电梯名称
/// </summary>
......@@ -26,8 +26,8 @@ namespace DeviceLibrary.service.model
/// <summary>
/// 占用的AGV名称
/// </summary>
public string OccupiedAgv { get; set; } = string.Empty;
public string JobName { get { return string.Format("[{0}->{1} {2}任务]", sourceWorkshop, destinationWorkshop, projectType.ToString()); } }
public string occupiedAgv { get; set; } = string.Empty;
public string jobName { get { return string.Format("[{0}->{1} {2}任务]", sourceWorkshop, destinationWorkshop, projectType.ToString()); } }
/// <summary>
/// 取车的位置
/// </summary>
......@@ -126,17 +126,23 @@ namespace DeviceLibrary.service.model
}
public void SetState(MissionState missionState)
{
State = missionState;
state = missionState;
}
public string Remark { get; set; }
public void SetAgvOccupied(string agvname)
{
OccupiedAgv = agvname;
occupiedAgv = agvname;
}
public void ResetOccupied()
{
OccupiedAgv = string.Empty;
occupiedAgv = string.Empty;
}
public static bool IsFinishedProdcut(MissionInfo missionInfo)
{
if (missionInfo == null)
return false;
return missionInfo.projectType.Equals(ProjectType.成品入库);
}
}
......@@ -196,7 +202,8 @@ namespace DeviceLibrary.service.model
/// <summary>
/// 完成
/// </summary>
完成
完成,
等待成品回收
}
/// <summary>
/// 项目类型
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!