| | |
| | | { |
| | | case "end"://任务完成 |
| | | { |
| | | PLCService.AGVStatus = false; |
| | | //把成品货物拉到缓存工位后,下一个任务把托盘拉去提升机或者缓存区(优先级低一点) |
| | | if (modTask.EndLocate == AGVStaionEnum.C1.ToString() || modTask.EndLocate == AGVStaionEnum.C2.ToString()) |
| | | { |
| | | var strEndLocate = ""; |
| | | Enum.TryParse(await _sysConfigService.GetConfigValue<string>("workshop_Trend"), out WorkshopEnum workshop); |
| | | if (workshop == WorkshopEnum.Storage) |
| | | strEndLocate = AGVStaionEnum.A1.ToString(); |
| | | else |
| | | strEndLocate = AGVStorageUtil.GetProductInStorage(); |
| | | WcsTask modInsertTask = new WcsTask() |
| | | { |
| | | TaskNo = _taskService.GetTaskCode(), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.AGV, |
| | | StartLocate = modTask.EndLocate,//缓存区 |
| | | EndLocate = strEndLocate, |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Wait, |
| | | Levels = 6, |
| | | Origin = "WCS" |
| | | }; |
| | | await _db.Insertable(modInsertTask).ExecuteCommandAsync(); |
| | | HubUtil.PublicTask(modInsertTask.Adapt<WcsTaskOutput>()); |
| | | } |
| | | |
| | | //货品拉到电梯口需要向输送线写入100 |
| | | |
| | | //货品拉到密集库入库口需要向输送线写入值 |
| | | if (modTask.EndLocate == AGVStaionEnum.A1.ToString()) |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == "输送线"); |
| | |
| | | Log.Error("C口申请入库写入值100失败"); |
| | | } |
| | | } |
| | | //放入拆托机后,向拆托机写入完成信号 |
| | | 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, "0"); |
| | | var modTaskMonitorPLC = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modDevice.WcsPos, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modDevice.Text}写入完成信号0,结果{res.IsSucceed}", |
| | | }; |
| | | _db.Insertable(modTaskMonitorPLC).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitorPLC.Adapt<WcsTaskMonitorOutput>()); |
| | | modConn.Close(); |
| | | } |
| | | //if (modTask.EndLocate == AGVStaionEnum.B1.ToString() || modTask.EndLocate == AGVStaionEnum.B2.ToString()) |
| | | //{ |
| | | // var num = modTask.EndLocate.Substring(1, 1); |
| | | // var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.RobotPalletizer && s.WareHouseNo == num); |
| | | // var modConn = new PLCUtil(modPlc); |
| | | // var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB); |
| | | // var res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos, "0"); |
| | | // var modTaskMonitorPLC = new WcsTaskMonitor() |
| | | // { |
| | | // TaskNo = modTask.TaskNo, |
| | | // PlcId = modDevice.PlcId, |
| | | // PlcName = modDevice.PlcPos, |
| | | // Status = TaskStatusEnum.Doing, |
| | | // InteractiveMsg = $"向{modDevice.Text}写入放托完成信号,结果{res.IsSucceed}", |
| | | // }; |
| | | // _db.Insertable(modTaskMonitorPLC).ExecuteCommand(); |
| | | // HubUtil.PublicTaskMonitor(modTaskMonitorPLC.Adapt<WcsTaskMonitorOutput>()); |
| | | // modConn.Close(); |
| | | //} |
| | | if (modTask.EndLocate == AGVStaionEnum.F1.ToString()) |
| | | { |
| | | await _sysConfigService.UpdateConfigValue("cache_Materal", true); |
| | | } |
| | | if (modTask.StartLocate == AGVStaionEnum.F1.ToString()) |
| | | { |
| | | await _sysConfigService.UpdateConfigValue("cache_Materal", false); |
| | | } |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | await _db.Updateable(modTask).ExecuteCommandAsync(); |
| | |
| | | await _db.Insertable(modTaskMonitor).ExecuteCommandAsync(); |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | //反馈WMS任务完成 |
| | | if (modTask.Origin == "WMS") |
| | | { |
| | | HttpService httpService = new HttpService(); |
| | |
| | | inputs.TaskStatus = "2"; |
| | | var modResponseTask = httpService.RequestTask(inputs).Result; |
| | | } |
| | | //托盘进出缓存区 需要记录 |
| | | if (new[] { "Z", "C" }.Contains(modTask.EndLocate.Substring(0, 1))) |
| | | { |
| | | await _sysConfigService.UpdateConfigValue($"cache_{modTask.EndLocate}", true); |
| | | } |
| | | if (new[] { "Z", "C" }.Contains(modTask.StartLocate.Substring(0, 1))) |
| | | { |
| | | await _sysConfigService.UpdateConfigValue($"cache_{modTask.StartLocate}", false); |
| | | } |
| | | |
| | | } |
| | | break; |
| | | case "outbin"://走出储位 |
| | | { |
| | | //取空托完成后,向拆托机写入完成信号 |
| | | if (modTask.StartLocate == AGVStaionEnum.D1.ToString() && (modTask.EndLocate == AGVStaionEnum.B1.ToString() || modTask.EndLocate == AGVStaionEnum.B2.ToString())) |
| | | //反馈WMS任务取货完成、WMS判断是平库储位就更新储位状态 |
| | | if (modTask.Origin == "WMS") |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine); |
| | | var modConn = new PLCUtil(modPlc); |
| | | var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.Text == "拆托机"); |
| | | var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "取托信号"); |
| | | var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "0"); |
| | | WcsTaskMonitor 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>()); |
| | | modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "取托完成"); |
| | | res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1"); |
| | | 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>()); |
| | | modConn.Close(); |
| | | HttpService httpService = new HttpService(); |
| | | var inputs = new TaskRequestWMS(); |
| | | inputs.TaskNo = modTask.TaskNo; |
| | | inputs.PalletNo = modTask.PalletNo; |
| | | inputs.TaskType = "2"; |
| | | inputs.TaskStatus = "2"; |
| | | var modResponseTask = httpService.RequestTaskQh(inputs).Result; |
| | | } |
| | | //todo:去码垛工位取货完成后,需要写PLC信号开启光幕 |
| | | if ((modTask.StartLocate == AGVStaionEnum.B1.ToString() || modTask.StartLocate == AGVStaionEnum.B2.ToString()) |
| | | && (modTask.EndLocate == AGVStaionEnum.C1.ToString() || modTask.EndLocate == AGVStaionEnum.C2.ToString())) |
| | | { |
| | | var num = modTask.StartLocate.Substring(1, 1); |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.RobotPalletizer && s.WareHouseNo == num); |
| | | 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>()); |
| | | //写入光幕0 |
| | | Task.Run(() => |
| | | { |
| | | 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 == "开启光幕"); |
| | | Thread.Sleep(1000); |
| | | var res = 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>()); |
| | | }); |
| | | |
| | | //向码垛机器人写取托完成信号 |
| | | modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.Station); |
| | | res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos, "0"); |
| | | modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modPos.PlcPos, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modDevice.Text}写入取托完成信号,结果{res.IsSucceed}", |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | modConn.Close(); |
| | | } |
| | | //起始工位是提升机取货工位 |
| | | if (modTask.StartLocate == AGVStaionEnum.A1.ToString()) |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.ConveyorLine); |
| | | var modConn = new PLCUtil(modPlc); |
| | | var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Text == "C口"); |
| | | var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "取走确认"); |
| | | var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1"); |
| | | Log.Information($"向plc{modDevice.PlcId}写入1-取走确认,结果:{res.ToJson()}"); |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modPos.PlcPos, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modDevice.Text}写入取走确认,结果{res.IsSucceed}", |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | } |
| | | break; |
| | | case "apply"://放货申请 |
| | |
| | | HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | break; |
| | | case "cancel"://任务结束 |
| | | case "cancel"://任务取消 |
| | | { |
| | | PLCService.AGVStatus = false; |
| | | modTask.IsSuccess = TaskSuccessEnum.Fail; |