| | |
| | | using Admin.NET.Core.Service; |
| | | using AngleSharp.Io; |
| | | using COSXML.Network; |
| | | using DocumentFormat.OpenXml.Bibliography; |
| | | using DocumentFormat.OpenXml.Drawing; |
| | | using DocumentFormat.OpenXml.Spreadsheet; |
| | | using DocumentFormat.OpenXml.Wordprocessing; |
| | | using Elastic.Clients.Elasticsearch.Snapshot; |
| | | using Furion.Logging; |
| | | using IoTClient; |
| | | using NewLife.Reflection; |
| | | using SixLabors.ImageSharp.ColorSpaces; |
| | | using WCS.Application.Entity; |
| | | using WCS.Application.Util; |
| | | |
| | |
| | | try |
| | | { |
| | | var mod = sender as WcsDeviceDto; |
| | | |
| | | //Console.WriteLine($"{mod.Text}值为" + mod.Value); |
| | | switch (mod.Type) |
| | | { |
| | |
| | | TaskNo = _taskService.GetTaskCode(), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.AGV, |
| | | StartLocate = AGVStorageUtil.GetPalletOutStorage(), |
| | | StartLocate = "", |
| | | EndLocate = AGVStaionEnum.D1.ToString(), |
| | | PalletNo = "", |
| | | Status = TaskStatusEnum.Wait, |
| | |
| | | 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 == "任务号"); |
| | |
| | | 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的任务 下发 |
| | | 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; |
| | | 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, |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"穿梭车反馈任务完成" |
| | | }; |
| | | _db.Insertable(taskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | |
| | | HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | 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) |
| | | { |
| | | if (modFinshTask.TaskType == TaskTypeEnum.Out) |
| | | { |
| | | //#region 任务变更成输送线任务 |
| | | //modFinshTask.Status = TaskStatusEnum.Wait; |
| | | //modFinshTask.Type = PLCTypeEnum.ConveyorLine; |
| | | //_db.Updateable(modFinshTask).ExecuteCommand(); |
| | | |
| | | //#endregion |
| | | |
| | | #region 输送线 写入PLC 740 |
| | | |
| | | var text = ""; |
| | | var devStation = ""; //工位 |
| | | var endLocate = modFinshTask.EndRoadway; |
| | | var carcon = new carConverModel(); |
| | | if ( carcon.conveyorBei.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线北"; |
| | | devStation = carcon.conveyorBei[endLocate]; |
| | | } |
| | | else if (carcon.conveyorNan.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线南"; |
| | | devStation = carcon.conveyorNan[endLocate]; |
| | | } |
| | | if (text != "") |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text); |
| | | var modConn = new PLCUtil(modPlc); |
| | | |
| | | var modDeviceConver = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation); |
| | | var (plcResult, palletVal) = modConn.GetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.PlcPos); |
| | | if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 730) |
| | | { |
| | | modConn.Close(); |
| | | return;//放货工位没有读取成功或不是空闲 |
| | | } |
| | | |
| | | var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "740"); |
| | | if (!plcResult.IsSucceed) |
| | | { |
| | | modConn.Close(); |
| | | return; |
| | | } |
| | | //添加任务明细 |
| | | var taskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modFinshTask.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"写入指令740:托盘到达{modFinshTask.EndRoadway}" |
| | | }; |
| | | _db.Insertable(taskMonitor).ExecuteCommand(); |
| | | modConn.Close(); |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | else |
| | | { |
| | | modFinshTask.Status = TaskStatusEnum.Complete; |
| | | modFinshTask.FinishDate = DateTime.Now; |
| | | _db.Updateable(modFinshTask).ExecuteCommand(); |
| | | } |
| | | |
| | | //判断任务是否充电任务,下发开始充电命令 |
| | | 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>()); |
| | | |
| | | } |
| | | } |
| | | //没有路径2的任务 变更总任务信息 |
| | | if (carTask2 == 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>()); |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | WcsTask modTask; |
| | | //要下发路径2任务 |
| | | if (carTaskNext != null) |
| | | { |
| | | 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); |
| | | |
| | | 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 && s.CarIp == modDevice.PlcIdIP).OrderBy(m => m.Levels).OrderBy(m => m.CreateTime).First(); |
| | | if (modTask != null) |
| | | { |
| | | 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(); |
| | | } |
| | | } |
| | | |
| | | //读取小车位置 |
| | | 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); |
| | | |
| | | |
| | | WcsTask modTask; |
| | | //要下发路径2任务 |
| | | if (carTask2 != null) |
| | | var carXYZ = valuex.ToString().PadLeft(2, '0') + valuey.ToString().PadLeft(2, '0') + valuez.ToString().PadLeft(2, '0'); |
| | | if (modTask == null) |
| | | { |
| | | modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTask2.TaskNo && s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar); |
| | | |
| | | carTask2= _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).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(); |
| | | if (modTask == null) |
| | | //读取小车电量 |
| | | var modPosCarDl = modDevice.listStation.FirstOrDefault(s => s.Text == "电池电量"); |
| | | var (resultDl, valueDl) = plcConn.GetDBValue(modPosCarDl.PosType, modPosCarDl.PlcPos); |
| | | if (resultDl.IsSucceed && valueDl < (int)FourWayCarDLEnum.Dl) |
| | | { |
| | | return; |
| | | 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) |
| | | { |
| | | var (resultDlLock, valueDlLock) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos); |
| | | if (resultDlLock.IsSucceed && valueDlLock!=3) |
| | | { |
| | | //添加小车充电位置 |
| | | 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>()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | carTask2 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).OrderBy(m => m.CreateTime).First(); |
| | | } |
| | | 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) |
| | | { |
| | | var (resultDlLock, valueDlLock) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos); |
| | | if (resultDlLock.IsSucceed && valueDlLock != 3) |
| | | { |
| | | //添加小车充电位置 |
| | | 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 (modTask == null || carTask2 == null) |
| | | { |
| | | //判断小车是否有空闲时间记录 没有:添加 有:判断当前时间与记录时间是否满足5分钟 满足:添加让小车去充电任务 |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | return; |
| | | } |
| | | |
| | | if (carTask2.Status == TaskStatusEnum.Doing) |
| | | if (carTaskNext == null) |
| | | { |
| | | return; |
| | | } |
| | | 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)) |
| | |
| | | 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())); |
| | | |
| | |
| | | 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(); |
| | | |
| | | if (modTask.TaskType == TaskTypeEnum.Out) |
| | | { |
| | | #region 输送线 写入PLC 730 |
| | | |
| | | var text = ""; |
| | | var devStation = ""; |
| | | var endLocate = modTask.EndRoadway; |
| | | var carcon = new carConverModel(); |
| | | if (carcon.conveyorBei.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线北"; |
| | | devStation = carcon.conveyorBei[endLocate]; |
| | | } |
| | | else if (carcon.conveyorNan.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线南"; |
| | | devStation = carcon.conveyorNan[endLocate]; |
| | | } |
| | | if (text != "") |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text); |
| | | var modConn = new PLCUtil(modPlc); |
| | | |
| | | var modDeviceConver = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation); |
| | | var (plcResult, palletVal) = modConn.GetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.PlcPos); |
| | | if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 720) |
| | | { |
| | | modConn.Close(); |
| | | return;//放货工位没有读取成功或不是空闲 |
| | | } |
| | | var listResultcon = new List<Result>(); |
| | | |
| | | //任务号与托盘条码 |
| | | var modPosConverTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "任务号"); |
| | | listResultcon.Add(modConn.SetPlcDBValue(modPosConverTask.PosType, modDeviceConver.DbNumber, modPosConverTask.PlcPos, modTask.TaskId.ToString())); |
| | | var modPosConverPallet = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "托盘条码"); |
| | | listResultcon.Add(modConn.SetPlcDBValue(modPosConverPallet.PosType, modDeviceConver.DbNumber, modPosConverPallet.PlcPos, modTask.PalletNo.ToString())); |
| | | |
| | | // 起始工位、目的工位 |
| | | var modPosConverStrLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "起始工位"); |
| | | listResultcon.Add(modConn.SetPlcDBValue(modPosConverStrLocat.PosType, modDeviceConver.DbNumber, modPosConverStrLocat.PlcPos, modDeviceConver.StationNum)); |
| | | var modPosConverEndLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "目的工位"); |
| | | listResultcon.Add(modConn.SetPlcDBValue(modPosConverEndLocat.PosType, modDeviceConver.DbNumber, modPosConverEndLocat.PlcPos, modTask.EndLocate)); |
| | | |
| | | if (listResultcon.All(s => s.IsSucceed)) |
| | | { |
| | | var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "730"); |
| | | if (!plcResult.IsSucceed) |
| | | { |
| | | modConn.Close(); |
| | | return; |
| | | } |
| | | //添加任务明细 |
| | | var taskMonitor2 = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = carTaskNext.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"写入指令730:工位是{modDeviceConver.StationNum}" |
| | | }; |
| | | _db.Insertable(taskMonitor2).ExecuteCommand(); |
| | | } |
| | | |
| | | modConn.Close(); |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | |
| | | //清除小车空闲时间 |
| | | 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 = carTask2.TaskNo, |
| | | TaskNo = carTaskNext.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"向穿梭车下发任务{carTask2.TaskNo}" |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"向穿梭车下发任务{carTaskNext.TaskNo}" |
| | | }; |
| | | _db.Insertable(taskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | |
| | | { |
| | | var plcConn = modDevice.PLCUtil; |
| | | |
| | | var ledText = ""; |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "20": |
| | | case "120": //空闲,AGV可放货 |
| | | { |
| | | //小车请求开卷帘门 这里改成海康直接调用模块 这里不需要了 |
| | | string Devicelndex = ""; |
| | | if (modDevice.Text == "2号卷帘门") |
| | | Devicelndex = "222"; |
| | | else if (modDevice.Text == "3号卷帘门") |
| | | Devicelndex = "111"; |
| | | var modCallBack = sysCacheService.Get<AGVApplyLockInput>("OpenDoor" + Devicelndex); |
| | | if (modCallBack != null) |
| | | var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.IsComple == "1"); |
| | | if (task != null) |
| | | { |
| | | var modAgvDevice = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == "AGV"); |
| | | AgvNotifyInput input = new AgvNotifyInput() |
| | | //没有出库业务 |
| | | var res = new HttpService().GenAgvContinueTask(task.TaskNo).Result; |
| | | if (res.code == "0") |
| | | { |
| | | ActionStatus = "1", |
| | | DeviceIndex = Devicelndex, |
| | | UUID = modCallBack.UUID, |
| | | }; |
| | | var response = new HttpService().NotifyExcuteResultInfo(input).Result; |
| | | if (response.code == 0) |
| | | { |
| | | sysCacheService.Remove("OpenDoor" + Devicelndex); |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = task.TaskNo, |
| | | PlcId = modDevice.modPlc.Id, |
| | | PlcName = modDevice.modPlc.IP, |
| | | InteractiveMsg = "向AGV小车下发继续执行任务" |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | |
| | | //下发任务日志 |
| | | HubUtil.PublicTask(task.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case "100": |
| | | case "320": |
| | | { |
| | | //工位对应 1=A 4=B 10=C |
| | | string stationNum = ""; |
| | | if (modDevice.StationNum == "1" || modDevice.StationNum == "4") |
| | | // 申请密集库组 |
| | | string strMsg = ""; |
| | | |
| | | // 获取工位托盘码信息 |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (!res.IsSucceed) |
| | | { |
| | | stationNum = "10"; |
| | | //判断有没有小车到C口的任务,如果有就写120 |
| | | var countTask = _db.Queryable<WcsTask>().Where(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV && s.EndLocate == "A1").Count(); |
| | | if (countTask != 0) |
| | | { |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "120"); |
| | | Log.Information($"向plc{modDevice.PlcIdIP}写入120,结果:{ret.ToJson()}"); |
| | | return; |
| | | } |
| | | break; |
| | | } |
| | | string strPalletNo = ""; |
| | | if (modDevice.StationNum == "10" || modDevice.StationNum == "4") |
| | | var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工位"); |
| | | |
| | | //判断入库锁定是否打开 |
| | | if (PLCTaskAction.boEnterLock) |
| | | { |
| | | var modPosPallet = modDevice.listStation.First(s => s.Text == "托盘条码"); |
| | | //todo:这里读码器老读不到条码信息 先写死 读码器问题解决了可以注释掉 |
| | | //plcConn.SetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos, "T2400001"); |
| | | var (res, palletNo) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos, modPosPallet.StringLength); |
| | | if (!res.IsSucceed || palletNo == "") |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "120"); |
| | | Log.Information($"向plc{modDevice.PlcIdIP}写入120,结果:{ret.ToJson()}"); |
| | | return; |
| | | ledText += $"申请入库失败\n\n"; |
| | | ledText += $"托盘号:{palletVal}\n"; |
| | | ledText += $"入库任务已锁定,请解锁后重试!\n"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | strPalletNo = Convert.ToString(palletNo); |
| | | } |
| | | if (modDevice.StationNum == "10") |
| | | { |
| | | if (strPalletNo.Substring(0, 1) == "T") |
| | | stationNum = "4"; |
| | | else |
| | | stationNum = "1"; |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | |
| | | break; |
| | | } |
| | | |
| | | // 写入托盘输送线码垛工位 |
| | | if (palletVal == null) |
| | | { |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | ledText += $"申请入库失败\n\n"; |
| | | ledText += $"托盘号:{palletVal}\n"; |
| | | ledText += $"扫描托盘号失败!\n"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | |
| | | break; |
| | | } |
| | | |
| | | var http = new HttpService(); |
| | | string TaskNo = "", EndLocate = ""; |
| | | strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, ref EndLocate, ref TaskNo); |
| | | if (!strMsg.Contains("-1")) |
| | | { |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | | var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo); |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>() |
| | | .Where(w => w.StationNum == taskInfo.StartLocate) |
| | | .Select(s => s.LedIP).First(); |
| | | |
| | | // 写入330 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "330"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令330:{modDevice.StationNum}工位申请巷道", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum, |
| | | EndLocat = EndLocate, |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | |
| | | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | // led显示内容 |
| | | try |
| | | { |
| | | ledText += $"任务类型:{taskInfo.TaskType.GetDescription()}\n\n"; |
| | | |
| | | ledText += $"任务号:{taskInfo.TaskNo}\n"; |
| | | ledText += $"托盘号:{taskInfo.PalletNo}\n\n"; |
| | | |
| | | ledText += $"起始位:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n"; |
| | | ledText += $"目标位:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Log.Error(ex.Message); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | ledText += $"申请入库失败\n\n"; |
| | | ledText += $"托盘号:{palletVal}\n"; |
| | | ledText += $"{strMsg}\n"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case "330": |
| | | { |
| | | // 获取工位托盘码信息 |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (!res.IsSucceed) |
| | | { |
| | | break; |
| | | } |
| | | string pallet = palletVal.ToString(); |
| | | // 获取任务信息 |
| | | var modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false |
| | | && s.PalletNo == pallet |
| | | && s.Type == PLCTypeEnum.ConveyorLine |
| | | && (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) |
| | | && s.TaskType == TaskTypeEnum.In); |
| | | |
| | | if (modTask == null) |
| | | { |
| | | // 此托盘没有对应的转移任务 led显示 |
| | | break; |
| | | } |
| | | //判断入库锁定是否打开 |
| | | if (PLCTaskAction.boEnterLock) |
| | | { |
| | | break;//入库锁定打开则不执行入库任务 |
| | | } |
| | | |
| | | // 获取四项车取货工位 |
| | | string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, modDevice.StationNum.PadLeft(3,'0')); |
| | | |
| | | |
| | | |
| | | // 给PLC写入任务数据 |
| | | var listResult = new List<Result>(); |
| | | // 写入托盘输送线码垛工位 目的工位、任务号,写入交互流程组托成功 |
| | | var posModel = modDevice.listStation.First(m => m.Text == "起始工位"); |
| | | listResult.Add(plcConn.SetPlcDBValue(posModel.PosType, modDevice.DbNumber, posModel.PlcPos, modDevice.StationNum)); |
| | | var posModel2 = modDevice.listStation.First(m => m.Text == "目标工位"); |
| | | listResult.Add(plcConn.SetPlcDBValue(posModel2.PosType, modDevice.DbNumber, posModel2.PlcPos, stationNum)); |
| | | string taskNo = _taskService.GetTaskCode("WCS"); |
| | | var modPosTask = modDevice.listStation.First(s => s.Text == "任务号"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, taskNo)); |
| | | // 任务号、任务类型、托盘号 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskId.ToString())); |
| | | var modPosTaskType = modDevice.listStation.FirstOrDefault(s => s.Text == "任务类型"); |
| | | var taskTypeStr = (int)modTask.TaskType; |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); |
| | | var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘条码"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); |
| | | // 起始工位、目的工位 |
| | | var modPosStrLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "起始工位"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosStrLocat.PosType, modDevice.DbNumber, modPosStrLocat.PlcPos, modDevice.StationNum)); |
| | | var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工位"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndLocat.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, endLocatVlue)); |
| | | |
| | | |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | { |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "130"); |
| | | Log.Information($"向plc{modDevice.PlcIdIP}写入130,结果:{ret.ToJson()}"); |
| | | // 将任务状态变更为正在执行 |
| | | _db.Updateable<WcsTask>() |
| | | .SetColumns(s => s.Status == TaskStatusEnum.Doing) |
| | | .Where(s => s.Id == modTask.Id) |
| | | .ExecuteCommand(); |
| | | // 写入流程字 330 340 |
| | | |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "340"); |
| | | |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.StartLocate).Select(s => s.LedIP).First(); |
| | | |
| | | if (ret.IsSucceed) |
| | | { |
| | | AddWcsTaskInput modTask = new AddWcsTaskInput() |
| | | { |
| | | TaskNo = taskNo, |
| | | TaskType = TaskTypeEnum.In, |
| | | PalletNo = strPalletNo, |
| | | Status = TaskStatusEnum.Doing, |
| | | IsSuccess = TaskSuccessEnum.Fail, |
| | | StartLocate = modDevice.StationNum, |
| | | EndLocate = stationNum, |
| | | Type = PLCTypeEnum.ConveyorLine, |
| | | }; |
| | | _taskService.Add(modTask); |
| | | WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor() |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令340:{modDevice.StationNum}储位====》{endLocatVlue}工位", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum, |
| | | EndLocat = stationNum, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modDevice.Text}写入指令130,结果{ret.IsSucceed}", |
| | | EndLocat = endLocatVlue, |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | |
| | | //下发任务日志 |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case "140": |
| | | case "620": |
| | | { |
| | | var modPosTask = modDevice.listStation.First(m => m.Text == "任务号"); |
| | | var (result, taskNo) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modPosTask.StringLength); |
| | | var modPosPallet = modDevice.listStation.First(m => m.Text == "托盘条码"); |
| | | var (res, palletNo) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos, modPosPallet.StringLength); |
| | | WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor(); |
| | | WcsTask modTask = new WcsTask(); |
| | | if (!result.IsSucceed) |
| | | // 申请储位 更新入库任务(储位地址) 630 |
| | | var strMsg = ""; |
| | | |
| | | // 获取工位任务号信息 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | var (resTask, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | if (!resTask.IsSucceed) |
| | | { |
| | | Log.Error($"{plcConn.PlcIP}读取任务号失败"); |
| | | return; |
| | | break; |
| | | } |
| | | if (modDevice.StationNum == "10") |
| | | // 获取工位托盘码信息 |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (!res.IsSucceed) |
| | | { |
| | | var posModel = modDevice.listStation.First(m => m.Text == "起始工位"); |
| | | var (resultS, station) = plcConn.GetPlcDBValue(posModel.PosType, modDevice.DbNumber, posModel.PlcPos); |
| | | if (resultS.IsSucceed) |
| | | break; |
| | | } |
| | | |
| | | string TaskNo = ""; |
| | | // 向WMS申请储位信息 |
| | | strMsg = new HttpService().RequestLocate(palletVal, taskVal,ref TaskNo); |
| | | |
| | | if (!strMsg.Contains("-1")) |
| | | { |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | | var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo); |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First(); |
| | | // 写入流程字 630 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "630"); |
| | | |
| | | if (ret.IsSucceed) |
| | | { |
| | | if (station == 1) |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | WcsTask modInsertTask = new WcsTask() |
| | | { |
| | | TaskNo = _taskService.GetTaskCode(), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.AGV, |
| | | StartLocate = AGVStaionEnum.A1.ToString(), |
| | | EndLocate = AGVStaionEnum.F1.ToString(), |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Wait, |
| | | Levels = 5, |
| | | Origin = "WCS" |
| | | }; |
| | | _db.Insertable(modInsertTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modInsertTask.Adapt<WcsTaskOutput>()); |
| | | } |
| | | else if (station == 4) |
| | | { |
| | | WcsTask modInsertTask = new WcsTask() |
| | | { |
| | | TaskNo = _taskService.GetTaskCode(), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.AGV, |
| | | StartLocate = AGVStaionEnum.A1.ToString(), |
| | | EndLocate = AGVStorageUtil.GetPalletInStorage(), |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Wait, |
| | | Levels = 5, |
| | | Origin = "WCS" |
| | | }; |
| | | _db.Insertable(modInsertTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modInsertTask.Adapt<WcsTaskOutput>()); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | Log.Error("获取起始工位失败,失败原因" + resultS.Err); |
| | | return; |
| | | TaskNo = TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令340:{modDevice.StationNum}工位申请储位", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum, |
| | | EndLocat = strMsg, |
| | | }; |
| | | |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); |
| | | ledText += $"任务类型:{taskInfo.TaskType.GetDescription()}\n\n"; |
| | | ledText += $"任务号:{taskInfo.TaskNo}\n"; |
| | | ledText += $"托盘号:{taskInfo.PalletNo}\n\n"; |
| | | ledText += $"起始位:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n"; |
| | | ledText += $"目标位:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | } |
| | | var ledText = ""; |
| | | if (modDevice.StationNum == "4") |
| | | else |
| | | { |
| | | //todo:led |
| | | ledText += "任务类型:入库\n\n"; |
| | | ledText += $"任务号:{taskNo}\n"; |
| | | ledText += $"托盘号:{palletNo}\n\n"; |
| | | //ledText += $"起始位:10\n"; |
| | | //ledText += $"目标位:4"; |
| | | // 申请储位失败!LED显示 |
| | | Log.Error(string.Format($"申请储位失败:{strMsg},读写plc错误")); |
| | | // led显示内容 |
| | | var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); |
| | | ledText += $"申请入库失败\n\n"; |
| | | ledText += $"{strMsg}\n"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "150"); |
| | | Log.Information($"向plc{modDevice.PlcIdIP}写入150,结果:{ret.ToJson()}"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | string strTaskNo = taskNo; |
| | | modTask = _db.Queryable<WcsTask>().First(s => s.TaskNo == strTaskNo); |
| | | if (modTask != null) |
| | | { |
| | | modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modDevice.Text, |
| | | StartLocat = modTask.StationNum, |
| | | EndLocat = modTask.EndLocate, |
| | | InteractiveMsg = $"向{modDevice.Text}写入指令150,结果{ret.IsSucceed}", |
| | | }; |
| | | modTaskMonitor.Status = TaskStatusEnum.Complete; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | modTask.FinishDate = DateTime.Now; |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | |
| | | //下发任务日志 |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case "630": |
| | | { |
| | | #region plc光电扫描不到托盘后 自动清信息 |
| | | |
| | | //// 获取工位托盘码信息 |
| | | //var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | //var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | //// 获取工位任务号信息 |
| | | //var modPosTaskNo = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | //var (taskRes, taskNoVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosTaskNo.PlcPos); |
| | | //if (!res.IsSucceed || !taskRes.IsSucceed) |
| | | //{ |
| | | // break; |
| | | //} |
| | | //string pallet = palletVal.ToString(); |
| | | //string taskNo = taskNoVal.ToString(); |
| | | //// 获取任务信息 |
| | | //var modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.PalletNo == pallet && s.Status == TaskStatusEnum.Doing && s.TaskType == TaskTypeEnum.In && s.TaskNo == taskNo); |
| | | //if (modTask == null) |
| | | //{ |
| | | // // 此托盘没有对应的转移任务 led显示 |
| | | // break; |
| | | //} |
| | | |
| | | //var sInfo = PLCCommon.GetStokePlc(modTask.EndRoadway, louCeng); |
| | | //if (string.IsNullOrWhiteSpace(sInfo.Ip)) |
| | | //{ |
| | | // //需加上LED显示 |
| | | // Log.Error(string.Format($"根据巷道获取跺机IP失败,请联系管理员")); |
| | | // break; |
| | | //} |
| | | //// 跺机连接 |
| | | //var plcStackeConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == sInfo.Ip); |
| | | //if (plcStackeConn.Connected) |
| | | //{ |
| | | // // 目标排列层 |
| | | // var endLocate = modTask.EndLocate; |
| | | // if (string.IsNullOrWhiteSpace(modTask.EndLocate)) |
| | | // { |
| | | // Log.Error(string.Format($"目标位置为空,请人工处理,读写plc错误")); |
| | | // break; |
| | | // } |
| | | |
| | | // // 转换目标工位排列层 03010301 |
| | | // var paiVal = PLCCommon.GetDjAdress(modTask.EndRoadway.Substring(1, 2), endLocate.Substring(0, 2), endLocate.Substring(6, 2)); |
| | | // string pai = paiVal.ToString(); |
| | | // string lie = int.Parse(endLocate.Substring(2, 2)).ToString(); |
| | | // string ceng = int.Parse(endLocate.Substring(4, 2)).ToString(); |
| | | |
| | | // var djmodel = _db.Queryable<WcsPlc>().First(m => m.IP == sInfo.Ip); |
| | | |
| | | // var djMod = PLCTaskAction.plcDevices.First(m => m.PlcId == djmodel.Id |
| | | // && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false); |
| | | // var djInfos = PLCTaskAction.plcPositions.Where(m => m.IsDelete == false && m.DeviceId == djMod.Id).ToList(); |
| | | // var djInfo = djInfos.First(m => m.Text == "PLC流程字"); |
| | | |
| | | // // 获取跺机当前状态 |
| | | // var (djRes, djVal) = plcStackeConn.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos); |
| | | |
| | | // if (!djRes.IsSucceed || djVal.ToString() != "820") |
| | | // { |
| | | // // 跺机非空闲等待 |
| | | // break; |
| | | // } |
| | | // // 给PLC写入任务数据 |
| | | // var listResult = new List<Result>(); |
| | | |
| | | // // 任务号、任务类型、托盘号 |
| | | // var modPosTask = djInfos.FirstOrDefault(s => s.Text == "任务号"); |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosTask.PosType, djMod.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); |
| | | // var modPosTaskType = djInfos.FirstOrDefault(s => s.Text == "任务类型"); |
| | | // var taskTypeStr = (int)modTask.TaskType; |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosTaskType.PosType, djMod.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); |
| | | // var modPosPalletNo = djInfos.FirstOrDefault(s => s.Text == "托盘码"); |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosPalletNo.PosType, djMod.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); |
| | | |
| | | // //起始工位 |
| | | // var modPosStrStationNum = djInfos.FirstOrDefault(s => s.Text == "起始工位"); |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosStrStationNum.PosType, djMod.DbNumber, modPosStrStationNum.PlcPos, modDevice.StationNum)); |
| | | |
| | | // //取货排、列、层 |
| | | // var modPosStrPai = djInfos.FirstOrDefault(s => s.Text == "取货排"); |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosStrPai.PosType, djMod.DbNumber, modPosStrPai.PlcPos, sInfo.Pai)); |
| | | // var modPosStrLie = djInfos.FirstOrDefault(s => s.Text == "取货列"); |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosStrLie.PosType, djMod.DbNumber, modPosStrLie.PlcPos, sInfo.Lie)); |
| | | // var modPosStrCeng = djInfos.FirstOrDefault(s => s.Text == "取货层"); |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosStrCeng.PosType, djMod.DbNumber, modPosStrCeng.PlcPos, sInfo.Ceng)); |
| | | // //放货排、列、层 |
| | | // var modPosEndPai = djInfos.FirstOrDefault(s => s.Text == "放货排"); |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosEndPai.PosType, djMod.DbNumber, modPosEndPai.PlcPos, pai)); |
| | | // var modPosEndLie = djInfos.FirstOrDefault(s => s.Text == "放货列"); |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosEndLie.PosType, djMod.DbNumber, modPosEndLie.PlcPos, lie)); |
| | | // var modPosEndCeng = djInfos.FirstOrDefault(s => s.Text == "放货层"); |
| | | // listResult.Add(plcStackeConn.SetPlcDBValue(modPosEndCeng.PosType, djMod.DbNumber, modPosEndCeng.PlcPos, ceng)); |
| | | |
| | | // if (listResult.All(s => s.IsSucceed)) |
| | | // { |
| | | // // 写入跺机 830 |
| | | // var retc2 = plcStackeConn.SetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.WcsPos, "830"); |
| | | |
| | | // // 插入任务明细 任务明细实体类 |
| | | // var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | // { |
| | | // TaskNo = modTask.TaskNo, |
| | | // PlcId = modDevice.Id, |
| | | // PlcName = modDevice.Text, |
| | | // PalletNo = modTask.PalletNo, |
| | | // Status = TaskStatusEnum.Complete, |
| | | // StartLocat = modDevice.StationNum, |
| | | // EndLocat = modTask.EndLocate // 目标储位地址 |
| | | // }; |
| | | // if (!retc2.IsSucceed) |
| | | // { |
| | | // modInsertTaskMonitor.InteractiveMsg = $"输送线取货工位:{modDevice.StationNum},写入垛机取货任务830失败等待再次写入"; |
| | | // // 插入交互日志 |
| | | // _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | // //下发任务日志 |
| | | // HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | // break; |
| | | |
| | | // } |
| | | // modInsertTaskMonitor.InteractiveMsg = $"跺机写入指令830:{modDevice.StationNum}工位====》" + modTask.EndLocate + "储位地址!"; |
| | | // // 插入交互日志 |
| | | // _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | // if (PLCTaskAction.boRefresh) |
| | | // { |
| | | // //下发任务日志 |
| | | // HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | // } |
| | | |
| | | // } |
| | | |
| | | |
| | | |
| | | |
| | | //} |
| | | |
| | | #endregion |
| | | } |
| | | break; |
| | | |
| | | #region 出库交互 |
| | | case "420": |
| | | { |
| | | #region 托盘到达拣选工位/出库口 |
| | | // 出库口 |
| | | // led显示托盘信息 |
| | | // 写入430 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "430"); |
| | | |
| | | if (ret.IsSucceed) |
| | | { |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位"); |
| | | var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos); |
| | | |
| | | int taskNoVal = Convert.ToInt32(taskVal); |
| | | var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskId == taskNoVal); |
| | | if (taskInfo == null) |
| | | { |
| | | Log.Error(string.Format("输送线430:未找到对应的任务。")); |
| | | break; |
| | | } |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = taskInfo.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令430:托盘到达{modDevice.StationNum}工位", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = Convert.ToString(starVal), |
| | | EndLocat = modDevice.StationNum, |
| | | }; |
| | | |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.EndLocate).Select(s => s.LedIP).First(); |
| | | |
| | | // led显示内容 |
| | | // 根据目标工位号获取对应的LEDIP地址 |
| | | var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId == modDevice.PlcId); |
| | | |
| | | ledText += $"出库完成\n\n"; |
| | | ledText += $"任务号:{taskInfo.TaskNo}\n"; |
| | | ledText += $"托盘号:{taskInfo.PalletNo}\n\n"; |
| | | ledText += $"起始位:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n"; |
| | | ledText += $"目标位:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}"; |
| | | LedDisplay(ledDevice.LedIP, ledText); |
| | | } |
| | | // 反馈WMS出库完成 |
| | | //TaskReques taskReques = new TaskReques(); |
| | | //taskReques.taskNo = TaskNo; |
| | | //taskReques.TaskType = "1"; |
| | | //taskReques.TaskStatus = "2"; |
| | | //bool bl = wcsMySql.RequestTasks(taskReques); |
| | | #endregion |
| | | } |
| | | break; |
| | | case "440": |
| | | { |
| | | #region 拣选完成,托盘离开工位 |
| | | |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位"); |
| | | var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos); |
| | | |
| | | // 写入450 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "450"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | |
| | | |
| | | int tasknoVal = Convert.ToInt32(taskVal); |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.IsDelete == false && m.TaskId == tasknoVal); |
| | | if (modTask == null) |
| | | { |
| | | Log.Error(string.Format("输送线440:未找到对应的任务。")); |
| | | break; |
| | | } |
| | | // 改变任务状态 |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | //modTask.Levels = 999; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令450:{modDevice.StationNum}出库完成", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = starVal.ToString(), |
| | | EndLocat = modDevice.StationNum, |
| | | }; |
| | | if (modTask.Origin == "WMS") |
| | | { |
| | | //// 反馈WMS |
| | | //var requestMode = new TaskRequestWMS() |
| | | //{ |
| | | // TaskNo = modTask.TaskNo + modTask.EndLocate, |
| | | // PalletNo = modTask.PalletNo, |
| | | // TaskType = ((int)TaskTypeEnum.Out).ToString(), |
| | | // TaskStatus = ((int)TaskStatusEnum.Complete).ToString() |
| | | //}; |
| | | //HttpService httpService = new HttpService(); |
| | | //var modResponseTask = httpService.RequestTask(requestMode).Result; |
| | | //if (modResponseTask.StatusCode == 0) |
| | | //{ |
| | | // modInsertTaskMonitor.InteractiveMsg += ",返回给WMS任务完成"; |
| | | //} |
| | | //else |
| | | //{ |
| | | // Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); |
| | | //} |
| | | } |
| | | |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | // led显示内容 |
| | | var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId == modDevice.PlcId); |
| | | |
| | | ledText += $"出库完成\n\n"; |
| | | ledText += $"任务号:{modTask.TaskNo}\n"; |
| | | ledText += $"托盘号:{modTask.PalletNo}\n\n"; |
| | | ledText += $"起始位:{modTask.StartRoadway + " " + modTask.StartLocate}\n"; |
| | | ledText += $"目标位:{modTask.EndRoadway + " " + modTask.EndLocate}"; |
| | | LedDisplay(ledDevice.LedIP, ledText); |
| | | } |
| | | #endregion |
| | | } |
| | | break; |
| | | |
| | | #endregion |
| | | default: break; |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | private static void AGV(WcsDeviceDto modDevice) |
| | | { |
| | | |
| | | //这里找出来AGV待执行的任务、按照优先级下发一个任务给AGV |
| | | var listTask = _db.Queryable<WcsTask>().Where(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.Type == PLCTypeEnum.AGV).OrderBy(s => s.Levels).ToList(); |
| | | if (listTask.Count == 0) |
| | | //这里找出来AGV待执行的任务、按照优先级、创建时间下发一个任务给AGV |
| | | var modTask = _db.Queryable<WcsTask>().Where(s => s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.AGV).OrderBy(s => new { s.Levels ,s.CreateTime}).First(); |
| | | if (modTask == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | foreach (var modTask in listTask) |
| | | |
| | | if (_db.Queryable<WcsTask>().Any(s => s.EndLocate == modTask.EndLocate && s.IsDelete == false && s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV )) |
| | | { |
| | | if (_db.Queryable<WcsTask>().Any(s => s.EndLocate == modTask.EndLocate && s.IsDelete == false && s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV )) |
| | | { |
| | | continue; // 有目的位置一致且正在执行的任务 |
| | | } |
| | | |
| | | //下发AGV任务 |
| | | AgvTaskInput input = new AgvTaskInput() |
| | | { |
| | | ReqCode = modTask.Id.ToString(), |
| | | TaskCode = modTask.TaskNo, |
| | | CtnrCode = modTask.PalletNo, |
| | | PositionCodePath = new List<PositionCodePathItem>() |
| | | { |
| | | new PositionCodePathItem(){ PositionCode = modTask.StartLocate }, |
| | | new PositionCodePathItem(){ PositionCode = modTask.EndLocate } |
| | | } |
| | | }; |
| | | input.TaskTyp = "1" + modTask.StartLocate.Substring(0, 1) + modTask.EndLocate.Substring(0, 1); |
| | | var response = new HttpService().GenAgvSchedulingTask(input).Result; |
| | | if (response.code == "0") |
| | | { |
| | | AGVStatus = true; |
| | | modTask.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.modPlc.Id, |
| | | PlcName = modDevice.modPlc.IP, |
| | | InteractiveMsg = "向AGV小车下发任务" |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | return; // 有目的位置一致且正在执行的任务 |
| | | } |
| | | |
| | | //下发任务日志 |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | Console.WriteLine(response.ToJson()); |
| | | //下发AGV任务 |
| | | var taskTypeModel = AGVStorageUtil.GetTaskModle(modTask.StartLocate, modTask.EndLocate,out string type1,out string type2, out string jiebo); |
| | | if (string.IsNullOrWhiteSpace(taskTypeModel)) |
| | | { |
| | | Console.WriteLine("获取AGV任务模板失败:请核实任务起始目标储位是否正确"); |
| | | return; |
| | | } |
| | | AgvTaskSend taskModel = new AgvTaskSend(); |
| | | taskModel.robotTaskCode = modTask.TaskNo; |
| | | taskModel.taskType = taskTypeModel; |
| | | if (jiebo == "") |
| | | { |
| | | taskModel.targetRoute = new List<targetRoute>() |
| | | { |
| | | new targetRoute(){seq = 0,type = type1,code = modTask.StartLocate}, |
| | | new targetRoute(){seq = 1,type = type2,code = modTask.EndLocate} |
| | | }; |
| | | } |
| | | else |
| | | { |
| | | taskModel.targetRoute = new List<targetRoute>() |
| | | { |
| | | new targetRoute(){seq = 0,type = type1,code = modTask.StartLocate}, |
| | | new targetRoute(){seq = 1,type = "ZONE",code = jiebo}, |
| | | new targetRoute(){seq = 2,type = type2,code = modTask.EndLocate} |
| | | }; |
| | | } |
| | | |
| | | taskModel.extra = new extra() |
| | | { |
| | | carrierInfo = new List<carrierInfo>() |
| | | { |
| | | new carrierInfo(){ carrierType = "TP",carrierCode = modTask.PalletNo} |
| | | } |
| | | }; |
| | | var response = new HttpService().GenAgvSendTask(taskModel).Result; |
| | | if (response.code == "0") |
| | | { |
| | | modTask.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.modPlc.Id, |
| | | PlcName = modDevice.modPlc.IP, |
| | | InteractiveMsg = "向AGV小车下发任务" |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | |
| | | //下发任务日志 |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | //Console.WriteLine(response.ToJson()); |
| | | Thread.Sleep(3000); |
| | | return; |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | |
| | | private static void Test(WcsDeviceDto modDevice) |
| | | { |
| | | |
| | | var ledText = $"申请入库失败\n\n"; |
| | | ledText += $"托盘号:T2300001\n"; |
| | | ledText += $"入库任务已锁定,请解锁后重试!\n"; |
| | | LedDisplay("10.26.254.31", ledText); |
| | | //卷帘门2申请打开 |
| | | //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1152", "10"); |
| | | //卷帘门2申请关闭 |
| | |
| | | //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1154", "30"); |
| | | |
| | | //C口AGV放托盘完成申请入库 |
| | | var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1156", "100"); |
| | | //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1156", "100"); |
| | | |
| | | ////写死测试读string |
| | | //var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64"); |