Administrator
2025-06-10 13a442afefdddf1ec9ecd1e22c81735bf5c6a465
修改问题
6个文件已修改
256 ■■■■ 已修改文件
Admin.NET/WCS.Application/Enum/FourWayCarEnum.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/OpenApi/OpenApi.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/ModbusUtil.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCService.cs 186 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Util/FourWayCarUtil.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Enum/FourWayCarEnum.cs
@@ -81,7 +81,7 @@
    /// 健康电量 低于此电量 且无任务时去充电
    /// </summary>
    [Description("健康电量")]
    Dl2 = 75,
    Dl2 = 60,
    
}
Admin.NET/WCS.Application/OpenApi/OpenApi.cs
@@ -98,7 +98,8 @@
            throw Oops.Bah("任务已存在!");
        }
        var listTask = new List<WcsTask>();
        foreach (var models in modelList)
        var list = modelList.OrderBy(m => m.Order).ThenBy(m => m.TaskNo).ToList();
        foreach (var models in list)
        {
            if (models.TaskType == "0")
            {
@@ -125,6 +126,7 @@
                EndLocate = models.EndLocate,
                EndRoadway = models.EndRoadway,
                PalletNo = models.PalletNo,
                CreateTime = DateTime.Now
            };
            // 若非AGV任务增加任务ID
@@ -133,9 +135,9 @@
                taskAdd.TaskId = FourWayCarUtil.GetTaskId(); 
            }
            listTask.Add(taskAdd);
            await _db.Insertable(taskAdd).ExecuteCommandAsync();
        }
        await _db.Insertable(listTask).ExecuteCommandAsync();
    }
    /// <summary>
    /// WCS接受WMS下发的任务(单条任务)
Admin.NET/WCS.Application/PLC/ModbusUtil.cs
@@ -1,4 +1,5 @@
using IoTClient;
using Furion.Logging;
using IoTClient;
using IoTClient.Clients.Modbus;
using IoTClient.Common.Enums;
using IoTClient.Enums;
@@ -270,4 +271,37 @@
                return new IoTClient.Result();
        }
    }
    /// <summary>
    /// 循环写入PLC值(并读取值判断和写入的值是否一致,写入控制字不能用此方法)
    /// </summary>
    public IoTClient.Result SetDBValueRepeat(PLCDataTypeEnum PosType, string Pos, string Value)
    {
        IoTClient.Result _result = new IoTClient.Result();
        int setCount = 0;//写入次数
        while (setCount < 5)
        {
            _result = this.SetDBValue(PosType, Pos, Value);//写入值
            //累计写入次数
            setCount++;
            if (_result.IsSucceed)
            {
                //读取写入的值
                var (res, val) = GetDBValue(PosType, Pos);
                if (val.ToString() == Value)
                {
                    //读取的值和写入的值一致,直接跳出循环
                    break;
                }
            }
        }
        //写入日志
        Log.Information($"写入PLC,Pos:{Pos},Value:{Value},setCount:{setCount}");
        return _result;
    }
}
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -39,6 +39,10 @@
                    AGV(mod);                                       // AGV调度
                    break;
                case PLCTypeEnum.ShuttleCar: //穿梭车
                    //if (mod.PlcIdIP == "10.26.254.28")
                    //{
                    //    break;
                    //}
                    ShuttleCar(mod);
                    break;
                case PLCTypeEnum.RobotPalletizer:
@@ -222,33 +226,38 @@
                                    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 modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text);
                                        var modConn = new PLCUtil(modPlc);
                                        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();
                                            //modConn.Close();
                                            return;//放货工位没有读取成功或不是空闲
                                        }
                                        
                                        var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "740");
                                        if (!plcResult.IsSucceed)
                                        {
                                            modConn.Close();
                                            //modConn.Close();
                                            return;
                                        }
                                        //添加任务明细
@@ -260,17 +269,19 @@
                                            InteractiveMsg = $"写入指令740:托盘到达{modFinshTask.EndRoadway}"
                                        };
                                        _db.Insertable(taskMonitor).ExecuteCommand();
                                        modConn.Close();
                                    }
                                    #endregion
                                }
                                else
                                {
                                        //改变任务状态
                                    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")
                                    {
@@ -287,6 +298,54 @@
                                        _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>());
                                    }
                                }
                                
                                //判断任务是否充电任务,下发开始充电命令
@@ -477,9 +536,21 @@
                        }
                    }
                    //小车状态
                    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>();
                    //获取小车任务号
@@ -494,7 +565,7 @@
                    }
                    var modWriteTask = modDevice.listStation.FirstOrDefault(s => s.Text == "写入任务号");
                    listResult.Add(plcConn.SetDBValue(modWriteTask.PosType, modWriteTask.PlcPos, carTaskNo.ToString()));
                    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");
@@ -528,19 +599,19 @@
                        var epathz = ePath.Substring(4, 2);
                        var epathn = ePath.Substring(6, 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));
                        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.SetDBValue(modNodeX.PosType, posX++.ToString(), "0"));
                        listResult.Add(plcConn.SetDBValue(modNodeY.PosType, posY++.ToString(), "0"));
                        listResult.Add(plcConn.SetDBValue(modNodeZ.PosType, posZ++.ToString(), "0"));
                        listResult.Add(plcConn.SetDBValue(modNodeStatus.PosType, posStatus++.ToString(), "0"));
                        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))
                    {
@@ -552,28 +623,29 @@
                            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 modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text);
                                var modConn = new PLCUtil(modPlc);
                                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)
                                if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) == 720)
                                {
                                    modConn.Close();
                                    return;//放货工位没有读取成功或不是空闲
                                }
                                var listResultcon = new List<Result>();
                                //任务号与托盘条码
@@ -593,7 +665,7 @@
                                    var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "730");
                                    if (!plcResult.IsSucceed)
                                    {
                                        modConn.Close();
                                            //modConn.Close();
                                        return;
                                    }
                                    //添加任务明细
@@ -606,8 +678,12 @@
                                    };
                                    _db.Insertable(taskMonitor2).ExecuteCommand();
                                }
                                }
                                else if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 730)
                                {
                                    return;
                                }
                                modConn.Close();
                            }
@@ -1196,12 +1272,12 @@
                            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>());
                        //// 改变任务状态
                        //taskInfo.Status = TaskStatusEnum.Complete;
                        //taskInfo.FinishDate = DateTime.Now;
                        ////modTask.Levels = 999;
                        //_db.Updateable(taskInfo).ExecuteCommand();
                        //HubUtil.PublicTask(taskInfo.Adapt<WcsTaskOutput>());
                        // 插入任务明细 
                        var modInsertTaskMonitor = new WcsTaskMonitor()
                        {
@@ -1214,27 +1290,27 @@
                            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));
                            }
                        }
                        //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();
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -332,7 +332,7 @@
                        Thread.Sleep(5000);
                        Thread.Sleep(2000);
                    }
                    catch (OperationCanceledException)
                    {
@@ -407,29 +407,31 @@
                        var text = "";
                        var devStation = "";
                        var ip = "";
                        var carcon = new carConverModel();
                        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 modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text);
                            var modConn = new PLCUtil(modPlc);
                            //var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text);
                            //var modConn = new PLCUtil(modPlc);
                            var modConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == ip);
                            var modDevice = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation);
                            var (plcResult, palletVal) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos);
                            if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 720)
                            {
                                continue;//放货工位没有读取成功或不是空闲
                            }
                            modConn.Close();
                            var gongwei = carcon.conveyorRuKu[endLocate];
                            //判断任务
@@ -493,6 +495,12 @@
                                        break; //暂缓分配,防止同层小车关机或失联导致阻挡路径
                                    }
                                }
                                var modCarPall = plcPosition.FirstOrDefault(s => s.Text == "托盘检测");
                                var (resultPall, valuePall) = modbusUtil.GetDBValue(modCarPall.PosType, modCarPall.PlcPos);
                                if (resultPall.IsSucceed && valuePall  == 1)  //1有托盘 2无托盘
                                {
                                    break; //暂缓分配
                                }
                                //小车空闲加入集合
                                if (value == 1)
                                {
Admin.NET/WCS.Application/Util/FourWayCarUtil.cs
@@ -26,6 +26,10 @@
    /// <returns></returns>
    public static List<CarModel> GetCarPathUp(List<CarModel> list, int moveType)
    {
        if (list == null)
        {
            return null;
        }
        for (int i = 0; i < list.Count; i++)
        {
            if (i >= 0 && i < list.Count - 1)
@@ -491,7 +495,7 @@
                if (current.Equals(end))
                {
                    Log.Error(ReconstructPath(cameFrom, current).ToString());
                    Log.Error("小车路径分配:" +ReconstructPath(cameFrom, current).ToString());
                    return ReconstructPath(cameFrom, current);
                }