| | |
| | | /// <param name="models">任务信息</param> |
| | | /// <returns>反馈信息</returns> |
| | | [AllowAnonymous] |
| | | public async Task AddAssignTasks(ResponseTasksModel models) |
| | | public async Task<ResponseAgvDto> AddAssignTasks(AgvTaskSend models) |
| | | { |
| | | // 验证任务是否已存在 |
| | | var taskInfo = await _db.Queryable<WcsTask>().FirstAsync(w => w.TaskNo == models.TaskNo); |
| | | if (taskInfo == null) |
| | | { |
| | | throw Oops.Bah("任务:" + models.TaskNo + ";不存在!"); |
| | | } |
| | | var data1 = FourWayCarUtil.GetCarPath("091501", "091601","0"); |
| | | if (data1 == null) //|| data1.Count == 0 |
| | | { |
| | | throw Oops.Bah("分配路径不存在!"); |
| | | } |
| | | |
| | | // 根据任务状态 补充起始结束节点状态 |
| | | var data2 = FourWayCarUtil.GetCarPathUp(data1, 0); |
| | | var path = ""; |
| | | var executionPath1 = ""; |
| | | var response = await new HttpService().GenAgvSendTask(models); |
| | | //var response2 = await new HttpService().GenAgvContinueTask("Tk20250503000001"); |
| | | //var response3 = await new HttpService().GenAgvUnbind("models", "B010101"); |
| | | return response; |
| | | // 验证任务是否已存在 |
| | | //var taskInfo = await _db.Queryable<WcsTask>().FirstAsync(w => w.TaskNo == models.TaskNo); |
| | | //if (taskInfo == null) |
| | | //{ |
| | | // throw Oops.Bah("任务:" + models.TaskNo + ";不存在!"); |
| | | //} |
| | | //var data1 = FourWayCarUtil.GetCarPath("091501", "091601","0"); |
| | | //if (data1 == null) //|| data1.Count == 0 |
| | | //{ |
| | | // throw Oops.Bah("分配路径不存在!"); |
| | | //} |
| | | |
| | | //// 根据任务状态 补充起始结束节点状态 |
| | | //var data2 = FourWayCarUtil.GetCarPathUp(data1, 0); |
| | | //var path = ""; |
| | | //var executionPath1 = ""; |
| | | //foreach (var item in data1) |
| | | //{ |
| | | // //路径节点 |
| | |
| | | { |
| | | case "end"://任务完成 |
| | | { |
| | | |
| | | //货品拉到密集库入库口需要向输送线写入值 |
| | | if (modTask.EndLocate == AGVStaionEnum.A1.ToString()) |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == "输送线"); |
| | | var modConn = new PLCUtil(modPlc); |
| | | var modDevice = PLCTaskAction.plcDevices.First(s => s.Text == "C口"); |
| | | var modStation = PLCTaskAction.plcPositions.First(s => s.Text == "C口申请入库"); |
| | | var plcResult = modConn.SetPlcDBValue(modStation.PosType, modDevice.DbNumber, modStation.PlcPos, "100"); |
| | | if (plcResult.IsSucceed) |
| | | { |
| | | WcsTaskMonitor modTaskMonitorPLC = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modStation.PlcPos, |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modStation.Text}写入指令100,结果{plcResult.IsSucceed}", |
| | | }; |
| | | _db.Insertable(modTaskMonitorPLC).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitorPLC.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | else |
| | | { |
| | | Log.Error("C口申请入库写入值100失败"); |
| | | } |
| | | } |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | await _db.Updateable(modTask).ExecuteCommandAsync(); |
| | |
| | | var inputs = new TaskRequestWMS(); |
| | | inputs.TaskNo = modTask.TaskNo; |
| | | inputs.PalletNo = modTask.PalletNo; |
| | | inputs.TaskType = "2"; |
| | | inputs.TaskType = modTask.TaskType.ToString(); |
| | | inputs.TaskStatus = "2"; |
| | | var modResponseTask = httpService.RequestTask(inputs).Result; |
| | | } |
| | | |
| | | } |
| | | break; |
| | | case "outbin"://走出储位 |
| | | case "admin"://走出储位 |
| | | { |
| | | //反馈WMS任务取货完成、WMS判断是平库储位就更新储位状态 |
| | | if (modTask.Origin == "WMS") |
| | |
| | | |
| | | } |
| | | break; |
| | | case "apply"://放货申请 |
| | | case "continue"://放货申请 |
| | | { |
| | | //todo:去码垛工位取货,需要写PLC信号关闭光幕 |
| | | if ((modTask.StartLocate == AGVStaionEnum.B1.ToString() || modTask.StartLocate == AGVStaionEnum.B2.ToString()) |
| | | && (modTask.EndLocate == AGVStaionEnum.C1.ToString() || modTask.EndLocate == AGVStaionEnum.C2.ToString())) |
| | | if (modTask.EndLocate != "B010101")//9号工位地址 |
| | | { |
| | | var no = modTask.StartLocate.Substring(1, 1); |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.RobotPalletizer && s.WareHouseNo == no); |
| | | var modConn = new PLCUtil(modPlc); |
| | | var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB); |
| | | var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "关闭光幕"); |
| | | var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1"); |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modPos.PlcPos, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modDevice.Text}写入关闭光幕1,结果{res.IsSucceed}", |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | Task.Run(() => |
| | | { |
| | | Thread.Sleep(1000); |
| | | modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "0"); |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modPos.PlcPos, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modDevice.Text}写入开启光幕0,结果{res.IsSucceed}", |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | }); |
| | | modConn.Close(); |
| | | result.Code = "1"; |
| | | result.Message = "找不到该任务"; |
| | | return result; |
| | | } |
| | | } |
| | | break; |
| | | case "start"://任务开始 |
| | | { |
| | | //开始向拆托机放入托盘任务 |
| | | if (modTask.EndLocate == AGVStaionEnum.D1.ToString()) |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine); |
| | | var modConn = new PLCUtil(modPlc); |
| | | var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.Text == "拆托机"); |
| | | var res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "1"); |
| | | modConn.Close(); |
| | | } |
| | | |
| | | var taskMonitor = new WcsTaskMonitor() |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.IsComple = "1"; |
| | | await _db.Updateable(modTask).ExecuteCommandAsync(); |
| | | WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcName = input.Method, |
| | | InteractiveMsg = $"AGV小车反馈任务开始" |
| | | //PlcId = modDevice.PlcId, |
| | | PlcName = "AGV", |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"AGV小车反馈任务到达9工位", |
| | | }; |
| | | await _db.Insertable(taskMonitor).ExecuteCommandAsync(); |
| | | HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | await _db.Insertable(modTaskMonitor).ExecuteCommandAsync(); |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | } |
| | | break; |
| | | case "cancel"://任务取消 |
| | |
| | | |
| | | return result; |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取原材料仓状态 |
| | | /// </summary> |
| | |
| | | /// </summary> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | [UnitOfWork] |
| | | public async Task ProductStorage(RequestStorage input) |
| | | { |
| | | var intProduct = AGVStorageUtil.ProductCount(); |
| | | var intTask = await _db.Queryable<WcsTask>().Where(s => s.TaskType == TaskTypeEnum.Move |
| | | && s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing |
| | | && s.StartLocate.StartsWith("Z") && s.EndLocate == AGVStaionEnum.A1.ToString()).CountAsync(); |
| | | if (input.Qty > intProduct) |
| | | throw Oops.Bah($"输入数量大于可出数量{intProduct}"); |
| | | var listTask = new List<WcsTask>(); |
| | | var TaskNo = GetTaskCode("WCS"); |
| | | for (int i = 0; i < input.Qty; i++) |
| | | { |
| | | listTask.Add(new WcsTask() |
| | | { |
| | | TaskNo = "WCS" + DateTime.Now.ToString("yyyyMMdd") + (TaskNo++).ToString().PadLeft(4, '0'), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.AGV, |
| | | StartLocate = AGVStaionEnum.Z11.ToString(), |
| | | EndLocate = AGVStaionEnum.A1.ToString(), |
| | | PalletNo = "", |
| | | Status = TaskStatusEnum.Wait, |
| | | Levels = 10, |
| | | Origin = "PDA" |
| | | }); |
| | | } |
| | | await _db.Insertable(listTask).ExecuteCommandAsync(); |
| | | } |
| | | //[HttpPost] |
| | | //[UnitOfWork] |
| | | //public async Task ProductStorage(RequestStorage input) |
| | | //{ |
| | | // var intProduct = AGVStorageUtil.ProductCount(); |
| | | // var intTask = await _db.Queryable<WcsTask>().Where(s => s.TaskType == TaskTypeEnum.Move |
| | | // && s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing |
| | | // && s.StartLocate.StartsWith("Z") && s.EndLocate == AGVStaionEnum.A1.ToString()).CountAsync(); |
| | | // if (input.Qty > intProduct) |
| | | // throw Oops.Bah($"输入数量大于可出数量{intProduct}"); |
| | | // var listTask = new List<WcsTask>(); |
| | | // var TaskNo = GetTaskCode("WCS"); |
| | | // for (int i = 0; i < input.Qty; i++) |
| | | // { |
| | | // listTask.Add(new WcsTask() |
| | | // { |
| | | // TaskNo = "WCS" + DateTime.Now.ToString("yyyyMMdd") + (TaskNo++).ToString().PadLeft(4, '0'), |
| | | // TaskType = TaskTypeEnum.Move, |
| | | // Type = PLCTypeEnum.AGV, |
| | | // StartLocate = AGVStaionEnum.Z11.ToString(), |
| | | // EndLocate = AGVStaionEnum.A1.ToString(), |
| | | // PalletNo = "", |
| | | // Status = TaskStatusEnum.Wait, |
| | | // Levels = 10, |
| | | // Origin = "PDA" |
| | | // }); |
| | | // } |
| | | // await _db.Insertable(listTask).ExecuteCommandAsync(); |
| | | //} |
| | | /// <summary> |
| | | /// 自动生成任务号 |
| | | /// </summary> |