From c2bed218cc875e59fff53ef43a187d5934bdf35c Mon Sep 17 00:00:00 2001 From: chengsc <11752@DESKTOP-DS49RCP> Date: 星期日, 27 四月 2025 14:59:20 +0800 Subject: [PATCH] 修改优化问题 --- Admin.NET/WCS.Application/PLC/PLCTaskAction.cs | 419 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 410 insertions(+), 9 deletions(-) diff --git a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs index 7bd5530..17bcb90 100644 --- a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs +++ b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs @@ -2,13 +2,18 @@ using DocumentFormat.OpenXml.Bibliography; using DocumentFormat.OpenXml.Drawing; using DocumentFormat.OpenXml.Drawing.Charts; +using Elastic.Clients.Elasticsearch.Snapshot; using Furion.Logging; using Microsoft.AspNetCore.SignalR; using NewLife.Serialization; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; +using OnceMi.AspNetCore.OSS; using System; using System.Drawing.Drawing2D; using System.Net.NetworkInformation; +using WCS.Application.Entity; +using WCS.Application.Util; using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressIntracityUpdateStoreRequest.Types; //using WCS.Application.Util; @@ -35,6 +40,7 @@ private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); private static readonly SysCacheService sysCacheService = App.GetRequiredService<SysCacheService>(); private static readonly SysConfigService _sysConfigService = App.GetService<SysConfigService>(); + private static readonly WcsTaskService _taskService = App.GetService<WcsTaskService>(); private static List<WcsPlc> listPlc = new List<WcsPlc>(); private static List<WcsDevice> listPlcDevice = new List<WcsDevice>(); @@ -137,6 +143,7 @@ StartRead(); ConnectionStatus(); StartWatchAlarm(); + AssignTasks(); //StartWatchPosition(); } } @@ -202,15 +209,15 @@ var (result, value) = modPlcUtil.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos); if (result.IsSucceed) { - //濡傛灉鏄┛姊溅锛岃繖閲屽彂閫佸績璺� - if (modPlc.Type == PLCTypeEnum.ShuttleCar) - { - var modHeart = listPlcPosition.Where(s => s.DeviceId == modDevice.Id && s.Text == "蹇冭烦").FirstOrDefault(); - if (modHeart != null) - { - modPlcUtil.SetPlcDBValue(modHeart.PosType, modHeart.PlcPos, "1"); - } - } + ////濡傛灉鏄┛姊溅锛岃繖閲屽彂閫佸績璺� + //if (modPlc.Type == PLCTypeEnum.ShuttleCar) + //{ + // var modHeart = listPlcPosition.Where(s => s.DeviceId == modDevice.Id && s.Text == "蹇冭烦").FirstOrDefault(); + // if (modHeart != null) + // { + // modPlcUtil.SetPlcDBValue(modHeart.PosType, modHeart.PlcPos, "1"); + // } + //} //鏃犳祦绋嬭烦鍑� if (Convert.ToInt32(value) == 0) continue; @@ -258,11 +265,22 @@ var (result, value) = modbusUtil.GetDBValue(modDevice.PosType, modDevice.PlcPos); if (result.IsSucceed) { + //濡傛灉鏄┛姊溅锛岃繖閲屽彂閫佸績璺� + if (modPlc.Type == PLCTypeEnum.ShuttleCar) + { + var modHeart = listPlcPosition.Where(s => s.DeviceId == modDevice.Id && s.Text == "蹇冭烦").FirstOrDefault(); + if (modHeart != null) + { + modbusUtil.SetDBValue(modHeart.PosType, modHeart.PlcPos, "1"); + } + } + //鏃犳祦绋嬭烦鍑� if (value == 0) continue; var dto = modDevice.Adapt<WcsDeviceDto>(); dto.Value = value; + dto.PlcIdIP = modPlc.IP; dto.Type = _modplc.Type; dto.modbusUtil = modbusUtil; dto.listStation = listPlcPosition.Where(s => s.DeviceId == modDevice.Id).ToList(); @@ -334,6 +352,385 @@ }, cts.Token); } } + + /// <summary> + /// 鍥涘悜杞︿换鍔″垎閰� + /// </summary> + private static void AssignTasks() + { + + Task.Run(() => + { + while (true) + { + Console.WriteLine("寮�鍚洓鍚戣溅浠诲姟鑷垎閰�"); + //鍙栨秷绾跨▼ 鍏抽棴PLC杩炴帴 + if (cts.Token.IsCancellationRequested) + { + foreach (var modModBusUtil in listModbusUtil) + { + if (modModBusUtil != null && modModBusUtil.Connected) + modModBusUtil.Close(); + } + break; + } + try + { + // 鑾峰彇瀵嗛泦搴撴湭鎵ц浠诲姟 鏍规嵁鍒涘缓鏃堕棿鎺掑簭 + var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(s => s.CreateTime).First(); + if (waitTask == null) + { + continue; + } + //01010101: 01鎺� 01鍒� 01灞� 01娣卞害-姝ら」鐩笉鍋氬垽鏂� + var taskpai = int.Parse(waitTask.StartLocate.Substring(0, 2)); + var tasklie = int.Parse(waitTask.StartLocate.Substring(2, 2)); + var taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2)); + + #region 鑾峰彇褰撳墠浠诲姟鎵�鍦ㄥ眰鎵�鏈夌┖闂插皬杞� + + // 鑾峰彇鏈変换鍔$殑灏忚溅缂栧彿 + var taskCarList = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.Status == TaskStatusEnum.Wait).Select(m => m.CarNo).Distinct().ToList(); + + // 鑾峰彇褰撳墠浠诲姟鎵�鍦ㄥ眰鎵�鏈夌┖闂插皬杞︼紙鏍规嵁灏忚溅浠诲姟琛ㄦ槸鍚︽湁浠诲姟鍜屽皬杞︾姸鎬佸叡鍚屽垽鏂皬杞︽槸鍚︾┖闂�) + var kXCarList = new List<CarInfo>(); + var carErr = false;//灏忚溅鏄惁鏈夊け鑱旂殑 + foreach (var modbusUtil in listModbusUtil) + { + //濡傛灉灏忚溅鏈夋湭鎵ц鐨勪换鍔★紝璺冲嚭 + if (taskCarList.Contains(modbusUtil.PlcIP)) + { + continue; + } + //鑾峰彇灏忚溅鐨刉csDevice淇℃伅 + var listDevice = listPlcDevice.Where(s => s.PlcId == modbusUtil.PlcId && s.DeviceType == DeviceTypeEnum.Business).ToList(); + //寰幆璇昏澶� + foreach (var modDevice in listDevice) + { + var (result, value) = modbusUtil.GetDBValue(modDevice.PosType, modDevice.PlcPos); + if (result.IsSucceed) + { + //鑾峰彇宸ヤ綅WCSPLCPosition淇℃伅 + var plcPosition = listPlcPosition.Where(s => s.DeviceId == modDevice.Id).ToList(); + //灏忚溅绌洪棽鍔犲叆闆嗗悎 + if (value == 1) + { + var modStationX = plcPosition.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(X)"); + var (resultx, valuex) = modbusUtil.GetDBValue(modStationX.PosType, modStationX.PlcPos); + var modStationY = plcPosition.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(Y)"); + var (resulty, valuey) = modbusUtil.GetDBValue(modStationY.PosType, modStationY.PlcPos); + var modStationZ = plcPosition.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(Z)"); + var (resultz, valuez) = modbusUtil.GetDBValue(modStationZ.PosType, modStationZ.PlcPos); + //灏忚溅褰撳墠灞� + var carZ = (int)valuez; + //浠诲姟灞備笌灏忚溅灞傜浉鍚� + if (taskceng == carZ) + { + if (!kXCarList.Any(m => m.CarPlcIp == modbusUtil.PlcIP)) + { + var carVal = ((int)valuex).ToString().PadLeft(2, '0') + ((int)valuey).ToString().PadLeft(2, '0') + ((int)valuez).ToString().PadLeft(2, '0'); + //灏忚溅鍒板彇璐у偍浣嶈矾寰� + var d = FourWayCarUtil.GetCarPath(carVal, waitTask.StartLocate); + kXCarList.Add(new CarInfo() + { + CarPlcIp = modbusUtil.PlcIP, + X = (int)valuex, + Y = (int)valuey, + Z = (int)valuez, + Level = d.Count, + }); + } + } + } + } + else + { + Console.WriteLine($"璇诲彇鍥涘悜杞modbusUtil.PlcIP}鐘舵�佸け璐�"); + carErr = true; + break;//鏈変竴涓皬杞﹁鍙栧け璐ヨ烦鍑烘柟娉曪紝鏆傜紦鍒嗛厤锛岄槻姝㈠悓灞傚皬杞﹀叧鏈烘垨澶辫仈瀵艰嚧闃绘尅璺緞 + } + } + //鏈夊皬杞﹀け鑱旓紝涓嶅垎閰嶄换鍔� + if (carErr) + { + kXCarList.Clear();//娓呮绌鸿溅璁板綍 + break; + } + } + + #endregion + + #region 鑾峰彇閫傚悎鎵ц褰撳墠浠诲姟鐨勫皬杞� 鐢熸垚璺緞锛堥渶鑰冭檻灏忚溅闃婚樆鎸★級 + + var assignCar = kXCarList.OrderBy(m => m.Level).FirstOrDefault(); + if (assignCar == null) + { + continue;//娌℃湁绌洪棽灏忚溅 + } + var data = new List<CarModel>(); + if (assignCar.Level != 0) + { + //鍒ゆ柇灏忚溅浣嶇疆鏄惁涓庝换鍔$殑璧峰鍌ㄤ綅鐩稿悓,涓嶇浉鍚岋細鑾峰彇灏忚溅鍒板彇璐у偍浣嶈矾寰� + var carLocate = assignCar.X.ToString().PadLeft(2, '0')+assignCar.Y.ToString().PadLeft(2, '0')+ assignCar.Z.ToString().PadLeft(2, '0'); + //鑾峰彇灏忚溅鍘诲彇璐у偍浣嶄换鍔¤矾寰� + var data1 = FourWayCarUtil.GetCarPath(carLocate, waitTask.StartLocate); + var datas = FourWayCarUtil.GetCarPathUp(data1, 0); + data.AddRange(datas); + } + //鑾峰彇灏忚溅鍘绘斁璐у偍浣嶄换鍔¤矾寰� + var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, "1"); + var datas2 = FourWayCarUtil.GetCarPathUp(data2, 1); + data.AddRange(datas2); + if (data == null) { continue; } + + var preId1 = "";//鍓嶇疆浠诲姟Id + var executionPath1 = "";//浜や簰璺緞 + var executionPath2 = "";//浜や簰璺緞 + var path = "";//鎵�鏈夎矾寰� + var isOk = "1"; //鏄惁瀹屾暣璺緞 1瀹屾暣 2 涓ゆ潯璺緞 + for (int i = 0; i < data.Count; i++) + { + //璺緞鑺傜偣 + var pathXYZ = data[i].X.ToString().PadLeft(2, '0') + data[i].Y.ToString().PadLeft(2, '0') + data[i].Z.ToString().PadLeft(2, '0')+ data[i].NodeCom.ToString(); + path += pathXYZ + ";"; + + //鑾峰彇绛夊緟鎴栨鍦ㄦ墽琛岀殑浠诲姟涓寘鍚綋鍓嶈妭鐐圭殑灏忚溅浠诲姟 + var taskList = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.Path.Contains(pathXYZ)).Select(m => m.Id).Distinct().ToList(); + + foreach (var item in taskList) + { + //鍒ゆ柇濡傛灉鏄畬鏁磋矾寰� 璁板綍浜や簰璺緞 + if (isOk == "1") + { + //if (i == 0) + //{ + // return;//绗竴涓妭鐐规湁鍜屽叾浠栦换鍔¤矾寰勫啿绐侊紝鏃犳硶閬垮厤 + //} + var pathXYZQian = data[i - 1].X.ToString().PadLeft(2, '0') + data[i - 1].Y.ToString().PadLeft(2, '0') + data[i - 1].Z.ToString().PadLeft(2, '0') + data[i].NodeCom.ToString(); + if (!executionPath1.Contains(pathXYZQian)) + { + executionPath1 += pathXYZQian + ";"; + } + executionPath2 += pathXYZQian + ";"; + } + //鍒ゆ柇娣诲姞鍓嶇疆浠诲姟Id + if (!preId1.Contains(item + "")) + { + preId1 += item + ";"; + } + + isOk = "2"; + } + + if (data[i].IsSendPlc) + { + if (isOk == "1") + { + executionPath1 += pathXYZ + ";"; + } + else + { + executionPath2 += pathXYZ + ";"; + } + + } + + } + + #endregion + + #region 鍒ゆ柇鏄惁鏈夌┖闂插皬杞﹂樆鎸¤矾寰� 3 + var preId3 = "";//鍓嶇疆浠诲姟Id + foreach (var item in kXCarList) + { + if (item == assignCar) + { + continue;//鎺掗櫎褰撳墠鍒嗛厤浠诲姟鐨勫皬杞� + } + //灏忚溅浣嶇疆 + var carXYZ = item.X.ToString().PadLeft(2, '0') + item.Y.ToString().PadLeft(2, '0') + item.Z.ToString().PadLeft(2, '0') ; + //鍒嗛厤鐨勪换鍔¤矾寰勪腑 褰撳墠灏忚溅鏄惁闃绘尅 + if (path.Contains(carXYZ)) + { + //鑾峰彇绛夊緟鎴栨鍦ㄦ墽琛岀殑浠诲姟涓寘鍚綋鍓嶈妭鐐圭殑灏忚溅浠诲姟锛屼笉浼氭湁澶浠诲姟锛屽悓灞傛湁鍑犱釜灏忚溅鏈�澶氭湁鍑犱釜浠诲姟 + var taskList3 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)).ToList(); + + var str3 = "";//鎵�鏈夊凡鍒嗛厤鎴栨墽琛岀殑浠诲姟鍏ㄨ矾寰勪箣鍜� + + foreach (var item2 in taskList3) + { + str3 += item2.Path; + } + var endLocate3 = ""; + var executionPath3 = ""; + var path3 = ""; + var datas3 = new List<CarModel>(); + //鏌ユ壘鐩爣浣嶇疆 + while (endLocate3 == "" || datas3.Count == 0 || datas3 == null) + { + endLocate3 = FourWayCarUtil.GetCarEndLocation(carXYZ, str3); + var data3 = FourWayCarUtil.GetCarPath(carXYZ, endLocate3, "0"); + datas3 = FourWayCarUtil.GetCarPathUp(data3, 0); + } + foreach (var itemPath in datas3) + { + var pathXYZ = itemPath.X.ToString().PadLeft(2, '0') + itemPath.Y.ToString().PadLeft(2, '0') + itemPath.Z.ToString().PadLeft(2, '0') + itemPath.NodeCom.ToString(); + + path3 += pathXYZ + ";"; + if (itemPath.IsSendPlc) + { + executionPath3 += pathXYZ + ";"; + } + } + WcsTask modTask = new WcsTask() + { + TaskNo = _taskService.GetTaskCode(), + TaskType = TaskTypeEnum.Move, + Type = PLCTypeEnum.ShuttleCar, + StartLocate = carXYZ, + EndLocate = endLocate3, + PalletNo = "", + Status = TaskStatusEnum.Wait, + Levels = 2, + Origin = "WCS" + }; + _db.Insertable(modTask).ExecuteCommand(); + HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); + //绉诲姩灏忚溅 + var carTaskYC = new WcsCarTasks() + { + TaskNo = modTask.TaskNo, + PreId = "", + ExecutionPath = executionPath3, + Path = path3, + CarNo = item.CarPlcIp, + Status = TaskStatusEnum.Wait + }; + var idLong = _db.Insertable(carTaskYC).ExecuteReturnBigIdentity(); + preId3 += idLong + ";"; + } + } + + #endregion + + #region 鍒ゆ柇鐜版湁浠诲姟涓渶缁堣妭鐐规槸鍚﹀湪褰撳墠鍒嗛厤璺緞涓紝濡傛湁 娣诲姞绉昏蛋灏忚溅浠诲姟骞跺姞鍏ュ墠缃换鍔� 4 + + //鑾峰彇绛夊緟鎴栨鍦ㄦ墽琛岀殑浠诲姟涓寘鍚綋鍓嶈妭鐐圭殑灏忚溅浠诲姟锛屼笉浼氭湁澶浠诲姟锛屽悓灞傛湁鍑犱釜灏忚溅鏈�澶氭湁鍑犱釜浠诲姟 + var taskList4 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)).ToList(); + var preId4 = "";//鍓嶇疆浠诲姟Id + var str4 = "";//鎵�鏈夊凡鍒嗛厤鎴栨墽琛岀殑浠诲姟鍏ㄨ矾寰勪箣鍜� + + foreach (var item in taskList4) + { + str4 += item.Path; + } + //鍒ゆ柇鐜版湁浠诲姟涓渶缁堣妭鐐规槸鍚﹀湪褰撳墠鍒嗛厤璺緞涓紝濡傛湁 娣诲姞绉昏蛋灏忚溅浠诲姟骞跺姞鍏ュ墠缃换鍔� + foreach (var item in taskList4) + { + var lastPathList = item.ExecutionPath.Split(';'); + // a;b;c; 鏈�鍚庝竴涓綅鏄�溾�濓紝鎵�浠astPathList.Length - 2 + var lastPath = lastPathList[lastPathList.Length - 2]; + + //濡傛灉姝ゆ鍒嗛厤璺緞鍖呭惈閱夎垶涓渶缁堣妭鐐硅矾寰勶紝娣诲姞绉昏蛋灏忚溅 + if (path.Contains(lastPath)) + { + var endLocate = ""; + var executionPath4 = ""; + var path4 = ""; + var datas4 = new List<CarModel>(); + //鏌ユ壘鐩爣浣嶇疆 + while (endLocate == "" || datas4.Count == 0 || datas4 == null) + { + endLocate = FourWayCarUtil.GetCarEndLocation(lastPath, str4); + var data4 = FourWayCarUtil.GetCarPath(lastPath, endLocate); + datas4 = FourWayCarUtil.GetCarPathUp(data4, 0); + } + foreach (var itemPath in datas4) + { + var pathXYZ = itemPath.X.ToString().PadLeft(2, '0') + itemPath.Y.ToString().PadLeft(2, '0') + itemPath.Z.ToString().PadLeft(2, '0') + itemPath.NodeCom.ToString(); + + path4 += pathXYZ + ";"; + if (itemPath.IsSendPlc) + { + executionPath4 += pathXYZ + ";"; + } + } + WcsTask modTask = new WcsTask() + { + TaskNo = _taskService.GetTaskCode(), + TaskType = TaskTypeEnum.Move, + Type = PLCTypeEnum.ShuttleCar, + StartLocate = lastPath, + EndLocate = endLocate, + PalletNo = "", + Status = TaskStatusEnum.Wait, + Levels = 2, + Origin = "WCS" + }; + _db.Insertable(modTask).ExecuteCommand(); + HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); + //绉诲姩灏忚溅 + var carTaskYC = new WcsCarTasks() + { + TaskNo = modTask.TaskNo, + PreId = "", + ExecutionPath = executionPath4, + Path = path4, + CarNo = item.CarNo, + Status = TaskStatusEnum.Wait + }; + var idLong = _db.Insertable(carTaskYC).ExecuteReturnBigIdentity(); + preId4 += idLong + ";"; + } + } + + #endregion + + #region 鎻掑叆浠诲姟鏁版嵁 鏀瑰彉浠诲姟鐘舵�� + + // 鎻掑叆鍥涘悜杞︿换鍔¤〃 + var carTask1 = new WcsCarTasks() + { + TaskNo = waitTask.TaskNo, + PreId = preId1+ preId3+preId4, + ExecutionPath = executionPath1, + Path = path, + CarNo = assignCar.CarPlcIp, + Status = TaskStatusEnum.Wait + }; + _db.Insertable(carTask1).ExecuteCommand(); + if (!string.IsNullOrWhiteSpace(executionPath1) && isOk == "2") + { + // 鎻掑叆鍥涘悜杞︿换鍔¤〃 + var carTask2 = new WcsCarTasks() + { + TaskNo = waitTask.TaskNo, + PreId = preId1, + ExecutionPath = executionPath2, + Path = path, + CarNo = assignCar.CarPlcIp, + Status = TaskStatusEnum.Wait + }; + _db.Insertable(carTask2).ExecuteCommand(); + } + // 鏀瑰彉鎬讳换鍔¤〃鐘舵�� + waitTask.Status = TaskStatusEnum.Doing; + waitTask.UpdateTime = DateTime.Now; + _db.Updateable(waitTask).ExecuteCommand(); + HubUtil.PublicTask(waitTask.Adapt<WcsTaskOutput>()); + + #endregion + + Thread.Sleep(3000); + } + catch (Exception ex) + { + Log.Error("浠诲姟鍒嗛厤鍙戠敓寮傚父", ex); + } + } + },cts.Token); + } + /// <summary> /// 杩炴帴鐘舵�佺嚎绋� @@ -692,6 +1089,10 @@ } }); } + /// <summary> + /// 淇敼浣嶇疆淇℃伅 + /// </summary> + /// <param name="modInfo"></param> private static void UpdatePosition(PlcPositionInfo modInfo) { var modTemp = listPositionInfo.FirstOrDefault(s => s.StationNum == modInfo.StationNum && modInfo.Type == s.Type); -- Gitblit v1.8.0