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 Newtonsoft.Json; using Org.BouncyCastle.Ocsp; using SixLabors.ImageSharp.ColorSpaces; using WCS.Application.Entity; using WCS.Application.Util; namespace WCS.Application; public static class PLCService { private static readonly object OLock = new object(); public static bool AGVStatus = false; private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); private static readonly WcsTaskService _taskService = App.GetService<WcsTaskService>(); private static readonly SysCacheService sysCacheService = App.GetRequiredService<SysCacheService>(); private static readonly SysConfigService _sysConfigService = App.GetRequiredService<SysConfigService>(); private static Dictionary<string, string> dicTaskNo = new Dictionary<string, string>(); public static void OnChangeEvent(object sender, EventArgs e) { try { var mod = sender as WcsDeviceDto; //Console.WriteLine($"{mod.Text}值为" + mod.Value); switch (mod.Type) { case PLCTypeEnum.ConveyorLine: ConveyorLine(mod); // 托盘输é€çº¿ break; case PLCTypeEnum.AGV: AGV(mod); // AGV调度 break; case PLCTypeEnum.ShuttleCar: //ç©¿æ¢è½¦ //if (mod.PlcIdIP == "10.26.254.28") //{ // break; //} ShuttleCar(mod); break; case PLCTypeEnum.RobotPalletizer: RobotPalletizer(mod);//ç 垛机器人 break; case PLCTypeEnum.PalletMachine: PalletMachine(mod); break; default: break; } } catch (Exception ex) { Log.Error(ex.Message, ex); } } /// <summary> /// 拆托机 /// </summary> /// <param name="modDevice"></param> private static void PalletMachine(WcsDeviceDto modDevice) { if (modDevice.Value) { //æ£€æµ‹åˆ°ç¼ºæ‰˜ä¿¡å·æ‰§è¡Œè¿™é‡Œï¼Œå¦‚æžœæ²¡æœ‰å–æ‰˜ä»»åŠ¡çš„è¯å°±æ·»åŠ ä¸€ä¸ªï¼ˆå‚¨ä½-拆托机) if (!_db.Queryable<WcsTask>() .Where(s => s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing && s.EndLocate == AGVStaionEnum.D1.ToString()).Any()) { WcsTask modTask = new WcsTask() { TaskNo = _taskService.GetTaskCode(), TaskType = TaskTypeEnum.Move, Type = PLCTypeEnum.AGV, StartLocate = "", EndLocate = AGVStaionEnum.D1.ToString(), PalletNo = "", Status = TaskStatusEnum.Wait, Levels = 3, Origin = "WCS" }; if (modTask.StartLocate.IsNullOrEmpty()) return; _db.Insertable(modTask).ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); } } } /// <summary> /// ç åž›æœºå™¨äººä¸šåŠ¡å¤„ç† /// </summary> private static void RobotPalletizer(WcsDeviceDto modDevice) { var plcConn = modDevice.modbusUtil; string station = "B" + modDevice.StationNum; string value = Convert.ToString(modDevice.Value); if (value == "1") { if (modDevice.Level == DeviceLevelEnum.DB) { //生产工ä½ç¼ºæ‰˜ç›˜ä¿¡å·ï¼Œç”Ÿæˆä»»åŠ¡å«å°è½¦åŽ»æ‹‰ç©ºæ‰˜ç›˜ if (!_db.Queryable<WcsTask>().Where(s => s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing && s.StartLocate == AGVStaionEnum.D1.ToString() && s.EndLocate == station.ToString()).Any()) { WcsTask modTask = new WcsTask() { TaskNo = _taskService.GetTaskCode(), TaskType = TaskTypeEnum.Move, Type = PLCTypeEnum.AGV, StartLocate = AGVStaionEnum.D1.ToString(), EndLocate = station, PalletNo = "", Status = TaskStatusEnum.Wait, Levels = 4, Origin = "WCS" }; _db.Insertable(modTask).ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); } } else if (modDevice.Level == DeviceLevelEnum.Station) { //如果读到信å·é€šçŸ¥AGVå°è½¦æ‹‰è´§(满跺) var endLocate = "C" + modDevice.StationNum; if (!_db.Queryable<WcsTask>().Where(s => s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing && s.StartLocate == station.ToString()).Any()) { WcsTask modTask = new WcsTask() { TaskNo = _taskService.GetTaskCode(), TaskType = TaskTypeEnum.Move, Type = PLCTypeEnum.AGV, StartLocate = station.ToString(), EndLocate = endLocate, PalletNo = "", Status = TaskStatusEnum.Wait, Levels = 2, Origin = "WCS" }; _db.Insertable(modTask).ExecuteCommand(); HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); } } } } /// <summary> /// ç©¿æ¢è½¦ä¸šåŠ¡å¤„ç† /// </summary> /// <param name="modDevice"></param> private static void ShuttleCar(WcsDeviceDto modDevice) { var plcConn = modDevice.modbusUtil; // å››å‘è½¦çŠ¶æ€ 0:未空闲,1:空闲,2:异常 3ï¼šå……ç”µä¸ switch (modDevice.Value.ToString()) { case "0": sysCacheService.HashAddOrUpdate("AlarmInfo_Car", plcConn.PlcIP, -1); break; case "1": { sysCacheService.HashAddOrUpdate("AlarmInfo_Car", plcConn.PlcIP, -1); var modPosTaskStatus = modDevice.listStation.FirstOrDefault(s => s.Text == "任务状æ€"); var (resultTaskStatus, valueTaskStatus) = plcConn.GetDBValue(modPosTaskStatus.PosType, modPosTaskStatus.PlcPos); //判æ–读å–ä»»åŠ¡çŠ¶æ€æ˜¯å¦æˆåŠŸ å¹¶ä¸”ä»»åŠ¡çŠ¶æ€æ˜¯1 0:æ— ä»»åŠ¡,1:任务完æˆ,2:ä»»åŠ¡å–æ¶ˆ,3:任务暂åœï¼Œ4:任务异常 5ï¼šä»»åŠ¡æ‰§è¡Œä¸ WcsCarTasks carTaskNext = null;//null 新任务 not null 当å‰å°è½¦&&当å‰ä»»åŠ¡ 下一节任务 if (resultTaskStatus.IsSucceed && valueTaskStatus == 1) { var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务å·"); var (resultTask, valueTask) = plcConn.GetDBValue(modPosTask.PosType, modPosTask.PlcPos); //读å–ä»»åŠ¡å· 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) { //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) { 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>()); } //获å–路径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(); var ip = ""; if ( carcon.conveyorBei.Keys.Contains(endLocate)) { text = "输é€çº¿åŒ—"; ip = "10.26.254.10"; devStation = carcon.conveyorBei[endLocate]; } else if (carcon.conveyorNan.Keys.Contains(endLocate)) { text = "输é€çº¿å—"; ip = "10.26.254.11"; devStation = carcon.conveyorNan[endLocate]; } if (text != "") { var modConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == ip); //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(); //改å˜ä»»åŠ¡çŠ¶æ€ modFinshTask.Status = TaskStatusEnum.Complete; modFinshTask.FinishDate = DateTime.Now; _db.Updateable(modFinshTask).ExecuteCommand(); var locateOut = _db.Queryable<WcsStorageLocat>().First(m => m.IsDelete == false && m.WareHouseNo == "W01" && m.LocatNo == modFinshTask.StartLocate); if (locateOut != null && locateOut.Make == "1") { locateOut.PalletNo = ""; _db.Updateable(locateOut).ExecuteCommand(); } //å馈WMS系统 ä»»åŠ¡å®Œæˆ if (modFinshTask.Origin == "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>()); } } #endregion } else { modFinshTask.Status = TaskStatusEnum.Complete; modFinshTask.FinishDate = DateTime.Now; _db.Updateable(modFinshTask).ExecuteCommand(); if (modFinshTask.TaskType == TaskTypeEnum.Move) { var locatemove = _db.Queryable<WcsStorageLocat>().First(m => m.IsDelete == false && m.WareHouseNo == "W01" && m.LocatNo == modFinshTask.StartLocate); if (locatemove != null && locatemove.Make == "1") { locatemove.PalletNo = ""; _db.Updateable(locatemove).ExecuteCommand(); } } var locateIn = _db.Queryable<WcsStorageLocat>().First(m => m.IsDelete == false && m.WareHouseNo == "W01" && m.LocatNo == modFinshTask.EndLocate); if (locateIn != null && locateIn.Make == "1") { locateIn.PalletNo = string.IsNullOrWhiteSpace(modFinshTask.PalletNo) ? "pall" : modFinshTask.PalletNo; _db.Updateable(locateIn).ExecuteCommand(); } //å馈WMS系统 ä»»åŠ¡å®Œæˆ if (modFinshTask.Origin == "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>()); } } //判æ–任务是å¦å……电任务,下å‘开始充电命令 if (modFinshTask.Levels == 888) { //写入开始充电 var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "充电命令"); plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "2"); } } } } 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); var carXYZ = valuex.ToString().PadLeft(2, '0') + valuey.ToString().PadLeft(2, '0') + valuez.ToString().PadLeft(2, '0'); 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) { var endLocateCar = ""; if (valuez == 1) { endLocateCar = "011201"; } else if (valuez == 2) { endLocateCar = "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 && carXYZ != endLocateCar) { //æ·»åŠ å°è½¦å……电ä½ç½® 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 = "011201"; } else if (valuez == 2) { endLocateCar = "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 && carXYZ != endLocateCar) { //æ·»åŠ å°è½¦å……电ä½ç½® 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) { if (string.IsNullOrWhiteSpace(preStr)) { continue; } var preId = long.Parse(preStr); var CarTaskPre = _db.Queryable<WcsCarTasks>().First(m => m.Id == preId); if (CarTaskPre.Status <= TaskStatusEnum.Doing) { return;//å‰ç½®ä»»åŠ¡æœªå®Œæˆ } } //å°è½¦çŠ¶æ€ var (resultCar, valueCar) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos); var modPosTaskStatus2 = modDevice.listStation.FirstOrDefault(s => s.Text == "任务状æ€"); var (resultTaskStatus2, valueTaskStatus2) = plcConn.GetDBValue(modPosTaskStatus.PosType, modPosTaskStatus.PlcPos); if (resultCar.IsSucceed && valueCar == 1 && resultTaskStatus2.IsSucceed && (valueTaskStatus2 == 0 || valueTaskStatus2 == 1)) { //å…ˆå¤ä½ var modRest = modDevice.listStation.FirstOrDefault(s => s.Text == "å¤ä½"); plcConn.SetDBValue(modRest.PosType, modRest.PlcPos, "1"); } else { return; } 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.SetDBValueRepeat(modWriteTask.PosType, modWriteTask.PlcPos, carTaskNo.ToString())); var modNodeX = modDevice.listStation.FirstOrDefault(s => s.Text == "èŠ‚ç‚¹åæ ‡X"); var modNodeY = modDevice.listStation.FirstOrDefault(s => s.Text == "èŠ‚ç‚¹åæ ‡Y"); var modNodeZ = modDevice.listStation.FirstOrDefault(s => s.Text == "èŠ‚ç‚¹åæ ‡Z"); var modNodeStatus = modDevice.listStation.FirstOrDefault(s => s.Text == "节点举å‡çжæ€"); int posX = Convert.ToInt32(modNodeX.PlcPos); int posY = Convert.ToInt32(modNodeY.PlcPos); int posZ = Convert.ToInt32(modNodeZ.PlcPos); int posStatus = Convert.ToInt32(modNodeStatus.PlcPos); //交互路径 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; //å°è½¦ä½ç½®ä¸Žè·¯å¾„èµ·å§‹ä½ç½®ä¸åŒ ////写入å°è½¦å½“å‰ä½ç½® //listResult.Add(plcConn.SetDBValue(modNodeX.PosType, posX++.ToString(), Convert.ToString(valuex))); //listResult.Add(plcConn.SetDBValue(modNodeY.PosType, posY++.ToString(), Convert.ToString(valuey))); //listResult.Add(plcConn.SetDBValue(modNodeZ.PosType, posZ++.ToString(), Convert.ToString(valuez))); //listResult.Add(plcConn.SetDBValue(modNodeStatus.PosType, posStatus++.ToString(), "3")); } foreach (var ePath in execuPath) { if (string.IsNullOrWhiteSpace(ePath)) { continue; } var epathx = ePath.Substring(0, 2); var epathy = ePath.Substring(2, 2); var epathz = ePath.Substring(4, 2); var epathn = ePath.Substring(6, 1); //写入交互ä½ç½® listResult.Add(plcConn.SetDBValueRepeat(modNodeX.PosType, posX++.ToString(), epathx)); listResult.Add(plcConn.SetDBValueRepeat(modNodeY.PosType, posY++.ToString(), epathy)); listResult.Add(plcConn.SetDBValueRepeat(modNodeZ.PosType, posZ++.ToString(), epathz)); listResult.Add(plcConn.SetDBValueRepeat(modNodeStatus.PosType, posStatus++.ToString(), epathn)); } //这里是把åŽé¢çš„åæ ‡å…¨å†™0(为了防æ¢ä¸Šæ¬¡ä»»åŠ¡åæ ‡æ²¡è¢«è¦†ç›–) while (posX <= 43097) { listResult.Add(plcConn.SetDBValueRepeat(modNodeX.PosType, posX++.ToString(), "0")); listResult.Add(plcConn.SetDBValueRepeat(modNodeY.PosType, posY++.ToString(), "0")); listResult.Add(plcConn.SetDBValueRepeat(modNodeZ.PosType, posZ++.ToString(), "0")); listResult.Add(plcConn.SetDBValueRepeat(modNodeStatus.PosType, posStatus++.ToString(), "0")); } if (listResult.All(s => s.IsSucceed)) { if (modTask.TaskType == TaskTypeEnum.Out) { #region 输é€çº¿ 写入PLC 730 var text = ""; var devStation = ""; var endLocate = modTask.EndRoadway; var carcon = new carConverModel(); var ip = ""; if (carcon.conveyorBei.Keys.Contains(endLocate)) { text = "输é€çº¿åŒ—"; ip = "10.26.254.10"; devStation = carcon.conveyorBei[endLocate]; } else if (carcon.conveyorNan.Keys.Contains(endLocate)) { text = "输é€çº¿å—"; ip = "10.26.254.11"; devStation = carcon.conveyorNan[endLocate]; } if (text != "") { var modConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == ip); //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) { var listResultcon = new List<Result>(); //任务å·ä¸Žæ‰˜ç›˜æ¡ç var modPosConverTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "任务å·"); listResultcon.Add(modConn.SetPlcDBValueRepeat(modPosConverTask.PosType, modDeviceConver.DbNumber, modPosConverTask.PlcPos, modTask.TaskId.ToString())); var modPosConverPallet = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "托盘æ¡ç "); listResultcon.Add(modConn.SetPlcDBValueRepeat(modPosConverPallet.PosType, modDeviceConver.DbNumber, modPosConverPallet.PlcPos, modTask.PalletNo.ToString())); // èµ·å§‹å·¥ä½ã€ç›®çš„å·¥ä½ var modPosConverStrLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "èµ·å§‹å·¥ä½"); listResultcon.Add(modConn.SetPlcDBValueRepeat(modPosConverStrLocat.PosType, modDeviceConver.DbNumber, modPosConverStrLocat.PlcPos, modDeviceConver.StationNum)); var modPosConverEndLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "目的工ä½"); listResultcon.Add(modConn.SetPlcDBValueRepeat(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(); } } else if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 730) { return; } } #endregion } var modStart = modDevice.listStation.FirstOrDefault(s => s.Text == "å¯åЍ命令"); var result = plcConn.SetDBValue(modStart.PosType, modStart.PlcPos, "1"); if (result.IsSucceed) { carTaskNext.Status = TaskStatusEnum.Doing; 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, PlcName = modDevice.Text, Status = TaskStatusEnum.Complete, InteractiveMsg = $"å‘ç©¿æ¢è½¦ä¸‹å‘任务{carTaskNext.TaskNo}" }; _db.Insertable(taskMonitor).ExecuteCommand(); //下å‘任务日志 HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } break; case "2": { //å°è½¦çжæ€å¼‚常 var modPosTaskStatus = modDevice.listStation.FirstOrDefault(s => s.Text == "任务状æ€"); var (resultTaskStatus, valueTaskStatus) = plcConn.GetDBValue(modPosTaskStatus.PosType, modPosTaskStatus.PlcPos); if (resultTaskStatus.IsSucceed && valueTaskStatus == 1) { var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务å·"); var (resultTask, valueTask) = plcConn.GetDBValue(modPosTask.PosType, modPosTask.PlcPos); string valueTaskStr = Convert.ToString(valueTask); string strNo = ""; var boNo = dicTaskNo.TryGetValue(modDevice.Id.ToString(), out strNo); if (valueTaskStr != "0" && strNo != valueTaskStr) { var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.Id.ToString().EndsWith(valueTaskStr)); if (modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete) { 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>()); //HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); if (dicTaskNo.ContainsKey(modDevice.Id.ToString())) dicTaskNo.Remove(modDevice.Id.ToString()); dicTaskNo.Add(modDevice.Id.ToString(), valueTaskStr); } } } Console.WriteLine($"ç©¿æ¢è½¦{modDevice.PlcIdIP}异常"); var modPosError = modDevice.listStation.FirstOrDefault(s => s.Text == "错误ç "); var (result, valueError) = plcConn.GetDBValue(modPosError.PosType, modPosError.PlcPos); if (result.IsSucceed) { sysCacheService.HashAddOrUpdate("AlarmInfo_Car", plcConn.PlcIP, Convert.ToInt32(valueError)); } } break; default: break; } } /// <summary> /// 输é€çº¿ä¸šåŠ¡å¤„ç† /// </summary> /// <param name="modDevice"></param> private static void ConveyorLine(WcsDeviceDto modDevice) { var plcConn = modDevice.PLCUtil; var ledText = ""; switch (modDevice.Value.ToString()) { case "120": //空闲,AGV坿”¾è´§ { var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.IsComple == "1"); if (task != null) { //没有出库业务 var res = new HttpService().GenAgvContinueTask(task.TaskNo).Result; if (res.code == "0") { 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 "320": { // 申请密集库组 string strMsg = ""; // 获å–工使‰˜ç›˜ç ä¿¡æ¯ var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘æ¡ç "); var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); if (!res.IsSucceed) { break; } var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工ä½"); //判æ–入库é”å®šæ˜¯å¦æ‰“å¼€ if (PLCTaskAction.boEnterLock) { 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.SetPlcDBValueRepeat(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.SetPlcDBValueRepeat(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.SetPlcDBValueRepeat(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 modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务å·"); listResult.Add(plcConn.SetPlcDBValueRepeat(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.SetPlcDBValueRepeat(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘æ¡ç "); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); // èµ·å§‹å·¥ä½ã€ç›®çš„å·¥ä½ var modPosStrLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "èµ·å§‹å·¥ä½"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosStrLocat.PosType, modDevice.DbNumber, modPosStrLocat.PlcPos, modDevice.StationNum)); var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工ä½"); listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndLocat.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, endLocatVlue)); if (listResult.All(s => s.IsSucceed)) { // 将任务状æ€å˜æ›´ä¸ºæ£åœ¨æ‰§è¡Œ _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) { // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { TaskNo = modTask.TaskNo, PlcId = modDevice.Id, PlcName = modDevice.Text, InteractiveMsg = $"写入指令340:{modDevice.StationNum}储ä½====》{endLocatVlue}å·¥ä½", PalletNo = palletVal, Status = TaskStatusEnum.Complete, StartLocat = modDevice.StationNum, EndLocat = endLocatVlue, }; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } } } break; case "620": { // ç”³è¯·å‚¨ä½ æ›´æ–°å…¥åº“ä»»åŠ¡(储ä½åœ°å€) 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) { break; } // 获å–工使‰˜ç›˜ç ä¿¡æ¯ var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘æ¡ç "); var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); if (!res.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) { // æ’入任务明细 var modInsertTaskMonitor = new WcsTaskMonitor() { 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); } } else { // 申请储ä½å¤±è´¥ï¼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); } } 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 && w.TaskType == TaskTypeEnum.Out); if (taskInfo == null) { Log.Error(string.Format("输é€çº¿430:未找到对应的任务。")); break; } //// 改å˜ä»»åŠ¡çŠ¶æ€ //taskInfo.Status = TaskStatusEnum.Complete; //taskInfo.FinishDate = DateTime.Now; ////modTask.Levels = 999; //_db.Updateable(taskInfo).ExecuteCommand(); //HubUtil.PublicTask(taskInfo.Adapt<WcsTaskOutput>()); // æ’入任务明细 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, }; //if (taskInfo.Origin == "WMS") //{ // // å馈WMS // var requestMode = new TaskRequestWMS() // { // TaskNo = taskInfo.TaskNo, // PalletNo = taskInfo.PalletNo, // TaskType = ((int)taskInfo.TaskType).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>()); 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.IsDelete == false && m.TaskId == tasknoVal); if (modTask == null) { Log.Error(string.Format("输é€çº¿440:未找到对应的任务。")); break; } // æ’入任务明细 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, }; // æ’入交互日志 _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); // 通知任务界é¢ä»»åС已å˜åœ¨æ›´æ–° è¯·æ›´æ–°ç•Œé¢ HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); } #endregion } break; #endregion default: break; } } /// <summary> /// AGVä¸šåŠ¡å¤„ç† /// </summary> /// <param name="modDevice"></param> private static void AGV(WcsDeviceDto modDevice) { //这里找出æ¥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; } if (_db.Queryable<WcsTask>().Any(s => s.EndLocate == modTask.EndLocate && s.IsDelete == false && s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV )) { return; // 有目的ä½ç½®ä¸€è‡´ä¸”æ£åœ¨æ‰§è¡Œçš„任务 } //下å‘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>(); if (taskModel.taskType == "DPJRK") { //var code = "[{\"type\":\"SITE\",\"code\":\"B100101\"},{\"type\":\"PILE_COUNT\",\"code\":\"8\"}]"; var code = new List<object>() { new {type = "SITE" , code = modTask.StartLocate}, new { type = "PILE_COUNT", code = modTask.Qty } }; taskModel.targetRoute.Add(new targetRoute() { seq = 0, type = "MIX_CONDITION", code = JsonConvert.SerializeObject(code) // "[{\"type":\"SITE", code = modTask.StartLocate },new { type = "PILE_COUNT", code = modTask.Qty }]" }); taskModel.targetRoute.Add(new targetRoute() { seq = 1, type = type2, code = modTask.EndLocate }); } else { taskModel.targetRoute.Add(new targetRoute() { seq = 0, type = type1, code = modTask.StartLocate }); taskModel.targetRoute.Add(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(); if (taskModel.taskType != "DPJRK") { taskModel.extra.carrierInfo = new List<carrierInfo>() { new carrierInfo(){ carrierType = "TP",carrierCode = modTask.PalletNo} }; } var response = new HttpService().GenAgvSendTask(taskModel).Result; if (response.code == "SUCCESS") { 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> /// Ledå±å±•ç¤ºä¿¡æ¯ /// </summary> /// <param name="ip">地å€</param> /// <param name="top">上方区域</param> /// <param name="content">ä¸é—´åŒºåŸŸ</param> /// <param name="foot">底部区域</param> private static void LedDisplay(string ip, string top, string content, string foot) { try { LedDll Led = new LedDll(); Led.LEDstr(ip, top, content, foot); } catch (Exception ex) { Log.Error(ex.Message); } } /// <summary> /// LEDä¿¡æ¯å±•示 /// </summary> /// <param name="ip"></param> /// <param name="text"></param> private static void LedDisplay(string ip, string text) { try { LedDll Led = new LedDll(); Led.ConsoleLeds(ip, text); // 设置实例 //Led.ConsoleLeds("10.18.51.238", $"任务类型:{TaskTypeEnum.Move.GetDescription()}\n\n任务å·:TK2024102100001\n托盘å·:LN000145\n\nèµ·å§‹ä½:033\nç›®æ ‡ä½:R01-02010102"); } catch (Exception ex) { Log.Error(ex.Message); } } 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", "1152", "30"); //å·å¸˜é—¨3申请打开 //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1154", "10"); //å·å¸˜é—¨3ç”³è¯·å…³é— //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1154", "30"); //Cå£AGV放托盘完æˆç”³è¯·å…¥åº“ //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1156", "100"); ////å†™æ»æµ‹è¯•读string //var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64"); //Console.WriteLine("DB100.64----" + val); ////测试批é‡è¯»å– //Dictionary<string, PLCDataTypeEnum> listaddress = new Dictionary<string, PLCDataTypeEnum>(); //foreach (var modStation in modDevice.listStation) //{ // listaddress.Add(modStation.PlcPos, modStation.PosType); //} //var result = modDevice.PLCUtil.GetPlcBatchDBValue(listaddress); //if (result.Value.Count > 0) //{ // foreach (var value in result.Value) // { // Console.WriteLine("地å€" + value.Key + "----值" + value, value); // } //} //if (!result.IsSucceed) //{ // foreach (var err in result.ErrList) // { // Console.WriteLine(err); // } // if (result.Value.Count > 0)//有错误的也有æˆåŠŸçš„ // { // } //} //if (modDevice.Value == 820) //{ // //测试写入830 // //var result = mod.PLCUtil.SetPlcDBValue(mod.PosType.Value, mod.DbNumber, mod.PlcPos, "830"); // ////å†™å…¥æ˜¯å¦æˆåŠŸ // //if (result.IsSucceed) // //{ // //} //} //else if (modDevice.Value == 840) //{ //} //else if (modDevice.Value == 860) //{ //} } }