| | |
| | | using Newtonsoft.Json.Linq; |
| | | using SqlSugar; |
| | | using NewLife.Reflection; |
| | | using static SKIT.FlurlHttpClient.Wechat.Api.Models.CustomServiceKfSessionGetWaitCaseResponse.Types; |
| | | using WCS.Application.Util; |
| | | |
| | | namespace WCS.Application; |
| | | |
| | |
| | | _taskService = taskService; |
| | | } |
| | | |
| | | // <summary> |
| | | /// <summary> |
| | | /// 测试分配任务路径 |
| | | /// </summary> |
| | | /// <param name="models">任务信息</param> |
| | | /// <returns>反馈信息</returns> |
| | | [AllowAnonymous] |
| | | public async Task AddAssignTasks(ResponseTasksModel models) |
| | | { |
| | | // 验证任务是否已存在 |
| | | var taskInfo = await _db.Queryable<WcsTask>().FirstAsync(w => w.TaskNo == models.TaskNo); |
| | | if (taskInfo == null) |
| | | { |
| | | throw Oops.Bah("任务:" + models.TaskNo + ";不存在!"); |
| | | } |
| | | var data1 = FourWayCarUtil.GetCarPath("090601", "080401"); |
| | | if (data1 == null) //|| data1.Count == 0 |
| | | { |
| | | throw Oops.Bah("分配路径不存在!"); |
| | | } |
| | | |
| | | // 根据任务状态 补充起始结束节点状态 |
| | | var data2 = FourWayCarUtil.GetCarPathUp(data1, 1); |
| | | var path = ""; |
| | | var executionPath1 = ""; |
| | | foreach (var item in data1) |
| | | { |
| | | //路径节点 |
| | | var pathXYZ = item.X.ToString().PadLeft(2, '0') + item.Y.ToString().PadLeft(2, '0') + item.Z.ToString().PadLeft(2, '0') + item.NodeCom.ToString(); |
| | | path += pathXYZ + ";"; |
| | | if (item.IsSendPlc) |
| | | { |
| | | executionPath1 += pathXYZ + ";"; |
| | | } |
| | | } |
| | | // 插入四向车任务表 |
| | | var carTask1 = new WcsCarTasks() |
| | | { |
| | | TaskNo = taskInfo.TaskNo, |
| | | PreId = "", |
| | | ExecutionPath = executionPath1, |
| | | Path = path, |
| | | CarNo = "", |
| | | Status = TaskStatusEnum.Wait |
| | | }; |
| | | var i = _db.Insertable(carTask1).ExecuteCommand(); |
| | | Console.WriteLine(""+i); |
| | | } |
| | | |
| | | /// WCS接受WMS下发的任务(多 |
| | | /// 条任务) |
| | | /// <param name="models">任务信息</param> |
| | |
| | | var taskAdd = new WcsTask() |
| | | { |
| | | TaskNo = models.TaskNo, |
| | | TaskType = TaskTypeEnum.Out, |
| | | TaskType = (TaskTypeEnum?)int.Parse(models.TaskType), |
| | | Status = TaskStatusEnum.Wait, |
| | | Type = models.Type, |
| | | Levels = 999, |
| | | Origin = "WMS", |
| | | StartRoadway = models.StartRoadway, |
| | |
| | | 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); |
| | | var modPosTaskStatus = modDevice.listStation.FirstOrDefault(s => s.Text == "任务状态"); |
| | | var (resultTaskStatus, valueTaskStatus) = plcConn.GetDBValue(modPosTaskStatus.PosType, modPosTaskStatus.PlcPos); |
| | | //判断读取任务状态是否成功 并且任务状态是1 0:未空闲,1:空闲,2:异常 3:充电中 |
| | | //判断读取任务状态是否成功 并且任务状态是1 0:无任务,1:任务完成,2:任务取消,3:任务暂停,4:任务异常 5:任务执行中 |
| | | |
| | | WcsCarTasks carTask2 = null;//null 新任务 not null 路径2任务 |
| | | |
| | | if (resultTaskStatus.IsSucceed && valueTaskStatus == 1) |
| | | { |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号"); |
| | |
| | | var carTask = _db.Queryable<WcsCarTasks>().First(m=>m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.CarTaskNo == valueTaskStr && m.CarNo == modDevice.PlcIdIP); |
| | | if (carTask == null) |
| | | { |
| | | return;//没有找到任务 |
| | | 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) |
| | | { |
| | | return;//没有查询到总任务 |
| | | 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(); |
| | |
| | | var modStationZ = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Z)"); |
| | | var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos); |
| | | |
| | | // 获取任务信息 |
| | | var 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(); |
| | | |
| | | WcsTask modTask; |
| | | //要下发路径2任务 |
| | | if (carTask2 == null) |
| | | if (carTask2 != 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) |
| | | { |
| | | return; |
| | | } |
| | | carTask2= _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).OrderBy(m => m.CreateTime).First(); |
| | | } |
| | | |
| | | //return; |
| | | if (modTask == null || carTask2 == null) |
| | | { |
| | | //判断小车是否有空闲时间记录 没有:添加 有:判断当前时间与记录时间是否满足5分钟 满足:添加让小车去充电任务 |
| | | return; |
| | | } |
| | | |
| | |
| | | int posY = Convert.ToInt32(modNodeY.PlcPos); |
| | | int posZ = Convert.ToInt32(modNodeZ.PlcPos); |
| | | int posStatus = Convert.ToInt32(modNodeStatus.PlcPos); |
| | | if (Convert.ToInt32(valuey) != Convert.ToInt32(modTask.StartLocate.Substring(2, 2))) |
| | | { |
| | | //写入小车当前位置 |
| | | 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")); |
| | | } |
| | | |
| | | //交互路径 |
| | | var execuPath = carTask2.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.SetDBValue(modNodeX.PosType, posX++.ToString(), ePath.Substring(0, 2))); |
| | | listResult.Add(plcConn.SetDBValue(modNodeY.PosType, posY++.ToString(), ePath.Substring(2, 2))); |
| | | listResult.Add(plcConn.SetDBValue(modNodeZ.PosType, posZ++.ToString(), ePath.Substring(4, 2))); |
| | | listResult.Add(plcConn.SetDBValue(modNodeStatus.PosType, posStatus++.ToString(), ePath.Substring(5, 1))); |
| | | listResult.Add(plcConn.SetDBValue(modNodeX.PosType, posX++.ToString(), epathx)); |
| | | listResult.Add(plcConn.SetDBValue(modNodeY.PosType, posY++.ToString(), epathy)); |
| | | listResult.Add(plcConn.SetDBValue(modNodeZ.PosType, posZ++.ToString(), epathz)); |
| | | listResult.Add(plcConn.SetDBValue(modNodeStatus.PosType, posStatus++.ToString(), epathn)); |
| | | } |
| | | |
| | | //这里是把后面的坐标全写0(为了防止上次任务坐标没被覆盖) |
| | |
| | | carTask2.Status = TaskStatusEnum.Doing; |
| | | carTask2.CarTaskNo = carTaskNo; |
| | | _db.Updateable(carTask2).ExecuteCommand(); |
| | | //清除小车空闲时间 |
| | | var taskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = carTask2.TaskNo, |
| | |
| | | StartRead(); |
| | | ConnectionStatus(); |
| | | StartWatchAlarm(); |
| | | //AssignTasks(); |
| | | AssignTasks(); |
| | | //StartWatchPosition(); |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | 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(); |
| | |
| | | { |
| | | // 获取密集库未执行任务 根据创建时间排序 |
| | | 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 获取当前任务所在层所有空闲小车 |
| | |
| | | |
| | | // 获取当前任务所在层所有空闲小车(根据小车任务表是否有任务和小车状态共同判断小车是否空闲) |
| | | var kXCarList = new List<CarInfo>(); |
| | | var carErr = false;//小车是否有失联的 |
| | | foreach (var modbusUtil in listModbusUtil) |
| | | { |
| | | //如果小车有未执行的任务,跳出 |
| | |
| | | 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, |
| | |
| | | else |
| | | { |
| | | Console.WriteLine($"读取四向车{modbusUtil.PlcIP}状态失败"); |
| | | return;//有一个小车读取失败跳出方法,暂缓分配,防止同层小车关机或失联导致阻挡路径 |
| | | carErr = true; |
| | | break;//有一个小车读取失败跳出方法,暂缓分配,防止同层小车关机或失联导致阻挡路径 |
| | | } |
| | | } |
| | | //有小车失联,不分配任务 |
| | | if (carErr) |
| | | { |
| | | kXCarList.Clear();//清楚空车记录 |
| | | break; |
| | | } |
| | | } |
| | | |
| | |
| | | var assignCar = kXCarList.OrderBy(m => m.Level).FirstOrDefault(); |
| | | if (assignCar == null) |
| | | { |
| | | break;//没有空闲小车 |
| | | 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, 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 = "";//交互路径 |
| | |
| | | //判断如果是完整路径 记录交互路径 |
| | | 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)) |
| | | { |
| | |
| | | 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(); |
| | | |
| | |
| | | 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(); |
| | | |
| | |
| | | { |
| | | private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="list">集合</param> |
| | | /// <param name="moveType">移动类型 0:移动 1:移货 </param> |
| | | /// <returns></returns> |
| | | public static List<CarModel> GetCarPathUp(List<CarModel> list,int moveType) |
| | | { |
| | | for (int i = 0; i < list.Count; i++) |
| | | { |
| | | if (i > 0 && i < list.Count - 1) |
| | | { |
| | | if (list[i].X == list[i + 1].X) |
| | | { |
| | | list[i].NodeCom = 2; |
| | | } |
| | | else if (list[i].Y == list[i + 1].Y) |
| | | { |
| | | list[i].NodeCom = 3; |
| | | } |
| | | } |
| | | if (i== 0) |
| | | { |
| | | list[i].IsSendPlc = true; |
| | | if (moveType == 0) |
| | | { |
| | | if (list[i + 1] == null) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | list[i].NodeCom = 1; |
| | | } |
| | | } |
| | | if (i == list.Count-1) |
| | | { |
| | | list[i].IsSendPlc = true; |
| | | if (moveType == 0) |
| | | { |
| | | list[i].NodeCom = list[i + 1].NodeCom; |
| | | } |
| | | else |
| | | { |
| | | list[i].NodeCom = 4; |
| | | } |
| | | } |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取小车路径 |
| | | /// </summary> |
| | | /// <param name="startLocation">起始位置</param> |
| | | /// <param name="endLocation">目标位置</param> |
| | | /// <param name="moveType">移动类型 0:移动 1:取货 2:放货</param> |
| | | /// <param name="isLoad">是否载货0:未载货 1:已载货</param> |
| | | /// <returns></returns> |
| | | public static List<CarModel> GetCarPath(string startLocation, string endLocation, int moveType, string isLoad = "0") |
| | | public static List<CarModel> GetCarPath(string startLocation, string endLocation, string isLoad = "0") |
| | | { |
| | | if (string.IsNullOrEmpty(startLocation) || string.IsNullOrEmpty(endLocation)) |
| | | { |
| | |
| | | if (!gScore.ContainsKey(neighbor) || tentativeGScore < gScore[neighbor]) |
| | | { |
| | | neighbor.IsSendPlc = false; |
| | | // 补充参数 |
| | | if (neighbor.Equals(end)) |
| | | |
| | | //if (current.X == neighbor.X) |
| | | //{ |
| | | // current.NodeCom = 2; |
| | | //} |
| | | //else if (current.Y == neighbor.Y) |
| | | //{ |
| | | // current.NodeCom = 3; |
| | | //} |
| | | |
| | | //// 补充参数 |
| | | //if (current.Equals(start)) |
| | | //{ |
| | | // current.NodeCom = moveType; |
| | | // current.IsSendPlc = true; |
| | | //} |
| | | //if (neighbor.Equals(end)) |
| | | //{ |
| | | // //neighbor.NodeCom = moveType != 0 ? 2:0 ; |
| | | // if (moveType == 1) |
| | | // { |
| | | // neighbor.NodeCom = 4; |
| | | // } |
| | | // else |
| | | // { |
| | | // neighbor.NodeCom = current.NodeCom; |
| | | // } |
| | | |
| | | // neighbor.IsSendPlc = true; |
| | | //} |
| | | if (currentModel.Make != locationModel.Make) |
| | | { |
| | | neighbor.NodeCom = moveType; |
| | | neighbor.IsSendPlc = true; |
| | | } |
| | | else if (currentModel.Make != locationModel.Make) |
| | | { |
| | | if (current.X == neighbor.X) |
| | | { |
| | | neighbor.NodeCom = 3; |
| | | } |
| | | else if (current.Y == neighbor.Y) |
| | | { |
| | | neighbor.NodeCom = 2; |
| | | } |
| | | |
| | | neighbor.IsSendPlc = true; |
| | | } |
| | | |
| | | // 更新实际距离与预估距离 |
| | | cameFrom[neighbor] = current; |