chengsc
2025-04-27 c2bed218cc875e59fff53ef43a187d5934bdf35c
修改优化问题
5个文件已修改
307 ■■■■ 已修改文件
Admin.NET/WCS.Application/Entity/WcsTask.cs 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/OpenApi/OpenApi.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCService.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Util/FourWayCarUtil.cs 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Entity/WcsTask.cs
Admin.NET/WCS.Application/OpenApi/OpenApi.cs
@@ -17,6 +17,8 @@
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;
@@ -42,7 +44,54 @@
        _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>
@@ -115,8 +164,9 @@
        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,
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -146,6 +146,7 @@
    private static void ShuttleCar(WcsDeviceDto modDevice)
    {
        var plcConn = modDevice.modbusUtil;
        // 四向车状态 0:未空闲,1:空闲,2:异常  3:充电中
        switch (modDevice.Value.ToString())
        {
            case "0":
@@ -156,9 +157,10 @@
                    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 == "任务号");
@@ -169,13 +171,15 @@
                        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();
@@ -229,20 +233,30 @@
                    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;
                    }
                    
@@ -285,27 +299,34 @@
                    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(为了防止上次任务坐标没被覆盖)
@@ -325,6 +346,7 @@
                            carTask2.Status = TaskStatusEnum.Doing;
                            carTask2.CarTaskNo = carTaskNo;
                            _db.Updateable(carTask2).ExecuteCommand();
                            //清除小车空闲时间
                            var taskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = carTask2.TaskNo,
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();
Admin.NET/WCS.Application/Util/FourWayCarUtil.cs
@@ -14,16 +14,67 @@
{
    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))
        {
@@ -174,25 +225,41 @@
                    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;