Administrator
2025-06-10 13a442afefdddf1ec9ecd1e22c81735bf5c6a465
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -1,8 +1,11 @@
using Admin.NET.Core.Service;
using AngleSharp.Io;
using COSXML.Network;
using DocumentFormat.OpenXml.Bibliography;
using DocumentFormat.OpenXml.Drawing;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Wordprocessing;
using Elastic.Clients.Elasticsearch.Snapshot;
using Furion.Logging;
using IoTClient;
using NewLife.Reflection;
@@ -25,6 +28,7 @@
        try
        {
            var mod = sender as WcsDeviceDto;
            //Console.WriteLine($"{mod.Text}值为" + mod.Value);
            switch (mod.Type)
            {
@@ -35,6 +39,10 @@
                    AGV(mod);                                       // AGV调度
                    break;
                case PLCTypeEnum.ShuttleCar: //穿梭车
                    //if (mod.PlcIdIP == "10.26.254.28")
                    //{
                    //    break;
                    //}
                    ShuttleCar(mod);
                    break;
                case PLCTypeEnum.RobotPalletizer:
@@ -70,7 +78,7 @@
                    TaskNo = _taskService.GetTaskCode(),
                    TaskType = TaskTypeEnum.Move,
                    Type = PLCTypeEnum.AGV,
                    StartLocate = AGVStorageUtil.GetPalletOutStorage(),
                    StartLocate = "",
                    EndLocate = AGVStaionEnum.D1.ToString(),
                    PalletNo = "",
                    Status = TaskStatusEnum.Wait,
@@ -170,68 +178,187 @@
                        int valueTaskStr = Convert.ToInt32(valueTask);
                        //获取任务信息 根据  任务号、小车编号
                        var carTask = _db.Queryable<WcsCarTasks>().First(m=>m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.CarTaskNo == valueTaskStr && m.CarNo == modDevice.PlcIdIP);
                        if (carTask == null)
                        if (carTask != null)
                        {
                            //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)
                        {
                            break;//没有查询到总任务
                        }
                        if (carTask != null && carTask.Status != TaskStatusEnum.Complete)
                        {
                            carTask.Status = TaskStatusEnum.Complete;
                            carTask.UpdateTime = DateTime.Now;
                            _db.Updateable(carTask).ExecuteCommand();
                            //添加任务明细
                            var taskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = carTask.TaskNo,
                                PlcName = modDevice.Text,
                                InteractiveMsg = $"穿梭车反馈任务完成"
                            };
                            _db.Insertable(taskMonitor).ExecuteCommand();
                            //下发任务日志
                            
                            HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                        //获取路径2的任务 下发
                        carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == carTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status <= TaskStatusEnum.Doing).OrderBy(m => m.CreateTime).First();
                        //总任务下没有其他未执行小车的任务 变更总任务信息
                        if (carTaskNext == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
                        {
                            modFinshTask.Status = TaskStatusEnum.Complete;
                            modFinshTask.FinishDate = DateTime.Now;
                            _db.Updateable(modFinshTask).ExecuteCommand();
                            //判断任务是否充电任务,下发开始充电命令
                            if (modFinshTask.Levels == 888)
                            var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.TaskNo == carTask.TaskNo);
                            if (modFinshTask == null)
                            {
                                //写入开始充电
                                var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "充电命令");
                                plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "2");
                                break;//没有查询到总任务
                            }
                            if (carTask != null && carTask.Status != TaskStatusEnum.Complete)
                            {
                                carTask.Status = TaskStatusEnum.Complete;
                                carTask.UpdateTime = DateTime.Now;
                                _db.Updateable(carTask).ExecuteCommand();
                                //添加任务明细
                                var taskMonitor = new WcsTaskMonitor()
                                {
                                    TaskNo = carTask.TaskNo,
                                    PlcName = modDevice.Text,
                                    Status = TaskStatusEnum.Complete,
                                    InteractiveMsg = $"穿梭车反馈任务完成"
                                };
                                _db.Insertable(taskMonitor).ExecuteCommand();
                                //下发任务日志
                                HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
                            }
                            //获取路径2的任务 下发
                            carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == carTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status <= TaskStatusEnum.Doing).OrderBy(m => m.CreateTime).First();
                            //总任务下没有其他未执行小车的任务 变更总任务信息
                            if (carTaskNext == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
                            {
                                if (modFinshTask.TaskType == TaskTypeEnum.Out)
                                {
                                    //#region 任务变更成输送线任务
                                    //modFinshTask.Status = TaskStatusEnum.Wait;
                                    //modFinshTask.Type = PLCTypeEnum.ConveyorLine;
                                    //_db.Updateable(modFinshTask).ExecuteCommand();
                            //反馈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>());
                                    //#endregion
                                    #region 输送线 写入PLC 740
                                    var text = "";
                                    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 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();
                                            return;//放货工位没有读取成功或不是空闲
                                        }
                                        var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "740");
                                        if (!plcResult.IsSucceed)
                                        {
                                            //modConn.Close();
                                            return;
                                        }
                                        //添加任务明细
                                        var taskMonitor = new WcsTaskMonitor()
                                        {
                                            TaskNo = modFinshTask.TaskNo,
                                            PlcName = modDevice.Text,
                                            Status = TaskStatusEnum.Complete,
                                            InteractiveMsg = $"写入指令740:托盘到达{modFinshTask.EndRoadway}"
                                        };
                                        _db.Insertable(taskMonitor).ExecuteCommand();
                                        //改变任务状态
                                        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")
                                        {
                                            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>());
                                        }
                                    }
                                    #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>());
                                    }
                                }
                                //判断任务是否充电任务,下发开始充电命令
                                if (modFinshTask.Levels == 888)
                                {
                                    //写入开始充电
                                    var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "充电命令");
                                    plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "2");
                                }
                            }
                        }
                    }
                    
                    WcsTask modTask;
@@ -260,44 +387,53 @@
                    var modStationZ = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Z)");
                    var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos);
                    var carXYZ = valuex.ToString().PadLeft(2, '0') + valuey.ToString().PadLeft(2, '0') + valuez.ToString().PadLeft(2, '0');
                    if (modTask == null || carTaskNext == null)
                    if (modTask == null)
                    {
                        //读取小车电量
                        var modPosCarDl = modDevice.listStation.FirstOrDefault(s => s.Text == "电池电量");
                        var (resultDl, valueDl) = plcConn.GetDBValue(modPosCarDl.PosType, modPosCarDl.PlcPos);
                        if (resultDl.IsSucceed && valueDl < FourWayCarDLEnum.Dl)
                        if (resultDl.IsSucceed && valueDl < (int)FourWayCarDLEnum.Dl)
                        {
                            var endLocateCar = "";
                            if (valuez == 1)
                            {
                                endLocateCar = "210401";
                                endLocateCar = "011201";
                            }
                            else if (valuez == 2)
                            {
                                endLocateCar = "210402"; //011202
                                endLocateCar = "011202"; //
                            }
                            else
                            {
                                return; // 层数错误
                            }
                            //添加小车充电位置
                            WcsTask modCarTask = new WcsTask()
                            var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing);
                            if (getCdTask == null)
                            {
                                TaskNo = _taskService.GetTaskCode(),
                                TaskType = TaskTypeEnum.Move,
                                Type = PLCTypeEnum.ShuttleCar,
                                StartLocate = carXYZ,
                                EndLocate = endLocateCar,
                                PalletNo = "",
                                Status = TaskStatusEnum.Wait,
                                Levels = 888, //充电等级优先任务等级
                                Origin = "WCS",
                                CarIp = modDevice.PlcIdIP
                            };
                            _db.Insertable(modCarTask).ExecuteCommand();
                            HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
                                var (resultDlLock, valueDlLock) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos);
                                if (resultDlLock.IsSucceed && valueDlLock!=3 && carXYZ != endLocateCar)
                                {
                                    //添加小车充电位置
                                    WcsTask modCarTask = new WcsTask()
                                    {
                                        TaskNo = _taskService.GetTaskCode(),
                                        TaskType = TaskTypeEnum.Move,
                                        Type = PLCTypeEnum.ShuttleCar,
                                        StartLocate = carXYZ,
                                        EndLocate = endLocateCar,
                                        PalletNo = "",
                                        Status = TaskStatusEnum.Wait,
                                        Levels = 888, //充电等级优先任务等级
                                        Origin = "WCS",
                                        CarIp = modDevice.PlcIdIP
                                    };
                                    _db.Insertable(modCarTask).ExecuteCommand();
                                    HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
                                }
                            }
                        }
                        else if(resultDl.IsSucceed && valueDl < FourWayCarDLEnum.Dl2)
                        else if(resultDl.IsSucceed && valueDl < (int)FourWayCarDLEnum.Dl2)
                        {
                            //判断小车是否有空闲时间记录 没有:添加  有:判断当前时间与记录时间是否满足5分钟 满足:添加让小车去充电任务
                            var carTime = _db.Queryable<WcsCarTime>().First(m => m.IsDelete == false && m.CarIp == modDevice.PlcIdIP);
@@ -338,22 +474,32 @@
                                        {
                                            return; // 层数错误
                                        }
                                        //添加小车充电位置
                                        WcsTask modCarTask = new WcsTask()
                                        var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing);
                                        if (getCdTask == null)
                                        {
                                            TaskNo = _taskService.GetTaskCode(),
                                            TaskType = TaskTypeEnum.Move,
                                            Type = PLCTypeEnum.ShuttleCar,
                                            StartLocate = carXYZ,
                                            EndLocate = endLocateCar,
                                            PalletNo = "",
                                            Status = TaskStatusEnum.Wait,
                                            Levels = 888, //充电等级优先任务等级
                                            Origin = "WCS",
                                            CarIp = modDevice.PlcIdIP
                                        };
                                        _db.Insertable(modCarTask).ExecuteCommand();
                                        HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
                                            var (resultDlLock, valueDlLock) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos);
                                            if (resultDlLock.IsSucceed && valueDlLock != 3 && carXYZ != endLocateCar)
                                            {
                                                //添加小车充电位置
                                                WcsTask modCarTask = new WcsTask()
                                                {
                                                    TaskNo = _taskService.GetTaskCode(),
                                                    TaskType = TaskTypeEnum.Move,
                                                    Type = PLCTypeEnum.ShuttleCar,
                                                    StartLocate = carXYZ,
                                                    EndLocate = endLocateCar,
                                                    PalletNo = "",
                                                    Status = TaskStatusEnum.Wait,
                                                    Levels = 888, //充电等级优先任务等级
                                                    Origin = "WCS",
                                                    CarIp = modDevice.PlcIdIP
                                                };
                                                _db.Insertable(modCarTask).ExecuteCommand();
                                                HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
                                            }
                                        }
                                    }
                                }
@@ -364,7 +510,10 @@
                        
                        return;
                    }
                    if (carTaskNext == null)
                    {
                        return;
                    }
                    if (carTaskNext.Status == TaskStatusEnum.Doing)
                    {
                        Thread.Sleep(3000);
@@ -386,12 +535,24 @@
                            return;//前置任务未完成
                        }
                    }
                    //小车状态
                    var (resultCar, valueCar) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos);
                    //先复位
                    var modRest = modDevice.listStation.FirstOrDefault(s => s.Text == "复位");
                    plcConn.SetDBValue(modRest.PosType, modRest.PlcPos, "1");
                    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>();
                        List<Result> listResult = new List<Result>();
                    //获取小车任务号
                    var carTaskNo = FourWayCarUtil.GetTaskNo();
@@ -404,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");
@@ -438,22 +599,97 @@
                        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))
                    {
                        if (modTask.TaskType == TaskTypeEnum.Out)
                        {
                            #region 输送线 写入PLC 730
                            var text = "";
                            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 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)
                                {
                                    var listResultcon = new List<Result>();
                                    //任务号与托盘条码
                                    var modPosConverTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "任务号");
                                    listResultcon.Add(modConn.SetPlcDBValueRepeat(modPosConverTask.PosType, modDeviceConver.DbNumber, modPosConverTask.PlcPos, modTask.TaskId.ToString()));
                                    var modPosConverPallet = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "托盘条码");
                                    listResultcon.Add(modConn.SetPlcDBValueRepeat(modPosConverPallet.PosType, modDeviceConver.DbNumber, modPosConverPallet.PlcPos, modTask.PalletNo.ToString()));
                                    // 起始工位、目的工位
                                    var modPosConverStrLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "起始工位");
                                    listResultcon.Add(modConn.SetPlcDBValueRepeat(modPosConverStrLocat.PosType, modDeviceConver.DbNumber, modPosConverStrLocat.PlcPos, modDeviceConver.StationNum));
                                    var modPosConverEndLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "目的工位");
                                    listResultcon.Add(modConn.SetPlcDBValueRepeat(modPosConverEndLocat.PosType, modDeviceConver.DbNumber, modPosConverEndLocat.PlcPos, modTask.EndLocate));
                                    if (listResultcon.All(s => s.IsSucceed))
                                    {
                                        var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "730");
                                        if (!plcResult.IsSucceed)
                                        {
                                            //modConn.Close();
                                            return;
                                        }
                                        //添加任务明细
                                        var taskMonitor2 = new WcsTaskMonitor()
                                        {
                                            TaskNo = carTaskNext.TaskNo,
                                            PlcName = modDevice.Text,
                                            Status = TaskStatusEnum.Complete,
                                            InteractiveMsg = $"写入指令730:工位是{modDeviceConver.StationNum}"
                                        };
                                        _db.Insertable(taskMonitor2).ExecuteCommand();
                                    }
                                }
                                else if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 730)
                                {
                                    return;
                                }
                            }
                            #endregion
                        }
                        var modStart = modDevice.listStation.FirstOrDefault(s => s.Text == "启动命令");
                        var result = plcConn.SetDBValue(modStart.PosType, modStart.PlcPos, "1");
                        if (result.IsSucceed)
@@ -461,11 +697,22 @@
                            carTaskNext.Status = TaskStatusEnum.Doing;
                            carTaskNext.CarTaskNo = carTaskNo;
                            _db.Updateable(carTaskNext).ExecuteCommand();
                            //清除小车空闲时间
                            var carTimeClear = _db.Queryable<WcsCarTime>().First(m=>m.IsDelete == false && m.CarIp == modDevice.PlcIdIP);
                            if (carTimeClear!= null)
                            {
                                carTimeClear.CarTime = null;
                                carTimeClear.UpdateTime = DateTime.Now;
                                _db.Updateable(carTimeClear).ExecuteCommand();
                            }
                            var taskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = carTaskNext.TaskNo,
                                PlcName = modDevice.Text,
                                Status = TaskStatusEnum.Complete,
                                InteractiveMsg = $"向穿梭车下发任务{carTaskNext.TaskNo}"
                            };
                            _db.Insertable(taskMonitor).ExecuteCommand();
@@ -540,14 +787,38 @@
        var ledText = "";
        switch (modDevice.Value.ToString())
        {
            case "120": //空闲,AGV可放货
                {
                    var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.IsComple == "1");
                    if (task != null)
                    {
                        //没有出库业务
                        var res = new HttpService().GenAgvContinueTask(task.TaskNo).Result;
                        if (res.code == "0")
                        {
                            var modTaskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = task.TaskNo,
                                PlcId = modDevice.modPlc.Id,
                                PlcName = modDevice.modPlc.IP,
                                InteractiveMsg = "向AGV小车下发继续执行任务"
                            };
                            _db.Insertable(modTaskMonitor).ExecuteCommand();
                            //下发任务日志
                            HubUtil.PublicTask(task.Adapt<WcsTaskOutput>());
                            HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                    }
                }
                break;
            case "320":
                {
                    // 申请密集库组
                    string strMsg = "";
                    string taskModel = "";
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
@@ -568,7 +839,7 @@
                        }
                        // 写入输送线退回指令
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                        var ret = plcConn.SetPlcDBValueRepeat(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                        if (ret.IsSucceed)
                        {
                            plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350");
@@ -589,7 +860,7 @@
                        }
                        // 写入输送线退回指令
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                        var ret = plcConn.SetPlcDBValueRepeat(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                        if (ret.IsSucceed)
                        {
                            plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350");
@@ -600,7 +871,7 @@
                    var http = new HttpService();
                    string TaskNo = "", EndLocate = "";
                    strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, "1", ref EndLocate, ref TaskNo);
                    strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, ref EndLocate, ref TaskNo);
                    if (!strMsg.Contains("-1"))
                    {
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
@@ -664,7 +935,7 @@
                        }
                        // 写入输送线退回指令
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                        var ret = plcConn.SetPlcDBValueRepeat(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                        if (ret.IsSucceed)
                        {
                            plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350");
@@ -675,7 +946,7 @@
            case "330":
                {
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
@@ -701,7 +972,7 @@
                    }
                    // 获取四项车取货工位
                    string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, modDevice.StationNum);
                    string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, modDevice.StationNum.PadLeft(3,'0'));
@@ -709,17 +980,17 @@
                    var listResult = new List<Result>();
                    // 任务号、任务类型、托盘号
                    var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号");
                    listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskId.ToString()));
                    listResult.Add(plcConn.SetPlcDBValueRepeat(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskId.ToString()));
                    var modPosTaskType = modDevice.listStation.FirstOrDefault(s => s.Text == "任务类型");
                    var taskTypeStr = (int)modTask.TaskType;
                    listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString()));
                    var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘码");
                    listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
                    listResult.Add(plcConn.SetPlcDBValueRepeat(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString()));
                    var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘条码");
                    listResult.Add(plcConn.SetPlcDBValueRepeat(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
                    // 起始工位、目的工位
                    var modPosStrLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "起始工位");
                    listResult.Add(plcConn.SetPlcDBValue(modPosStrLocat.PosType, modDevice.DbNumber, modPosStrLocat.PlcPos, modDevice.StationNum));
                    listResult.Add(plcConn.SetPlcDBValueRepeat(modPosStrLocat.PosType, modDevice.DbNumber, modPosStrLocat.PlcPos, modDevice.StationNum));
                    var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工位");
                    listResult.Add(plcConn.SetPlcDBValue(modPosEndLocat.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, endLocatVlue));
                    listResult.Add(plcConn.SetPlcDBValueRepeat(modPosEndLocat.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, endLocatVlue));
                    if (listResult.All(s => s.IsSucceed))
@@ -764,25 +1035,25 @@
                {
                    // 申请储位 更新入库任务(储位地址) 630
                    var strMsg = "";
                    var taskModel = "";
                    //// 根据工位号获取巷道号
                    //var roadway = PLCCommon.GetRoadwayByStation(modDevice.StationNum);
                    //if (roadway == "")
                    //{
                    //    break;
                    //}
                    // 获取工位任务号信息
                    var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                    var (resTask, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                    if (!resTask.IsSucceed)
                    {
                        break;
                    }
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
                        break;
                    }
                    var http = new HttpService();
                    string TaskNo = "";
                    // 向WMS申请储位信息
                    strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, "roadway", ref TaskNo);
                    strMsg = new HttpService().RequestLocate(palletVal, taskVal,ref TaskNo);
                    if (!strMsg.Contains("-1"))
                    {
@@ -989,22 +1260,57 @@
                    {
                        var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                        var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                        var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                        var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                        var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos);
                        var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位");
                        var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos);
                        int taskNoVal = Convert.ToInt32(taskVal);
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskId == taskNoVal && w.TaskType == TaskTypeEnum.Out);
                        if (taskInfo == null)
                        {
                            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>());
                        // 插入任务明细 
                        var modInsertTaskMonitor = new WcsTaskMonitor()
                        {
                            TaskNo = taskVal,
                            TaskNo = taskInfo.TaskNo,
                            PlcId = modDevice.Id,
                            PlcName = modDevice.Text,
                            InteractiveMsg = $"写入指令430:托盘到达{modDevice.StationNum}工位",
                            PalletNo = palletVal,
                            Status = TaskStatusEnum.Complete,
                            StartLocat = starVal,
                            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));
                        //    }
                        //}
                        // 插入交互日志
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
@@ -1012,8 +1318,6 @@
                        // 通知任务界面任务已存在更新 请更新界面
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == modInsertTaskMonitor.TaskNo);
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.EndLocate).Select(s => s.LedIP).First();
                        // led显示内容
@@ -1039,78 +1343,45 @@
            case "440":
                {
                    #region 拣选完成,托盘离开工位
                    var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                    var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                    var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos);
                    var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位");
                    var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos);
                    // 写入450
                    var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "450");
                    if (ret.IsSucceed)
                    {
                        var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                        var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                        var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                        var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos);
                        var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位");
                        var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos);
                        string tasknoVal = taskVal.ToString();
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false);
                        int tasknoVal = Convert.ToInt32(taskVal);
                        var modTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.TaskId == tasknoVal);
                        if (modTask == null)
                        {
                            Log.Error(string.Format("输送线440:未找到对应的任务。"));
                            break;
                        }
                        // 改变任务状态
                        modTask.Status = TaskStatusEnum.Complete;
                        modTask.FinishDate = DateTime.Now;
                        modTask.Levels = 999;
                        _db.Updateable(modTask).ExecuteCommand();
                        HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                        // 插入任务明细 
                        var modInsertTaskMonitor = new WcsTaskMonitor()
                        {
                            TaskNo = modTask.TaskNo,
                            PlcId = modDevice.Id,
                            PlcName = modDevice.Text,
                            InteractiveMsg = $"写入指令450:{modDevice.StationNum}出库完成",
                            InteractiveMsg = $"写入指令450:{modDevice.StationNum}托盘离开工位",
                            PalletNo = palletVal,
                            Status = TaskStatusEnum.Complete,
                            StartLocat = starVal.ToString(),
                            EndLocat = modDevice.StationNum,
                        };
                        if (modTask.Origin == "WMS")
                        {
                            // 反馈WMS
                            var requestMode = new TaskRequestWMS()
                            {
                                TaskNo = modTask.TaskNo + modTask.EndLocate,
                                PalletNo = modTask.PalletNo,
                                TaskType = ((int)TaskTypeEnum.Out).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();
                        // 通知任务界面任务已存在更新 请更新界面
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        // led显示内容
                        var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId == modDevice.PlcId);
                        ledText += $"出库完成\n\n";
                        ledText += $"任务号:{modTask.TaskNo}\n";
                        ledText += $"托盘号:{modTask.PalletNo}\n\n";
                        ledText += $"起始位:{modTask.StartRoadway + " " + modTask.StartLocate}\n";
                        ledText += $"目标位:{modTask.EndRoadway + " " + modTask.EndLocate}";
                        LedDisplay(ledDevice.LedIP, ledText);
                    }
                    #endregion
                }
@@ -1128,56 +1399,76 @@
    private static void AGV(WcsDeviceDto modDevice)
    {
        
        //这里找出来AGV待执行的任务、按照优先级下发一个任务给AGV
        var listTask = _db.Queryable<WcsTask>().Where(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.Type == PLCTypeEnum.AGV).OrderBy(s => s.Levels).ToList();
        if (listTask.Count == 0)
        //这里找出来AGV待执行的任务、按照优先级、创建时间下发一个任务给AGV
        var modTask = _db.Queryable<WcsTask>().Where(s => s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.AGV).OrderBy(s => new { s.Levels ,s.CreateTime}).First();
        if (modTask == null)
        {
            return;
        }
        
        foreach (var modTask in listTask)
        if (_db.Queryable<WcsTask>().Any(s => s.EndLocate == modTask.EndLocate && s.IsDelete == false && s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV ))
        {
            if (_db.Queryable<WcsTask>().Any(s => s.EndLocate == modTask.EndLocate && s.IsDelete == false && s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV ))
            {
                continue; // 有目的位置一致且正在执行的任务
            }
            //下发AGV任务
            AgvTaskInput input = new AgvTaskInput()
            {
                ReqCode = modTask.Id.ToString(),
                TaskCode = modTask.TaskNo,
                CtnrCode = modTask.PalletNo,
                PositionCodePath = new List<PositionCodePathItem>()
            {
                new PositionCodePathItem(){ PositionCode = modTask.StartLocate },
                new PositionCodePathItem(){ PositionCode = modTask.EndLocate }
            }
            };
            input.TaskTyp = "1" + modTask.StartLocate.Substring(0, 1) + modTask.EndLocate.Substring(0, 1);
            var response = new HttpService().GenAgvSchedulingTask(input).Result;
            if (response.code == "0")
            {
                AGVStatus = true;
                modTask.Status = TaskStatusEnum.Doing;
                _db.Updateable(modTask).ExecuteCommand();
                var modTaskMonitor = new WcsTaskMonitor()
                {
                    TaskNo = modTask.TaskNo,
                    PlcId = modDevice.modPlc.Id,
                    PlcName = modDevice.modPlc.IP,
                    InteractiveMsg = "向AGV小车下发任务"
                };
                _db.Insertable(modTaskMonitor).ExecuteCommand();
            return; // 有目的位置一致且正在执行的任务
        }
                //下发任务日志
                HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
            }
            Console.WriteLine(response.ToJson());
        //下发AGV任务
        var taskTypeModel = AGVStorageUtil.GetTaskModle(modTask.StartLocate, modTask.EndLocate,out string type1,out string type2, out string jiebo);
        if (string.IsNullOrWhiteSpace(taskTypeModel))
        {
            Console.WriteLine("获取AGV任务模板失败:请核实任务起始目标储位是否正确");
            return;
        }
        AgvTaskSend taskModel = new AgvTaskSend();
        taskModel.robotTaskCode = modTask.TaskNo;
        taskModel.taskType = taskTypeModel;
        if (jiebo == "")
        {
            taskModel.targetRoute = new List<targetRoute>()
            {
                new targetRoute(){seq = 0,type = type1,code = modTask.StartLocate},
                new targetRoute(){seq = 1,type = type2,code = modTask.EndLocate}
            };
        }
        else
        {
            taskModel.targetRoute = new List<targetRoute>()
            {
                new targetRoute(){seq = 0,type = type1,code = modTask.StartLocate},
                new targetRoute(){seq = 1,type = "ZONE",code = jiebo},
                new targetRoute(){seq = 2,type = type2,code = modTask.EndLocate}
            };
        }
        taskModel.extra = new extra()
        {
            carrierInfo = new List<carrierInfo>()
            {
                new carrierInfo(){ carrierType = "TP",carrierCode = modTask.PalletNo}
            }
        };
        var response = new HttpService().GenAgvSendTask(taskModel).Result;
        if (response.code == "SUCCESS")
        {
            modTask.Status = TaskStatusEnum.Doing;
            _db.Updateable(modTask).ExecuteCommand();
            var modTaskMonitor = new WcsTaskMonitor()
            {
                TaskNo = modTask.TaskNo,
                PlcId = modDevice.modPlc.Id,
                PlcName = modDevice.modPlc.IP,
                InteractiveMsg = "向AGV小车下发任务"
            };
            _db.Insertable(modTaskMonitor).ExecuteCommand();
            //下发任务日志
            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
            HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
        }
        //Console.WriteLine(response.ToJson());
        Thread.Sleep(3000);
        return;
    }
    /// <summary>
@@ -1222,6 +1513,11 @@
    private static void Test(WcsDeviceDto modDevice)
    {
        var ledText = $"申请入库失败\n\n";
        ledText += $"托盘号:T2300001\n";
        ledText += $"入库任务已锁定,请解锁后重试!\n";
        LedDisplay("10.26.254.31", ledText);
        //卷帘门2申请打开
        //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1152", "10");
        //卷帘门2申请关闭
@@ -1233,7 +1529,7 @@
        //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1154", "30");
        //C口AGV放托盘完成申请入库
        var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1156", "100");
        //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1156", "100");
        ////写死测试读string
        //var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64");