chengsc
2025-04-29 9a7c4fea85f85824dddeac9e6ce6ebb75ccee679
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -6,6 +6,7 @@
using Furion.Logging;
using IoTClient;
using NewLife.Reflection;
using SixLabors.ImageSharp.ColorSpaces;
using WCS.Application.Entity;
using WCS.Application.Util;
@@ -146,6 +147,7 @@
    private static void ShuttleCar(WcsDeviceDto modDevice)
    {
        var plcConn = modDevice.modbusUtil;
        // 四向车状态 0:未空闲,1:空闲,2:异常  3:充电中
        switch (modDevice.Value.ToString())
        {
            case "0":
@@ -156,9 +158,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:充电中
                    WcsCarTasks carTask2 = null;//null 新任务  not null 路径2任务
                    //判断读取任务状态是否成功 并且任务状态是1 0:无任务,1:任务完成,2:任务取消,3:任务暂停,4:任务异常 5:任务执行中
                    WcsCarTasks carTaskNext = null;//null 新任务  not null 当前小车&&当前任务 下一节任务
                    if (resultTaskStatus.IsSucceed && valueTaskStatus == 1)
                    {
                        var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号");
@@ -167,92 +170,220 @@
                        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)
                        {
                            return;//没有找到任务
                        }
                        var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.TaskNo == carTask.TaskNo);
                        if (modFinshTask == null)
                        {
                            return;//没有查询到总任务
                        }
                        //获取路径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();
                        if (carTask != null && carTask.Status != TaskStatusEnum.Complete)
                        {
                            carTask.Status = TaskStatusEnum.Complete;
                            carTask.UpdateTime = DateTime.Now;
                            _db.Updateable(carTask).ExecuteCommand();
                            //添加任务明细
                            var taskMonitor = new WcsTaskMonitor()
                            //var modRests = modDevice.listStation.FirstOrDefault(s => s.Text == "复位");
                            //plcConn.SetDBValue(modRests.PosType, modRests.PlcPos, "1");//没有找到任务  复位
                            var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.TaskNo == carTask.TaskNo);
                            if (modFinshTask == null)
                            {
                                TaskNo = carTask.TaskNo,
                                PlcName = modDevice.Text,
                                InteractiveMsg = $"穿梭车反馈任务完成"
                            };
                            _db.Insertable(taskMonitor).ExecuteCommand();
                            //下发任务日志
                                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>());
                                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 modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "充电命令");
                                    plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "2");
                                }
                                //反馈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>());
                            }
                        }
                        //没有路径2的任务 变更总任务信息
                        if (carTask2 == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
                    }
                    WcsTask modTask;
                    //要下发路径2任务
                    if (carTaskNext != null)
                    {
                        modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTaskNext.TaskNo && s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.CarIp == modDevice.PlcIdIP);
                        carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First();
                    }
                    else
                    {
                        // 获取任务信息
                        modTask = _db.Queryable<WcsTask>().Where(s => s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.CarIp == modDevice.PlcIdIP).OrderBy(m => m.Levels).OrderBy(m => m.CreateTime).First();
                        if (modTask != null)
                        {
                            modFinshTask.Status = TaskStatusEnum.Complete;
                            modFinshTask.FinishDate = DateTime.Now;
                            _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>());
                            carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First();
                        }
                    }
                    //读取小车位置
                    var modStationX = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(X)");
                    var (resultx, valuex) = plcConn.GetDBValue(modStationX.PosType, modStationX.PlcPos);
                    var modStationY = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Y)");
                    var (resulty, valuey) = plcConn.GetDBValue(modStationY.PosType, modStationY.PlcPos);
                    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();
                    //要下发路径2任务
                    if (carTask2 == null)
                    var carXYZ = valuex.ToString().PadLeft(2, '0') + valuey.ToString().PadLeft(2, '0') + valuez.ToString().PadLeft(2, '0');
                    if (modTask == null)
                    {
                        modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTask2.TaskNo && s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar);
                        //读取小车电量
                        var modPosCarDl = modDevice.listStation.FirstOrDefault(s => s.Text == "电池电量");
                        var (resultDl, valueDl) = plcConn.GetDBValue(modPosCarDl.PosType, modPosCarDl.PlcPos);
                        if (resultDl.IsSucceed && valueDl < (int)FourWayCarDLEnum.Dl)
                        {
                            var endLocateCar = "";
                            if (valuez == 1)
                            {
                                endLocateCar = "210401";
                            }
                            else if (valuez == 2)
                            {
                                endLocateCar = "210402"; //011202
                            }
                            else
                            {
                                return; // 层数错误
                            }
                            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)
                            {
                                //添加小车充电位置
                                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 < (int)FourWayCarDLEnum.Dl2)
                        {
                            //判断小车是否有空闲时间记录 没有:添加  有:判断当前时间与记录时间是否满足5分钟 满足:添加让小车去充电任务
                            var carTime = _db.Queryable<WcsCarTime>().First(m => m.IsDelete == false && m.CarIp == modDevice.PlcIdIP);
                            if (carTime == null)
                            {
                                var carTimeAdd = new WcsCarTime()
                                {
                                    CarIp = modDevice.PlcIdIP,
                                    CarTime = DateTime.Now
                                };
                                _db.Insertable(carTimeAdd).ExecuteCommand();
                            }
                            else
                            {
                                if (carTime.CarTime == null)
                                {
                                    carTime.CarTime = DateTime.Now;
                                    carTime.UpdateTime = DateTime.Now;
                                    _db.Updateable(carTime).ExecuteCommand();
                                }
                                else
                                {
                                    var date1 = DateTime.Now;
                                    var data2 = (DateTime)carTime.CarTime;
                                    TimeSpan interval = date1 - data2;
                                    if (interval.TotalMinutes >= 5)
                                    {
                                        var endLocateCar = "";
                                        if (valuez == 1)
                                        {
                                            endLocateCar = "210401";
                                        }
                                        else if (valuez == 2)
                                        {
                                            endLocateCar = "210402";
                                        }
                                        else
                                        {
                                            return; // 层数错误
                                        }
                                        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)
                                        {
                                            //添加小车充电位置
                                            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>());
                                        }
                                    }
                                }
                        carTask2= _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).OrderBy(m => m.CreateTime).First();
                            }
                        }
                        return;
                    }
                    //return;
                    if (modTask == null || carTask2 == null)
                    if (carTaskNext == null)
                    {
                        return;
                    }
                    if (carTask2.Status == TaskStatusEnum.Doing)
                    if (carTaskNext.Status == TaskStatusEnum.Doing)
                    {
                        Thread.Sleep(3000);
                        return;
                    }
                    //判断当前任务是否还有前置任务未完成
                    var preStrs = carTask2.PreId.Split(';');
                    var preStrs = carTaskNext.PreId.Split(';');
                    foreach (var preStr in preStrs)
                    {
                        if (string.IsNullOrWhiteSpace(preStr))
@@ -266,6 +397,7 @@
                            return;//前置任务未完成
                        }
                    }
                    //先复位
                    var modRest = modDevice.listStation.FirstOrDefault(s => s.Text == "复位");
                    plcConn.SetDBValue(modRest.PosType, modRest.PlcPos, "1");
@@ -273,7 +405,15 @@
                    List<Result> listResult = new List<Result>();
                    //获取小车任务号
                    var carTaskNo = FourWayCarUtil.GetTaskNo();
                    //判断任务是否充电任务
                    if (modTask.Levels == 888)
                    {
                        //写入充电命令
                        var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "充电命令");
                        listResult.Add(plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "1"));
                    }
                    var modWriteTask = modDevice.listStation.FirstOrDefault(s => s.Text == "写入任务号");
                    listResult.Add(plcConn.SetDBValue(modWriteTask.PosType, modWriteTask.PlcPos, carTaskNo.ToString()));
@@ -285,27 +425,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(';');
                    var execuPath = carTaskNext.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(为了防止上次任务坐标没被覆盖)
@@ -322,14 +469,22 @@
                        var result = plcConn.SetDBValue(modStart.PosType, modStart.PlcPos, "1");
                        if (result.IsSucceed)
                        {
                            carTask2.Status = TaskStatusEnum.Doing;
                            carTask2.CarTaskNo = carTaskNo;
                            _db.Updateable(carTask2).ExecuteCommand();
                            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 = carTask2.TaskNo,
                                TaskNo = carTaskNext.TaskNo,
                                PlcName = modDevice.Text,
                                InteractiveMsg = $"向穿梭车下发任务{carTask2.TaskNo}"
                                InteractiveMsg = $"向穿梭车下发任务{carTaskNext.TaskNo}"
                            };
                            _db.Insertable(taskMonitor).ExecuteCommand();
                            //下发任务日志
@@ -400,226 +555,588 @@
    {
        var plcConn = modDevice.PLCUtil;
        var ledText = "";
        switch (modDevice.Value.ToString())
        {
            case "20":
            case "320":
                {
                    //小车请求开卷帘门 这里改成海康直接调用模块 这里不需要了
                    string Devicelndex = "";
                    if (modDevice.Text == "2号卷帘门")
                        Devicelndex = "222";
                    else if (modDevice.Text == "3号卷帘门")
                        Devicelndex = "111";
                    var modCallBack = sysCacheService.Get<AGVApplyLockInput>("OpenDoor" + Devicelndex);
                    if (modCallBack != null)
                    // 申请密集库组
                    string strMsg = "";
                    string taskModel = "";
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
                        var modAgvDevice = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == "AGV");
                        AgvNotifyInput input = new AgvNotifyInput()
                        break;
                    }
                    var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工位");
                    //判断入库锁定是否打开
                    if (PLCTaskAction.boEnterLock)
                    {
                        var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                        if (res350.IsSucceed && palletVal350 != "350")
                        {
                            ActionStatus = "1",
                            DeviceIndex = Devicelndex,
                            UUID = modCallBack.UUID,
                        };
                        var response = new HttpService().NotifyExcuteResultInfo(input).Result;
                        if (response.code == 0)
                            ledText += $"申请入库失败\n\n";
                            ledText += $"托盘号:{palletVal}\n";
                            ledText += $"入库任务已锁定,请解锁后重试!\n";
                            LedDisplay(modDevice.LedIP, ledText);
                        }
                        // 写入输送线退回指令
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                        if (ret.IsSucceed)
                        {
                            sysCacheService.Remove("OpenDoor" + Devicelndex);
                            plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350");
                        }
                        break;
                    }
                    if (palletVal == null)
                    {
                        var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                        if (res350.IsSucceed && palletVal350 != "350")
                        {
                            ledText += $"申请入库失败\n\n";
                            ledText += $"托盘号:{palletVal}\n";
                            ledText += $"扫描托盘号失败!\n";
                            LedDisplay(modDevice.LedIP, ledText);
                        }
                        // 写入输送线退回指令
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                        if (ret.IsSucceed)
                        {
                            plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350");
                        }
                        break;
                    }
                    var http = new HttpService();
                    string TaskNo = "", EndLocate = "";
                    strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, "1", ref EndLocate, ref TaskNo);
                    if (!strMsg.Contains("-1"))
                    {
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo);
                        modDevice.LedIP = _db.Queryable<WcsDevice>()
                            .Where(w => w.StationNum == taskInfo.StartLocate)
                            .Select(s => s.LedIP).First();
                        // 写入330
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "330");
                        if (ret.IsSucceed)
                        {
                            // 插入任务明细
                            var modInsertTaskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = TaskNo,
                                PlcId = modDevice.Id,
                                PlcName = modDevice.Text,
                                InteractiveMsg = $"写入指令330:{modDevice.StationNum}工位申请巷道",
                                PalletNo = palletVal,
                                Status = TaskStatusEnum.Complete,
                                StartLocat = modDevice.StationNum,
                                EndLocat = EndLocate,
                            };
                            // 插入交互日志
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            // 通知任务界面任务已存在更新 请更新界面
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led显示内容
                            try
                            {
                                ledText += $"任务类型:{taskInfo.TaskType.GetDescription()}\n\n";
                                ledText += $"任务号:{taskInfo.TaskNo}\n";
                                ledText += $"托盘号:{taskInfo.PalletNo}\n\n";
                                ledText += $"起始位:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n";
                                ledText += $"目标位:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}";
                                LedDisplay(modDevice.LedIP, ledText);
                            }
                            catch (Exception ex)
                            {
                                Log.Error(ex.Message);
                            }
                        }
                    }
                    else
                    {
                        var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                        if (res350.IsSucceed && palletVal350 != "350")
                        {
                            ledText += $"申请入库失败\n\n";
                            ledText += $"托盘号:{palletVal}\n";
                            ledText += $"{strMsg}\n";
                            LedDisplay(modDevice.LedIP, ledText);
                        }
                        // 写入输送线退回指令
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                        if (ret.IsSucceed)
                        {
                            plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350");
                        }
                    }
                }
                break;
            case "100":
            case "330":
                {
                    //工位对应 1=A 4=B 10=C
                    string stationNum = "";
                    if (modDevice.StationNum == "1" || modDevice.StationNum == "4")
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
                        stationNum = "10";
                        //判断有没有小车到C口的任务,如果有就写120
                        var countTask = _db.Queryable<WcsTask>().Where(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV && s.EndLocate == "A1").Count();
                        if (countTask != 0)
                        {
                            var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "120");
                            Log.Information($"向plc{modDevice.PlcIdIP}写入120,结果:{ret.ToJson()}");
                            return;
                        }
                        break;
                    }
                    string strPalletNo = "";
                    if (modDevice.StationNum == "10" || modDevice.StationNum == "4")
                    string pallet = palletVal.ToString();
                    // 获取任务信息
                    var modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false
                    && s.PalletNo == pallet
                    && s.Type == PLCTypeEnum.ConveyorLine
                    && (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing)
                    && s.TaskType == TaskTypeEnum.In);
                    if (modTask == null)
                    {
                        var modPosPallet = modDevice.listStation.First(s => s.Text == "托盘条码");
                        //todo:这里读码器老读不到条码信息 先写死 读码器问题解决了可以注释掉
                        //plcConn.SetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos, "T2400001");
                        var (res, palletNo) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos, modPosPallet.StringLength);
                        if (!res.IsSucceed || palletNo == "")
                        {
                            var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "120");
                            Log.Information($"向plc{modDevice.PlcIdIP}写入120,结果:{ret.ToJson()}");
                            return;
                        }
                        strPalletNo = Convert.ToString(palletNo);
                        // 此托盘没有对应的转移任务 led显示
                        break;
                    }
                    if (modDevice.StationNum == "10")
                    //判断入库锁定是否打开
                    if (PLCTaskAction.boEnterLock)
                    {
                        if (strPalletNo.Substring(0, 1) == "T")
                            stationNum = "4";
                        else
                            stationNum = "1";
                        break;//入库锁定打开则不执行入库任务
                    }
                    // 写入托盘输送线码垛工位
                    // 获取四项车取货工位
                    string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, modDevice.StationNum);
                    // 给PLC写入任务数据
                    var listResult = new List<Result>();
                    // 写入托盘输送线码垛工位 目的工位、任务号,写入交互流程组托成功
                    var posModel = modDevice.listStation.First(m => m.Text == "起始工位");
                    listResult.Add(plcConn.SetPlcDBValue(posModel.PosType, modDevice.DbNumber, posModel.PlcPos, modDevice.StationNum));
                    var posModel2 = modDevice.listStation.First(m => m.Text == "目标工位");
                    listResult.Add(plcConn.SetPlcDBValue(posModel2.PosType, modDevice.DbNumber, posModel2.PlcPos, stationNum));
                    string taskNo = _taskService.GetTaskCode("WCS");
                    var modPosTask = modDevice.listStation.First(s => s.Text == "任务号");
                    listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, taskNo));
                    // 任务号、任务类型、托盘号
                    var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号");
                    listResult.Add(plcConn.SetPlcDBValue(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));
                    // 起始工位、目的工位
                    var modPosStrLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "起始工位");
                    listResult.Add(plcConn.SetPlcDBValue(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));
                    if (listResult.All(s => s.IsSucceed))
                    {
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "130");
                        Log.Information($"向plc{modDevice.PlcIdIP}写入130,结果:{ret.ToJson()}");
                        // 将任务状态变更为正在执行
                        _db.Updateable<WcsTask>()
                           .SetColumns(s => s.Status == TaskStatusEnum.Doing)
                           .Where(s => s.Id == modTask.Id)
                           .ExecuteCommand();
                        // 写入流程字 330 340
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "340");
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.StartLocate).Select(s => s.LedIP).First();
                        if (ret.IsSucceed)
                        {
                            AddWcsTaskInput modTask = new AddWcsTaskInput()
                            {
                                TaskNo = taskNo,
                                TaskType = TaskTypeEnum.In,
                                PalletNo = strPalletNo,
                                Status = TaskStatusEnum.Doing,
                                IsSuccess = TaskSuccessEnum.Fail,
                                StartLocate = modDevice.StationNum,
                                EndLocate = stationNum,
                                Type = PLCTypeEnum.ConveyorLine,
                            };
                            _taskService.Add(modTask);
                            WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor()
                            // 插入任务明细
                            var modInsertTaskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = modTask.TaskNo,
                                PlcId = modDevice.PlcId,
                                PlcId = modDevice.Id,
                                PlcName = modDevice.Text,
                                InteractiveMsg = $"写入指令340:{modDevice.StationNum}储位====》{endLocatVlue}工位",
                                PalletNo = palletVal,
                                Status = TaskStatusEnum.Complete,
                                StartLocat = modDevice.StationNum,
                                EndLocat = stationNum,
                                Status = TaskStatusEnum.Doing,
                                InteractiveMsg = $"向{modDevice.Text}写入指令130,结果{ret.IsSucceed}",
                                EndLocat = endLocatVlue,
                            };
                            _db.Insertable(modTaskMonitor).ExecuteCommand();
                            //下发任务日志
                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                            HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // 插入交互日志
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            // 通知任务界面任务已存在更新 请更新界面
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                    }
                }
                break;
            case "140":
            case "620":
                {
                    var modPosTask = modDevice.listStation.First(m => m.Text == "任务号");
                    var (result, taskNo) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modPosTask.StringLength);
                    var modPosPallet = modDevice.listStation.First(m => m.Text == "托盘条码");
                    var (res, palletNo) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos, modPosPallet.StringLength);
                    WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor();
                    WcsTask modTask = new WcsTask();
                    if (!result.IsSucceed)
                    // 申请储位 更新入库任务(储位地址) 630
                    var strMsg = "";
                    var taskModel = "";
                    //// 根据工位号获取巷道号
                    //var roadway = PLCCommon.GetRoadwayByStation(modDevice.StationNum);
                    //if (roadway == "")
                    //{
                    //    break;
                    //}
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
                        Log.Error($"{plcConn.PlcIP}读取任务号失败");
                        return;
                        break;
                    }
                    if (modDevice.StationNum == "10")
                    var http = new HttpService();
                    string TaskNo = "";
                    // 向WMS申请储位信息
                    strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, "roadway", ref TaskNo);
                    if (!strMsg.Contains("-1"))
                    {
                        var posModel = modDevice.listStation.First(m => m.Text == "起始工位");
                        var (resultS, station) = plcConn.GetPlcDBValue(posModel.PosType, modDevice.DbNumber, posModel.PlcPos);
                        if (resultS.IsSucceed)
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo);
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First();
                        // 写入流程字 630
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "630");
                        if (ret.IsSucceed)
                        {
                            if (station == 1)
                            // 插入任务明细
                            var modInsertTaskMonitor = new WcsTaskMonitor()
                            {
                                WcsTask modInsertTask = new WcsTask()
                                {
                                    TaskNo = _taskService.GetTaskCode(),
                                    TaskType = TaskTypeEnum.Move,
                                    Type = PLCTypeEnum.AGV,
                                    StartLocate = AGVStaionEnum.A1.ToString(),
                                    EndLocate = AGVStaionEnum.F1.ToString(),
                                    PalletNo = modTask.PalletNo,
                                    Status = TaskStatusEnum.Wait,
                                    Levels = 5,
                                    Origin = "WCS"
                                };
                                _db.Insertable(modInsertTask).ExecuteCommand();
                                HubUtil.PublicTask(modInsertTask.Adapt<WcsTaskOutput>());
                            }
                            else if (station == 4)
                            {
                                WcsTask modInsertTask = new WcsTask()
                                {
                                    TaskNo = _taskService.GetTaskCode(),
                                    TaskType = TaskTypeEnum.Move,
                                    Type = PLCTypeEnum.AGV,
                                    StartLocate = AGVStaionEnum.A1.ToString(),
                                    EndLocate = AGVStorageUtil.GetPalletInStorage(),
                                    PalletNo = modTask.PalletNo,
                                    Status = TaskStatusEnum.Wait,
                                    Levels = 5,
                                    Origin = "WCS"
                                };
                                _db.Insertable(modInsertTask).ExecuteCommand();
                                HubUtil.PublicTask(modInsertTask.Adapt<WcsTaskOutput>());
                            }
                        }
                        else
                        {
                            Log.Error("获取起始工位失败,失败原因" + resultS.Err);
                            return;
                                TaskNo = TaskNo,
                                PlcId = modDevice.Id,
                                PlcName = modDevice.Text,
                                InteractiveMsg = $"写入指令340:{modDevice.StationNum}工位申请储位",
                                PalletNo = palletVal,
                                Status = TaskStatusEnum.Complete,
                                StartLocat = modDevice.StationNum,
                                EndLocat = strMsg,
                            };
                            // 插入交互日志
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            // 通知任务界面任务已存在更新 请更新界面
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business);
                            ledText += $"任务类型:{taskInfo.TaskType.GetDescription()}\n\n";
                            ledText += $"任务号:{taskInfo.TaskNo}\n";
                            ledText += $"托盘号:{taskInfo.PalletNo}\n\n";
                            ledText += $"起始位:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n";
                            ledText += $"目标位:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}";
                            LedDisplay(modDevice.LedIP, ledText);
                        }
                    }
                    var ledText = "";
                    if (modDevice.StationNum == "4")
                    else
                    {
                        //todo:led
                        ledText += "任务类型:入库\n\n";
                        ledText += $"任务号:{taskNo}\n";
                        ledText += $"托盘号:{palletNo}\n\n";
                        //ledText += $"起始位:10\n";
                        //ledText += $"目标位:4";
                        // 申请储位失败!LED显示
                        Log.Error(string.Format($"申请储位失败:{strMsg},读写plc错误"));
                        // led显示内容
                        var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business);
                        ledText += $"申请入库失败\n\n";
                        ledText += $"{strMsg}\n";
                        LedDisplay(modDevice.LedIP, ledText);
                    }
                    var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "150");
                    Log.Information($"向plc{modDevice.PlcIdIP}写入150,结果:{ret.ToJson()}");
                    if (ret.IsSucceed)
                    {
                        string strTaskNo = taskNo;
                        modTask = _db.Queryable<WcsTask>().First(s => s.TaskNo == strTaskNo);
                        if (modTask != null)
                        {
                            modTaskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = modTask.TaskNo,
                                PlcId = modDevice.PlcId,
                                PlcName = modDevice.Text,
                                StartLocat = modTask.StationNum,
                                EndLocat = modTask.EndLocate,
                                InteractiveMsg = $"向{modDevice.Text}写入指令150,结果{ret.IsSucceed}",
                            };
                            modTaskMonitor.Status = TaskStatusEnum.Complete;
                            _db.Insertable(modTaskMonitor).ExecuteCommand();
                            modTask.FinishDate = DateTime.Now;
                            modTask.Status = TaskStatusEnum.Complete;
                            _db.Updateable(modTask).ExecuteCommand();
                            //下发任务日志
                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                            HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                    }
                }
                break;
            case "630":
                {
                    #region plc光电扫描不到托盘后 自动清信息
                    //// 获取工位托盘码信息
                    //var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    //var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    //// 获取工位任务号信息
                    //var modPosTaskNo = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                    //var (taskRes, taskNoVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosTaskNo.PlcPos);
                    //if (!res.IsSucceed || !taskRes.IsSucceed)
                    //{
                    //    break;
                    //}
                    //string pallet = palletVal.ToString();
                    //string taskNo = taskNoVal.ToString();
                    //// 获取任务信息
                    //var modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.PalletNo == pallet && s.Status == TaskStatusEnum.Doing && s.TaskType == TaskTypeEnum.In && s.TaskNo == taskNo);
                    //if (modTask == null)
                    //{
                    //    // 此托盘没有对应的转移任务 led显示
                    //    break;
                    //}
                    //var sInfo = PLCCommon.GetStokePlc(modTask.EndRoadway, louCeng);
                    //if (string.IsNullOrWhiteSpace(sInfo.Ip))
                    //{
                    //    //需加上LED显示
                    //    Log.Error(string.Format($"根据巷道获取跺机IP失败,请联系管理员"));
                    //    break;
                    //}
                    //// 跺机连接
                    //var plcStackeConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == sInfo.Ip);
                    //if (plcStackeConn.Connected)
                    //{
                    //    // 目标排列层
                    //    var endLocate = modTask.EndLocate;
                    //    if (string.IsNullOrWhiteSpace(modTask.EndLocate))
                    //    {
                    //        Log.Error(string.Format($"目标位置为空,请人工处理,读写plc错误"));
                    //        break;
                    //    }
                    //    // 转换目标工位排列层 03010301
                    //    var paiVal = PLCCommon.GetDjAdress(modTask.EndRoadway.Substring(1, 2), endLocate.Substring(0, 2), endLocate.Substring(6, 2));
                    //    string pai = paiVal.ToString();
                    //    string lie = int.Parse(endLocate.Substring(2, 2)).ToString();
                    //    string ceng = int.Parse(endLocate.Substring(4, 2)).ToString();
                    //    var djmodel = _db.Queryable<WcsPlc>().First(m => m.IP == sInfo.Ip);
                    //    var djMod = PLCTaskAction.plcDevices.First(m => m.PlcId == djmodel.Id
                    //        && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false);
                    //    var djInfos = PLCTaskAction.plcPositions.Where(m => m.IsDelete == false && m.DeviceId == djMod.Id).ToList();
                    //    var djInfo = djInfos.First(m => m.Text == "PLC流程字");
                    //    // 获取跺机当前状态
                    //    var (djRes, djVal) = plcStackeConn.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos);
                    //    if (!djRes.IsSucceed || djVal.ToString() != "820")
                    //    {
                    //        // 跺机非空闲等待
                    //        break;
                    //    }
                    //    // 给PLC写入任务数据
                    //    var listResult = new List<Result>();
                    //    // 任务号、任务类型、托盘号
                    //    var modPosTask = djInfos.FirstOrDefault(s => s.Text == "任务号");
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosTask.PosType, djMod.DbNumber, modPosTask.PlcPos, modTask.TaskNo));
                    //    var modPosTaskType = djInfos.FirstOrDefault(s => s.Text == "任务类型");
                    //    var taskTypeStr = (int)modTask.TaskType;
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosTaskType.PosType, djMod.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString()));
                    //    var modPosPalletNo = djInfos.FirstOrDefault(s => s.Text == "托盘码");
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosPalletNo.PosType, djMod.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
                    //    //起始工位
                    //    var modPosStrStationNum = djInfos.FirstOrDefault(s => s.Text == "起始工位");
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosStrStationNum.PosType, djMod.DbNumber, modPosStrStationNum.PlcPos, modDevice.StationNum));
                    //    //取货排、列、层
                    //    var modPosStrPai = djInfos.FirstOrDefault(s => s.Text == "取货排");
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosStrPai.PosType, djMod.DbNumber, modPosStrPai.PlcPos, sInfo.Pai));
                    //    var modPosStrLie = djInfos.FirstOrDefault(s => s.Text == "取货列");
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosStrLie.PosType, djMod.DbNumber, modPosStrLie.PlcPos, sInfo.Lie));
                    //    var modPosStrCeng = djInfos.FirstOrDefault(s => s.Text == "取货层");
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosStrCeng.PosType, djMod.DbNumber, modPosStrCeng.PlcPos, sInfo.Ceng));
                    //    //放货排、列、层
                    //    var modPosEndPai = djInfos.FirstOrDefault(s => s.Text == "放货排");
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosEndPai.PosType, djMod.DbNumber, modPosEndPai.PlcPos, pai));
                    //    var modPosEndLie = djInfos.FirstOrDefault(s => s.Text == "放货列");
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosEndLie.PosType, djMod.DbNumber, modPosEndLie.PlcPos, lie));
                    //    var modPosEndCeng = djInfos.FirstOrDefault(s => s.Text == "放货层");
                    //    listResult.Add(plcStackeConn.SetPlcDBValue(modPosEndCeng.PosType, djMod.DbNumber, modPosEndCeng.PlcPos, ceng));
                    //    if (listResult.All(s => s.IsSucceed))
                    //    {
                    //        // 写入跺机 830
                    //        var retc2 = plcStackeConn.SetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.WcsPos, "830");
                    //        // 插入任务明细 任务明细实体类
                    //        var modInsertTaskMonitor = new WcsTaskMonitor()
                    //        {
                    //            TaskNo = modTask.TaskNo,
                    //            PlcId = modDevice.Id,
                    //            PlcName = modDevice.Text,
                    //            PalletNo = modTask.PalletNo,
                    //            Status = TaskStatusEnum.Complete,
                    //            StartLocat = modDevice.StationNum,
                    //            EndLocat = modTask.EndLocate                  // 目标储位地址
                    //        };
                    //        if (!retc2.IsSucceed)
                    //        {
                    //            modInsertTaskMonitor.InteractiveMsg = $"输送线取货工位:{modDevice.StationNum},写入垛机取货任务830失败等待再次写入";
                    //            // 插入交互日志
                    //            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                    //            //下发任务日志
                    //            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                    //            break;
                    //        }
                    //        modInsertTaskMonitor.InteractiveMsg = $"跺机写入指令830:{modDevice.StationNum}工位====》" + modTask.EndLocate + "储位地址!";
                    //        // 插入交互日志
                    //        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                    //        if (PLCTaskAction.boRefresh)
                    //        {
                    //            //下发任务日志
                    //            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                    //        }
                    //    }
                    //}
                    #endregion
                }
                break;
            #region 出库交互
            case "420":
                {
                    #region 托盘到达拣选工位/出库口
                    // 出库口
                    // led显示托盘信息
                    // 写入430
                    var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "430");
                    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);
                        // 插入任务明细
                        var modInsertTaskMonitor = new WcsTaskMonitor()
                        {
                            TaskNo = taskVal,
                            PlcId = modDevice.Id,
                            PlcName = modDevice.Text,
                            InteractiveMsg = $"写入指令430:托盘到达{modDevice.StationNum}工位",
                            PalletNo = palletVal,
                            Status = TaskStatusEnum.Complete,
                            StartLocat = starVal,
                            EndLocat = modDevice.StationNum,
                        };
                        // 插入交互日志
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                        // 通知任务界面任务已存在更新 请更新界面
                        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显示内容
                        // 根据目标工位号获取对应的LEDIP地址
                        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 += $"任务号:{taskInfo.TaskNo}\n";
                        ledText += $"托盘号:{taskInfo.PalletNo}\n\n";
                        ledText += $"起始位:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n";
                        ledText += $"目标位:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}";
                        LedDisplay(ledDevice.LedIP, ledText);
                    }
                    // 反馈WMS出库完成
                    //TaskReques taskReques = new TaskReques();
                    //taskReques.taskNo = TaskNo;
                    //taskReques.TaskType = "1";
                    //taskReques.TaskStatus = "2";
                    //bool bl = wcsMySql.RequestTasks(taskReques);
                    #endregion
                }
                break;
            case "440":
                {
                    #region 拣选完成,托盘离开工位
                    // 写入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);
                        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}出库完成",
                            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
                }
                break;
            #endregion
            default: break;
        }
    }
    /// <summary>