| | |
| | | var (resultTaskStatus, valueTaskStatus) = plcConn.GetDBValue(modPosTaskStatus.PosType, modPosTaskStatus.PlcPos); |
| | | //判断读取任务状态是否成功 并且任务状态是1 0:无任务,1:任务完成,2:任务取消,3:任务暂停,4:任务异常 5:任务执行中 |
| | | |
| | | WcsCarTasks carTask2 = null;//null 新任务 not null 路径2任务 |
| | | |
| | | WcsCarTasks carTaskNext = null;//null 新任务 not null 当前小车&&当前任务 下一节任务 |
| | | |
| | | if (resultTaskStatus.IsSucceed && valueTaskStatus == 1) |
| | | { |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号"); |
| | |
| | | if (modFinshTask == null) |
| | | { |
| | | break;//没有查询到总任务 |
| | | } |
| | | //获取路径2的任务 下发 |
| | | carTask2 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == carTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.PreId.Contains(carTask.Id.ToString())).OrderBy(m=>m.CreateTime).First(); |
| | | |
| | | } |
| | | if (carTask != null && carTask.Status != TaskStatusEnum.Complete) |
| | | { |
| | | carTask.Status = TaskStatusEnum.Complete; |
| | |
| | | |
| | | HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | //没有路径2的任务 变更总任务信息 |
| | | if (carTask2 == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete) |
| | | //获取路径2的任务 下发 |
| | | carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == carTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status <= TaskStatusEnum.Doing).OrderBy(m => m.CreateTime).First(); |
| | | //总任务下没有其他未执行小车的任务 变更总任务信息 |
| | | if (carTaskNext == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete) |
| | | { |
| | | modFinshTask.Status = TaskStatusEnum.Complete; |
| | | modFinshTask.FinishDate = DateTime.Now; |
| | |
| | | var modStationZ = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Z)"); |
| | | var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos); |
| | | |
| | | |
| | | |
| | | WcsTask modTask; |
| | | //要下发路径2任务 |
| | | if (carTask2 != null) |
| | | if (carTaskNext != null) |
| | | { |
| | | modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTask2.TaskNo && s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar); |
| | | modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTaskNext.TaskNo && s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.CarIp == modDevice.PlcIdIP); |
| | | |
| | | carTask2= _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).OrderBy(m => m.CreateTime).First(); |
| | | carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First(); |
| | | } |
| | | else |
| | | { |
| | | // 获取任务信息 |
| | | modTask = _db.Queryable<WcsTask>().Where(s => s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime).First(); |
| | | modTask = _db.Queryable<WcsTask>().Where(s => s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.CarIp == modDevice.PlcIdIP).OrderBy(m => m.Levels).OrderBy(m => m.CreateTime).First(); |
| | | if (modTask == null) |
| | | { |
| | | return; |
| | | } |
| | | carTask2 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).OrderBy(m => m.CreateTime).First(); |
| | | carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First(); |
| | | } |
| | | |
| | | //return; |
| | | if (modTask == null || carTask2 == null) |
| | | if (modTask == null || carTaskNext == null) |
| | | { |
| | | //判断小车是否有空闲时间记录 没有:添加 有:判断当前时间与记录时间是否满足5分钟 满足:添加让小车去充电任务 |
| | | return; |
| | | } |
| | | |
| | | if (carTask2.Status == TaskStatusEnum.Doing) |
| | | if (carTaskNext.Status == TaskStatusEnum.Doing) |
| | | { |
| | | Thread.Sleep(3000); |
| | | return; |
| | | } |
| | | //判断当前任务是否还有前置任务未完成 |
| | | var preStrs = carTask2.PreId.Split(';'); |
| | | var preStrs = carTaskNext.PreId.Split(';'); |
| | | foreach (var preStr in preStrs) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(preStr)) |
| | |
| | | int posStatus = Convert.ToInt32(modNodeStatus.PlcPos); |
| | | |
| | | //交互路径 |
| | | var execuPath = carTask2.ExecutionPath.Split(';'); |
| | | var execuPath = carTaskNext.ExecutionPath.Split(';'); |
| | | if (Convert.ToInt32(valuex) != Convert.ToInt32(execuPath[0].Substring(0, 2)) || Convert.ToInt32(valuey) != Convert.ToInt32(execuPath[0].Substring(2, 2)) || Convert.ToInt32(valuez) != Convert.ToInt32(execuPath[0].Substring(4, 2))) |
| | | { |
| | | return; //小车位置与路径起始位置不同 |
| | |
| | | var result = plcConn.SetDBValue(modStart.PosType, modStart.PlcPos, "1"); |
| | | if (result.IsSucceed) |
| | | { |
| | | carTask2.Status = TaskStatusEnum.Doing; |
| | | carTask2.CarTaskNo = carTaskNo; |
| | | _db.Updateable(carTask2).ExecuteCommand(); |
| | | carTaskNext.Status = TaskStatusEnum.Doing; |
| | | carTaskNext.CarTaskNo = carTaskNo; |
| | | _db.Updateable(carTaskNext).ExecuteCommand(); |
| | | //清除小车空闲时间 |
| | | var taskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = carTask2.TaskNo, |
| | | TaskNo = carTaskNext.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"向穿梭车下发任务{carTask2.TaskNo}" |
| | | InteractiveMsg = $"向穿梭车下发任务{carTaskNext.TaskNo}" |
| | | }; |
| | | _db.Insertable(taskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |