chengsc
2025-04-27 c2bed218cc875e59fff53ef43a187d5934bdf35c
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -143,7 +143,7 @@
            StartRead();
            ConnectionStatus();
            StartWatchAlarm();
            //AssignTasks();
            AssignTasks();
            //StartWatchPosition();
        }
    }
@@ -209,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;
@@ -265,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();
@@ -367,10 +378,13 @@
                {
                    // 获取密集库未执行任务 根据创建时间排序
                    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(4, 2));
                    var tasklie = int.Parse(waitTask.StartLocate.Substring(4, 2));
                    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 获取当前任务所在层所有空闲小车
@@ -380,6 +394,7 @@
                    // 获取当前任务所在层所有空闲小车(根据小车任务表是否有任务和小车状态共同判断小车是否空闲)
                    var kXCarList = new List<CarInfo>();
                    var carErr = false;//小车是否有失联的
                    foreach (var modbusUtil in listModbusUtil)
                    {
                        //如果小车有未执行的任务,跳出
@@ -414,7 +429,8 @@
                                        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, 0);
                                            //小车到取货储位路径
                                            var d = FourWayCarUtil.GetCarPath(carVal, waitTask.StartLocate);
                                            kXCarList.Add(new CarInfo()
                                            {
                                                CarPlcIp = modbusUtil.PlcIP,
@@ -430,8 +446,15 @@
                            else
                            {
                                Console.WriteLine($"读取四向车{modbusUtil.PlcIP}状态失败");
                                return;//有一个小车读取失败跳出方法,暂缓分配,防止同层小车关机或失联导致阻挡路径
                                carErr = true;
                                break;//有一个小车读取失败跳出方法,暂缓分配,防止同层小车关机或失联导致阻挡路径
                            }
                        }
                        //有小车失联,不分配任务
                        if (carErr)
                        {
                            kXCarList.Clear();//清楚空车记录
                            break;
                        }
                    }
@@ -442,7 +465,7 @@
                    var assignCar = kXCarList.OrderBy(m => m.Level).FirstOrDefault();
                    if (assignCar == null)
                    {
                        break;//没有空闲小车
                        continue;//没有空闲小车
                    }
                    var data = new List<CarModel>();
                    if (assignCar.Level != 0)
@@ -450,14 +473,15 @@
                        //判断小车位置是否与任务的起始储位相同,不相同:获取小车到取货储位路径
                        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, 0);
                        data.AddRange(data1);
                        var data1 = FourWayCarUtil.GetCarPath(carLocate, waitTask.StartLocate);
                        var datas = FourWayCarUtil.GetCarPathUp(data1, 0);
                        data.AddRange(datas);
                    }
                    //获取小车去放货储位任务路径
                    var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, 2, "1");
                    data.AddRange(data2);
                    if (data == null) { break; }
                    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 = "";//交互路径
@@ -478,10 +502,10 @@
                            //判断如果是完整路径 记录交互路径
                            if (isOk == "1")
                            {
                                if (i == 0)
                                {
                                    return;//第一个节点有和其他任务路径冲突,无法避免
                                }
                                //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))
                                {
@@ -540,14 +564,15 @@
                            var endLocate3 = "";
                            var executionPath3 = "";
                            var path3 = ""; 
                            var data3 = new List<CarModel>();
                            var datas3 = new List<CarModel>();
                            //查找目标位置
                            while (endLocate3 == "" || data3.Count == 0 || data3 == null)
                            while (endLocate3 == "" || datas3.Count == 0 || datas3 == null)
                            {
                                endLocate3 = FourWayCarUtil.GetCarEndLocation(carXYZ, str3);
                                data3 = FourWayCarUtil.GetCarPath(carXYZ, endLocate3, 0, "0");
                                var data3 = FourWayCarUtil.GetCarPath(carXYZ, endLocate3, "0");
                                datas3 = FourWayCarUtil.GetCarPathUp(data3, 0);
                            }
                            foreach (var itemPath in data3)
                            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();
@@ -612,14 +637,15 @@
                            var endLocate = "";
                            var executionPath4 = "";
                            var path4 = "";
                            var data4 = new List<CarModel>();
                            var datas4 = new List<CarModel>();
                            //查找目标位置
                            while (endLocate == "" || data4.Count == 0 || data4 == null)
                            while (endLocate == "" || datas4.Count == 0 || datas4 == null)
                            {
                                endLocate = FourWayCarUtil.GetCarEndLocation(lastPath, str4);
                                data4 = FourWayCarUtil.GetCarPath(lastPath, endLocate, 0, "0");
                                var data4 = FourWayCarUtil.GetCarPath(lastPath, endLocate);
                                datas4 = FourWayCarUtil.GetCarPathUp(data4, 0);
                            }
                            foreach (var itemPath in data4)
                            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();