HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/Program.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/ApiHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/DebugController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/WmsController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/TaskAction.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/process/TaskProcess.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WCSHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/Program.cs
@@ -23,6 +23,7 @@ { static void Main(string[] args) { Settings.Init(); // 设置控制台编码为 UTF-8 Console.OutputEncoding = Encoding.UTF8; HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/ApiHelper.cs
@@ -992,10 +992,9 @@ TaskProcess.OperateStatus(cst, 6); break; case 7: WCSHelper.UpdateStatus(cst, "异常取消"); WCSHelper.Cancel(cst); WCSHelper.UpdateStatus(cst, "取消"); TaskProcess.OperateStatus(cst, 7); mst.N_B_STATE = 3; WMSHelper.UpdateTaskState(mst); break; case 8: WCSHelper.UpdateStatus(cst, "强制完成"); @@ -1026,6 +1025,35 @@ } /// <summary> /// 货位状态反馈 /// </summary> /// <param name="model"></param> /// <returns></returns> public static bool locStateFeedBack(LocStateFeedBackModel model) { bool result = false; var task = WCSHelper.GetTask(model.req_no); if (task != null) { TaskAction taskAction = null; if (model.type == "1") { taskAction = WCSHelper.getActionRecord(task.S_CODE, 1101); } if (model.type == "2") { taskAction = WCSHelper.getActionRecord(task.S_CODE, 1103); } if (taskAction != null) { taskAction.N_S_STATUS = 1; result = WCSHelper.updateActionRecord(taskAction); } } return result; } /// <summary> /// 读码反馈 /// </summary> /// <param name="model"></param> HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/DebugController.cs
@@ -41,5 +41,7 @@ return new SimpleResult(); } } } HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/WmsController.cs
@@ -145,20 +145,49 @@ return result; } /// <summary> /*/// <summary> /// 8.WCS入库读码反馈 /// 业务场景:WCS在执行任务时,回报任务状态 /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] /*[Route("notifyTaskStatus")]*/ *//*[Route("notifyTaskStatus")]*//* public ReturnResult readCodeFeedback(ReadCodeFeedbackModel model) { LogHelper.Info("【8.WCS入库读码反馈】Request:" + JsonConvert.SerializeObject(model), "WMS"); var result = ApiHelper.readCodeFeedback(model); LogHelper.Info("【8.WCS入库读码反馈】response:" + JsonConvert.SerializeObject(result), "WMS"); return result; }*/ /// <summary> /// 8.WCS反馈货位状态 /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] /* [Route("notifyAlarm")]*/ public ReturnResult locStateFeedBack(LocStateFeedBackModel model) { LogHelper.Info("locStateFeedBack 入参:" + JsonConvert.SerializeObject(model), "WMS"); ReturnResult result = new ReturnResult(); bool bo = ApiHelper.locStateFeedBack(model); if (!bo) { result.ResultCode = 1; } LogHelper.Info("locStateFeedBack 出参:" + JsonConvert.SerializeObject(result), "WMS"); return result; } public class LocStateFeedBackModel { public string reqId { get; set; } public string reqTime { get; set; } public string loc_code { get; set; } // 站台编码 public string type { get; set; } // 请求类型 1 允许取货 2 允许放货 public string req_no { get; set; } // 任务号 } // ----------------------------------- GT -------------------------------------------------------------- HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs
@@ -33,8 +33,8 @@ var TN_Task = WCSHelper.GetTask(model.No); if (TN_Task != null) { bool isExist = WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, model.State); if (!isExist) var wmsTask = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); if (wmsTask != null && wmsTask.N_B_STATE < 2) { WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); if (model.State <= 7) @@ -43,6 +43,7 @@ switch (model.State) { case 1: TN_Task.S_EQ_NO = model.ForkliftNo; WCSHelper.Begin(TN_Task); break; #region MyRegion @@ -59,21 +60,33 @@ case 6: TaskProcess.OperateStatus(TN_Task, 6); WCSHelper.UpdateStatus(TN_Task, "卸货完成"); // AGV卸货输送线,触发入库任务 if (TN_Task.S_END_LOC != wmsTask.S_END_LOC) { LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV卸货输送线,触发WCS入库任务", "AGV"); Container container = ContainerHelper.GetCntr(TN_Task.S_CNTR_CODE); if (container != null) { WCSCore.createLastTask(TN_Task.S_END_LOC, wmsTask, 1); } } break; #endregion case 2: WCSHelper.End(TN_Task); var cntrItemRels = ContainerHelper.GetCntrItemRel(TN_Task.S_CNTR_CODE); if (cntrItemRels.Count > 0) if (cntrItemRels.Count > 0) { LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV任务完成,任务信息回报GT", "AGV"); string shift = ApiHelper.getShift(DateTime.Now.TimeOfDay); string ydate_shiftName = ""; if (shift == "III") { ydate_shiftName = DateTime.Now.AddDays(-1).ToString("yy/MM/dd") + "-" + shift; } else else { ydate_shiftName = DateTime.Now.ToString("yy/MM/dd") + "-" + shift; } @@ -92,6 +105,7 @@ } break; case 7: LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV任务取消", "AGV"); //判断是否收到过强制取消,有就不做任何处理 if (!WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 17)) { @@ -101,28 +115,43 @@ break; } } else if (model.State == 1002) else if (model.State == 1003) { //查询当前终点是等待区,则查询入库agv接驳位 LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车进入等待位:{TN_Task.S_END_LOC}", "AGV"); // 卸货前等待 // 查询当前终点是等待区,则查询入库agv接驳位 var waitLoc = Settings.getAgvWaitLoc(TN_Task.S_END_LOC); if (waitLoc != null) { string endLoc = AGVApplyEndLoc(model.No); var endLoc = AGVApplyEndLoc(model.No); LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车变更终点:{endLoc.S_CODE}", "AGV"); // 通知AGV更改终点 ChangeParamModel paramModel = new ChangeParamModel() { task_no = model.No, param_no = 0, param = $"{model.No};{TN_Task.S_START_LOC};{TN_Task.S_END_LOC};0;400;0;2" }; LogHelper.Info($"通知AGV更改终点,参数:{paramModel}", "AGV"); /* NDCApi.ChangeOrderParam(paramModel);*/ } //如果不是等待区货位,则查询终点货位是否是入库接驳位 } else if (model.State == 1004) { LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车卸货后在接驳位:{TN_Task.S_END_LOC}等待", "AGV"); // 卸货后等待 // 查询终点货位是否是入库接驳位 var agvJBLoc = Settings.getAgvJBLoc(TN_Task.S_END_LOC); if (agvJBLoc != null && agvJBLoc.type == 1 && agvJBLoc.action == 1) if (agvJBLoc != null && agvJBLoc.type == 1 && agvJBLoc.action == 1) { //是则查询WCS的任务执行情况 var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE ,"WCS"); if (wcsTask != null) var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE, "WCS"); if (wcsTask != null) { bool existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 7); if (existAction) { LogHelper.Info($"下游任务:{wcsTask.S_CODE}取消入库,rfid校验失败,生成新任务到异常区", "AGV"); //如果WCS反馈7取消任务,则rfid校验失败,生成新任务到异常区,并变更agv任务号、起点、终点 var mst = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); var endLoc = WMSHelper.getErrorBufferAreaLoc(); @@ -132,20 +161,43 @@ mst.S_END_LOC = endLoc.S_CODE; mst.S_END_AREA = endLoc.S_AREA_CODE; WMSHelper.UpdateTaskEnd(mst); WCSCore.createLastTask(TN_Task.S_END_LOC, mst, 2); var newWcsTask = WCSCore.createLastTask(TN_Task.S_END_LOC, mst, 2, "入库异常区任务"); LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车改道终点:{newWcsTask.S_END_LOC}", "AGV"); if (newWcsTask != null) { WCSHelper.End(TN_Task); // 通知AGV更改终点 ChangeParamModel paramModel = new ChangeParamModel() { task_no = model.No, param_no = 0, param = $"{model.No};{newWcsTask.S_START_LOC};{newWcsTask.S_END_LOC};0;0;0;1" }; LogHelper.Info($"通知AGV更改终点,参数:{paramModel}", "AGV"); /*NDCApi.ChangeOrderParam(paramModel);*/ } return; } else { LogHelper.Info("", "AGV"); LogHelper.Info("异常区没有空货位,无法入库异常区", "AGV"); } } existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 3); if (existAction) if (existAction) { //WCS反馈3已取货,则agv任务正常结束 LogHelper.Info($"任务号:{TN_Task.S_CODE},RFID检测通过,AGV任务正常完成", "AGV"); //WCS反馈3已取货,则agv任务正常结束 ,通知AGV完成任务 ChangeParamModel paramModel = new ChangeParamModel() { task_no = model.No, param_no = 0, param = $"{model.No};{TN_Task.S_START_LOC};{TN_Task.S_END_LOC};0;0;0;1" }; LogHelper.Info($"通知AGV完成任务,参数:{paramModel}", "AGV"); /*NDCApi.ChangeOrderParam(paramModel);*/ } } } @@ -172,62 +224,75 @@ /// <param name="mst"></param> /// <param name="actType">1.入库 2.出库</param> /// <returns></returns> public static bool createLastTask(string startLocCode , WMSTask mst ,int actType) public static WCSTask createLastTask(string startLocCode , WMSTask mst ,int actType ,string typeName = null) { LogHelper.Info("创建下一段任务", "WMS"); var startLoc = LocationHelper.GetLoc(startLocCode); if (startLoc != null) LogHelper.Info($"作业号:{mst.S_CODE},创建下一段任务", "WMS"); var existTask = WCSHelper.GetTaskByStart(startLocCode); if (existTask == null) { string cntrCode = ""; string scheduleType = ""; if (actType == 1) var startLoc = LocationHelper.GetLoc(startLocCode); if (startLoc != null) { var locCntrRels = LocationHelper.GetLocCntr(startLocCode); if (locCntrRels.Count > 0) string cntrCode = ""; string scheduleType = ""; if (actType == 1) { foreach (var cntr in locCntrRels) var locCntrRels = LocationHelper.GetLocCntr(startLocCode); if (locCntrRels.Count > 0) { cntrCode = cntrCode + ","+ cntr.S_CNTR_CODE; foreach (var cntr in locCntrRels) { cntrCode = cntrCode + "," + cntr.S_CNTR_CODE; } cntrCode = cntrCode.Substring(1, cntrCode.Length - 1); } cntrCode = cntrCode.Substring(1, cntrCode.Length-1); scheduleType = "WCS"; } scheduleType = "WCS"; } if (actType == 2) { cntrCode = mst.S_CNTR_CODE; scheduleType = "AGV"; } if (actType == 2) { cntrCode = mst.S_CNTR_CODE; scheduleType = "AGV"; } string type = ""; if (typeName == null) { type = mst.S_TYPE + "-2"; } else { type = typeName; } // 创建一段入库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = mst.S_OP_DEF_NAME, S_OP_CODE = mst.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = cntrCode, S_TYPE = mst.S_TYPE + "-2", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = mst.S_END_LOC, S_END_AREA = mst.S_END_AREA, S_SCHEDULE_TYPE = scheduleType, N_PRIORITY = mst.N_PRIORITY, T_START_TIME = DateTime.Now, }; // 创建一段入库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = mst.S_OP_DEF_NAME, S_OP_CODE = mst.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = cntrCode, S_TYPE = type, S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = mst.S_END_LOC, S_END_AREA = mst.S_END_AREA, S_SCHEDULE_TYPE = scheduleType, N_PRIORITY = mst.N_PRIORITY, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、接驳点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); if (WCSHelper.CreateTask(wcsTask)) { // 起点、接驳点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); WMSHelper.UpdateTaskEnd(mst); return true; WMSHelper.UpdateTaskEnd(mst); return wcsTask; } } } return false; return null; } /// <summary> @@ -256,7 +321,7 @@ /// agv申请终点 /// </summary> /// <param name="taskNo"></param> public static string AGVApplyEndLoc(string taskNo) public static Location AGVApplyEndLoc(string taskNo) { LogHelper.Info($"任务号:{taskNo},AGV等待区申请终点", "AGV"); var cst = WCSHelper.GetTask(taskNo); @@ -280,6 +345,9 @@ agvLoc = LocationHelper.GetLoc(locCode); if (agvLoc != null && agvLoc.C_ENABLE == "Y") { LogHelper.Info($"检测AGV接驳位:{locCode}设备是否可用", "AGV"); cst.S_END_LOC = agvLoc.S_CODE; cst.S_END_AREA = agvLoc.S_AREA_CODE; WCSHelper.UpdateTaskEnd(cst); @@ -290,7 +358,7 @@ LocationHelper.LockLoc(endLoc.S_CODE, 1); LogHelper.Info($"任务号:{taskNo},AGV申请的终点:{agvLoc.S_CODE}", "AGV"); return agvLoc.S_CODE; return agvLoc; } } HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/TaskAction.cs
@@ -17,7 +17,7 @@ public string S_VALUE { get; set; } public string S_STATE_PRE { get; set; } public int N_REVIEW_RESULT { get; set; } public int N_S_STATUS { get; set; } = 0; public int N_S_STATUS { get; set; } = 0; // 安全交互状态 0.默认 1.允许(取货/卸货) public int N_ACTION_CODE { get; set; } } } HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/process/TaskProcess.cs
@@ -42,7 +42,6 @@ internal static void CacheBitCancelUpdate(WCSTask mst) { //任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点 if (WCSHelper.CheckActionRecordExist(mst.S_CODE, 4) ) { //根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。 //终点绑定 if (!WCSHelper.CheckActionRecordExist(mst.S_CODE, 5)) { CacheBitUpdate(mst, false); @@ -53,9 +52,6 @@ //起点终点解锁 LocationHelper.UnLockLoc(mst.S_START_LOC); LocationHelper.UnLockLoc(mst.S_END_LOC); //货位容器解绑 LocationHelper.UnBindingLoc(mst.S_START_LOC, new List<string> { mst.S_CNTR_CODE }); } } @@ -79,7 +75,7 @@ if (taskAction.N_S_STATUS == 1) { LogHelper.Info($"再次安全请求,设备已反馈", "AGV"); NDCApi.ChangeOrderParam(no, 8, "1"); /* NDCApi.ChangeOrderParam(no, 6, "1");*/ } } else @@ -88,11 +84,18 @@ bool result = false; if (state == 1101) { result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "1"); //请求取货, LogHelper.Info("向WCS发送取货申请信号", "AGV"); /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "1"); //取货申请,*/ result = true; } if (state == 1102) { //请求卸货, LogHelper.Info("向WCS发送取货完成安全退出信号", "AGV"); /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "2"); //取货完成安全退出*/ result = true; } if (state == 1103) //卸货申请, { var container = ContainerHelper.GetCntr(cst.S_CNTR_CODE); // 胎圈入库,下发母拖出库任务 \ 帘布、内衬入库,下发托盘回库任务 if (cst.S_TYPE.Contains("入库") && endLoc.N_LOCK_STATE == 0) @@ -117,10 +120,9 @@ result = true; } } // 胎圈入库 if (container.N_TYPE == 6 ) { else { // 胎圈入库 if (endLoc.N_CURRENT_NUM == 0) { LogHelper.Info("胎圈入库,接驳位缺少母拖,下发母拖出库任务", "AGV"); @@ -144,28 +146,17 @@ // 请求WCS是否允许放货 if (result) { result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "2"); // 请求放货 } if (result) { //根据终点判断,是cb02的入口,判断内存中状态(要状态时间),允许卸货,通知agv改参数 var dic = new Dictionary<string, string>(); //< Req >< Order No = 'TN2302020002' ParamNo = '18' Param1 = '12' /></ Req > dic.Add("No", no); dic.Add("ParamNo", "8"); dic.Add("Param1", "1"); NDC.ChangeOrder(dic); //改完参数车子就会自己卸货 LogHelper.Info("向WCS发送请求放货信号", "AGV"); /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "3"); // 请求放货*/ result = true; } } if (state == 1103) { result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "3"); //取货完成允许离开 } if (state == 1104) { result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "4"); //放货完成允许离开 LogHelper.Info("向WCS发送卸货完成安全退出信号", "AGV"); /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "4"); //卸货完成安全退出*/ result = true; } // 安全请求发送成功,添加任务动作记录 HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WCSHelper.cs
@@ -61,7 +61,7 @@ internal static WCSTask GetTaskBySrcNoAndScheduleType(string no ,string scheduleType) { var db = new SqlHelper<WCSTask>().GetInstance(); var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == no && a.S_SCHEDULE_TYPE == scheduleType && a.N_B_STATE < 3).First(); var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == no && a.S_SCHEDULE_TYPE == scheduleType).First(); return task; } internal static List<WCSTask> GetTaskListBySrcNo(string no) @@ -165,6 +165,12 @@ return db.Queryable<TaskAction>().Where(a => a.S_TASK_CODE == no.Trim() && a.N_ACTION_CODE == code).First(); } internal static bool updateActionRecord(TaskAction taskAction) { var db = new SqlHelper<TaskAction>().GetInstance(); return db.Updateable(taskAction).ExecuteCommand() > 0; } internal static void Begin(WCSTask task) { var db = new SqlHelper<WCSTask>().GetInstance(); if (task != null) {