| | |
| | | using Furion.Logging; |
| | | using IoTClient; |
| | | using NewLife.Reflection; |
| | | using SixLabors.ImageSharp.ColorSpaces; |
| | | using WCS.Application.Entity; |
| | | using WCS.Application.Util; |
| | | |
| | |
| | | AGV(mod); // AGV调度 |
| | | break; |
| | | case PLCTypeEnum.ShuttleCar: //穿梭车 |
| | | //ShuttleCar(mod); |
| | | ShuttleCar(mod); |
| | | break; |
| | | case PLCTypeEnum.RobotPalletizer: |
| | | RobotPalletizer(mod);//码垛机器人 |
| | |
| | | int valueTaskStr = Convert.ToInt32(valueTask); |
| | | //获取任务信息 根据 任务号、小车编号 |
| | | var carTask = _db.Queryable<WcsCarTasks>().First(m=>m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.CarTaskNo == valueTaskStr && m.CarNo == modDevice.PlcIdIP); |
| | | if (carTask == null) |
| | | if (carTask != null) |
| | | { |
| | | var modRests = modDevice.listStation.FirstOrDefault(s => s.Text == "复位"); |
| | | plcConn.SetDBValue(modRests.PosType, modRests.PlcPos, "1");//没有找到任务 复位 |
| | | return; |
| | | } |
| | | |
| | | var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.TaskNo == carTask.TaskNo); |
| | | if (modFinshTask == null) |
| | | { |
| | | break;//没有查询到总任务 |
| | | } |
| | | //获取路径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 (carTask != null && carTask.Status != TaskStatusEnum.Complete) |
| | | { |
| | | carTask.Status = TaskStatusEnum.Complete; |
| | | carTask.UpdateTime = DateTime.Now; |
| | | _db.Updateable(carTask).ExecuteCommand(); |
| | | //添加任务明细 |
| | | var taskMonitor = new WcsTaskMonitor() |
| | | //var modRests = modDevice.listStation.FirstOrDefault(s => s.Text == "复位"); |
| | | //plcConn.SetDBValue(modRests.PosType, modRests.PlcPos, "1");//没有找到任务 复位 |
| | | |
| | | var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.TaskNo == carTask.TaskNo); |
| | | if (modFinshTask == null) |
| | | { |
| | | TaskNo = carTask.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"穿梭车反馈任务完成" |
| | | }; |
| | | _db.Insertable(taskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | break;//没有查询到总任务 |
| | | } |
| | | if (carTask != null && carTask.Status != TaskStatusEnum.Complete) |
| | | { |
| | | carTask.Status = TaskStatusEnum.Complete; |
| | | carTask.UpdateTime = DateTime.Now; |
| | | _db.Updateable(carTask).ExecuteCommand(); |
| | | //添加任务明细 |
| | | var taskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = carTask.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"穿梭车反馈任务完成" |
| | | }; |
| | | _db.Insertable(taskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | |
| | | HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | //总任务下没有其他未执行小车的任务 变更总任务信息 |
| | | if (carTaskNext == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete) |
| | | { |
| | | modFinshTask.Status = TaskStatusEnum.Complete; |
| | | modFinshTask.FinishDate = DateTime.Now; |
| | | _db.Updateable(modFinshTask).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | //获取路径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; |
| | | _db.Updateable(modFinshTask).ExecuteCommand(); |
| | | |
| | | //反馈WMS系统 任务完成 |
| | | //HttpService httpService = new HttpService(); |
| | | //var requestMode = new TaskRequestWMS() |
| | | //{ |
| | | // TaskNo = modFinshTask.TaskNo, |
| | | // PalletNo = modFinshTask.PalletNo, |
| | | // TaskType = ((int)modFinshTask.TaskType).ToString(), |
| | | // TaskStatus = ((int)TaskStatusEnum.Complete).ToString() |
| | | //}; |
| | | //var modResponseTask = httpService.RequestTask(requestMode).Result; |
| | | //modFinshTask.IsSuccess = TaskSuccessEnum.Success; |
| | | //_db.Updateable(modFinshTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modFinshTask.Adapt<WcsTaskOutput>()); |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | var modStationX = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(X)"); |
| | | var (resultx, valuex) = plcConn.GetDBValue(modStationX.PosType, modStationX.PlcPos); |
| | | var modStationY = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Y)"); |
| | | var (resulty, valuey) = plcConn.GetDBValue(modStationY.PosType, modStationY.PlcPos); |
| | | var modStationZ = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Z)"); |
| | | var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos); |
| | | //判断任务是否充电任务,下发开始充电命令 |
| | | if (modFinshTask.Levels == 888) |
| | | { |
| | | //写入开始充电 |
| | | var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "充电命令"); |
| | | plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "2"); |
| | | } |
| | | |
| | | //反馈WMS系统 任务完成 |
| | | //HttpService httpService = new HttpService(); |
| | | //var requestMode = new TaskRequestWMS() |
| | | //{ |
| | | // TaskNo = modFinshTask.TaskNo, |
| | | // PalletNo = modFinshTask.PalletNo, |
| | | // TaskType = ((int)modFinshTask.TaskType).ToString(), |
| | | // TaskStatus = ((int)TaskStatusEnum.Complete).ToString() |
| | | //}; |
| | | //var modResponseTask = httpService.RequestTask(requestMode).Result; |
| | | //modFinshTask.IsSuccess = TaskSuccessEnum.Success; |
| | | //_db.Updateable(modFinshTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modFinshTask.Adapt<WcsTaskOutput>()); |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | WcsTask modTask; |
| | | //要下发路径2任务 |
| | |
| | | { |
| | | // 获取任务信息 |
| | | 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) |
| | | if (modTask != null) |
| | | { |
| | | return; |
| | | 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(); |
| | | } |
| | | 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 || carTaskNext == null) |
| | | //读取小车位置 |
| | | var modStationX = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(X)"); |
| | | var (resultx, valuex) = plcConn.GetDBValue(modStationX.PosType, modStationX.PlcPos); |
| | | var modStationY = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Y)"); |
| | | var (resulty, valuey) = plcConn.GetDBValue(modStationY.PosType, modStationY.PlcPos); |
| | | var modStationZ = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Z)"); |
| | | var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos); |
| | | var carXYZ = valuex.ToString().PadLeft(2, '0') + valuey.ToString().PadLeft(2, '0') + valuez.ToString().PadLeft(2, '0'); |
| | | if (modTask == null) |
| | | { |
| | | //判断小车是否有空闲时间记录 没有:添加 有:判断当前时间与记录时间是否满足5分钟 满足:添加让小车去充电任务 |
| | | //读取小车电量 |
| | | var modPosCarDl = modDevice.listStation.FirstOrDefault(s => s.Text == "电池电量"); |
| | | var (resultDl, valueDl) = plcConn.GetDBValue(modPosCarDl.PosType, modPosCarDl.PlcPos); |
| | | if (resultDl.IsSucceed && valueDl < (int)FourWayCarDLEnum.Dl) |
| | | { |
| | | var endLocateCar = ""; |
| | | if (valuez == 1) |
| | | { |
| | | endLocateCar = "210401"; |
| | | } |
| | | else if (valuez == 2) |
| | | { |
| | | endLocateCar = "210402"; //011202 |
| | | } |
| | | else |
| | | { |
| | | return; // 层数错误 |
| | | } |
| | | var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing); |
| | | if (getCdTask == null) |
| | | { |
| | | //添加小车充电位置 |
| | | WcsTask modCarTask = new WcsTask() |
| | | { |
| | | TaskNo = _taskService.GetTaskCode(), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.ShuttleCar, |
| | | StartLocate = carXYZ, |
| | | EndLocate = endLocateCar, |
| | | PalletNo = "", |
| | | Status = TaskStatusEnum.Wait, |
| | | Levels = 888, //充电等级优先任务等级 |
| | | Origin = "WCS", |
| | | CarIp = modDevice.PlcIdIP |
| | | }; |
| | | _db.Insertable(modCarTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>()); |
| | | } |
| | | |
| | | } |
| | | else if(resultDl.IsSucceed && valueDl < (int)FourWayCarDLEnum.Dl2) |
| | | { |
| | | //判断小车是否有空闲时间记录 没有:添加 有:判断当前时间与记录时间是否满足5分钟 满足:添加让小车去充电任务 |
| | | var carTime = _db.Queryable<WcsCarTime>().First(m => m.IsDelete == false && m.CarIp == modDevice.PlcIdIP); |
| | | if (carTime == null) |
| | | { |
| | | var carTimeAdd = new WcsCarTime() |
| | | { |
| | | CarIp = modDevice.PlcIdIP, |
| | | CarTime = DateTime.Now |
| | | }; |
| | | _db.Insertable(carTimeAdd).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | if (carTime.CarTime == null) |
| | | { |
| | | carTime.CarTime = DateTime.Now; |
| | | carTime.UpdateTime = DateTime.Now; |
| | | _db.Updateable(carTime).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | var date1 = DateTime.Now; |
| | | var data2 = (DateTime)carTime.CarTime; |
| | | TimeSpan interval = date1 - data2; |
| | | if (interval.TotalMinutes >= 5) |
| | | { |
| | | var endLocateCar = ""; |
| | | if (valuez == 1) |
| | | { |
| | | endLocateCar = "210401"; |
| | | } |
| | | else if (valuez == 2) |
| | | { |
| | | endLocateCar = "210402"; |
| | | } |
| | | else |
| | | { |
| | | return; // 层数错误 |
| | | } |
| | | var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing); |
| | | if (getCdTask == null) |
| | | { |
| | | //添加小车充电位置 |
| | | WcsTask modCarTask = new WcsTask() |
| | | { |
| | | TaskNo = _taskService.GetTaskCode(), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.ShuttleCar, |
| | | StartLocate = carXYZ, |
| | | EndLocate = endLocateCar, |
| | | PalletNo = "", |
| | | Status = TaskStatusEnum.Wait, |
| | | Levels = 888, //充电等级优先任务等级 |
| | | Origin = "WCS", |
| | | CarIp = modDevice.PlcIdIP |
| | | }; |
| | | _db.Insertable(modCarTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>()); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | return; |
| | | } |
| | | |
| | | if (carTaskNext == null) |
| | | { |
| | | return; |
| | | } |
| | | if (carTaskNext.Status == TaskStatusEnum.Doing) |
| | | { |
| | | Thread.Sleep(3000); |
| | | return; |
| | | } |
| | | |
| | | //判断当前任务是否还有前置任务未完成 |
| | | var preStrs = carTaskNext.PreId.Split(';'); |
| | | foreach (var preStr in preStrs) |
| | |
| | | return;//前置任务未完成 |
| | | } |
| | | } |
| | | |
| | | //先复位 |
| | | var modRest = modDevice.listStation.FirstOrDefault(s => s.Text == "复位"); |
| | | plcConn.SetDBValue(modRest.PosType, modRest.PlcPos, "1"); |
| | |
| | | List<Result> listResult = new List<Result>(); |
| | | //获取小车任务号 |
| | | var carTaskNo = FourWayCarUtil.GetTaskNo(); |
| | | |
| | | |
| | | //判断任务是否充电任务 |
| | | if (modTask.Levels == 888) |
| | | { |
| | | //写入充电命令 |
| | | var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "充电命令"); |
| | | listResult.Add(plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "1")); |
| | | } |
| | | |
| | | var modWriteTask = modDevice.listStation.FirstOrDefault(s => s.Text == "写入任务号"); |
| | | listResult.Add(plcConn.SetDBValue(modWriteTask.PosType, modWriteTask.PlcPos, carTaskNo.ToString())); |
| | | |
| | |
| | | carTaskNext.CarTaskNo = carTaskNo; |
| | | _db.Updateable(carTaskNext).ExecuteCommand(); |
| | | //清除小车空闲时间 |
| | | var carTimeClear = _db.Queryable<WcsCarTime>().First(m=>m.IsDelete == false && m.CarIp == modDevice.PlcIdIP); |
| | | if (carTimeClear!= null) |
| | | { |
| | | carTimeClear.CarTime = null; |
| | | carTimeClear.UpdateTime = DateTime.Now; |
| | | _db.Updateable(carTimeClear).ExecuteCommand(); |
| | | } |
| | | var taskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = carTaskNext.TaskNo, |