using System; using System.Threading.Tasks; using HH.WCS.Mobox3.DSZSH.Consts; using HH.WCS.Mobox3.DSZSH.Devices; using HH.WCS.Mobox3.DSZSH.Helpers; using HH.WCS.Mobox3.DSZSH.Models; using HH.WCS.Mobox3.DSZSH.ServiceCore; using Newtonsoft.Json; using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest; using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse; namespace HH.WCS.Mobox3.DSZSH.Services { public class AgvService { public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) { var result = new ReturnResult(); try { switch (model.state) { case 1023: break; case 1025: break; case 1012: break; case 1004: break; case 1103: break; default: // AGV 执行任务的逻辑处理 if (!AgvTaskProcessOk(model)) { // 执行不OK,说明没有找到任务 result.ResultCode = 1; result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}"; LogHelper.Info(result.ResultMsg, "API"); return result; } break; } result.ResultCode = 0; result.ResultMsg = "success"; LogHelper.Info(result.ResultMsg, "API"); return result; } catch (Exception ex) { result.ResultCode = -1; result.ResultMsg = $"发生了异常:+{ex.Message}"; LogHelper.Info(result.ResultMsg, "Error"); return result; } } /// /// 执行 AGV 任务,查询不到任务返回 /// /// /// private static bool AgvTaskProcessOk(AgvTaskState model) { var TN_Task = TaskHelper.GetTask(model.task_no); // 根据当前model编号查询任务 if (TN_Task == null) { return false; } if (model.state > 7) { //安全请求等 TaskHelper.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data); return true; } // AGV 任务 134562(7) 状态处理 switch (model.state) { case AgvStateCode.执行: TaskHelper.Begin(TN_Task, model.forklift_no); // 已推送的任务的状态改成执行 break; case AgvStateCode.开始取货: TaskHelper.UpdateStatus(TN_Task, "开始取货"); // 任务状态改成开始取货 break; case AgvStateCode.取货完成: TaskHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成 TaskHelper.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点 if (TN_Task.S_TYPE == TaskName.成品胶出库) { var nextOutboundTask = Task.Run(() => { OutboundCore.UpdateTaskState(SpotStateCode.任务执行完成); }); } break; case AgvStateCode.开始卸货: TaskHelper.UpdateStatus(TN_Task, "开始卸货"); // 任务状态改成开始卸货 break; case AgvStateCode.卸货完成: TaskHelper.UpdateStatus(TN_Task, "卸货完成"); // 任务状态改成卸货完成 TaskHelper.OperateStatus(TN_Task, 6); // 终点容器货位绑定,解锁终点 break; case AgvStateCode.完成: TaskHelper.End(TN_Task); // 任务状态改成结束 if (TN_Task.S_TYPE == TaskName.抽检_出库) { var checkCompleteTask = Task.Run(() => { CheckCore.UpdateTaskState(SpotStateCode.任务执行完成); }); } break; case AgvStateCode.异常: TaskHelper.OperateStatus(TN_Task, 7); // 异常处理 TaskHelper.Fail(TN_Task); // 任务状态改成错误 break; } // 将AGV执行状态,加入TN_Task_Action表中 TaskHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data); //调用第三方接口(如果有)TaskProcess.ReportStatus,添加任务动作关系表 return true; } public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) { var gzResult = new ReturnResult(); var db = DbHelper.GetDbClient(); ModbusHelper.Relink(); try { var prodLineInfo = AppStart.Settings.Config.ProductionLines[0]; var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort); if (!prodLineDevice.LoadDeviceStateOk()) { LogHelper.Info("加载设备信息失败"); } var tn_task = db.Queryable().First(a => a.S_CODE == model.task_no); if (tn_task == null) { LogHelper.Info($"任务号 '{model.task_no}' 不存在"); } // 待修改:补充不同分支AGV判断 if (prodLineDevice.SystemState == 1) { if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.托盘_满托下线入库) { prodLineDevice.AgvPicking = 1; } if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.托盘_空托上线) { prodLineDevice.AgvPlacingPallet = 1; } } LogHelper.Info(JsonConvert.SerializeObject(prodLineDevice, Formatting.Indented)); return gzResult; } catch (Exception ex) { LogHelper.Info($"发生了异常:{ex.Message}"); return gzResult; } } } }