IPC-610
2024-09-23 9863192570e0356541235a2cb8177cae00edbc12
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -10,6 +10,7 @@
using System;
using System.Data;
using System.Reflection.Emit;
using WCS.Application.Util;
namespace WCS.Application;
public static class PLCService
@@ -70,7 +71,7 @@
                    }
                    // 根据目标地址和巷道获取放货工位对应的排列层
                    PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, modTask.TaskType.ToString(),
                    PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, ((int)modTask.TaskType).ToString(),
                        modTask.StartRoadway, modTask.EndRoadway);
                    // 目标工位不为null,需先判断放货工位是否空闲
@@ -104,8 +105,8 @@
                        }
                    }
                    // 获取转换后的起始排列层
                    PlcTaskInfo startTaskInfo = PLCCommon.GetEndPai(modTask.StartLocate.Substring(1, 2),
                    // 获取转换后的起始排列层 06010101
                    PlcTaskInfo startTaskInfo = PLCCommon.GetEndPai(modTask.StartRoadway.Substring(1, 2), modTask.StartLocate.Substring(2, 2),
                    modTask.StartLocate.Substring(0, 2), modTask.StartLocate.Substring(4, 2),
                    modTask.StartLocate.Substring(6, 2));
@@ -135,7 +136,7 @@
                    if (listResult.All(s => s.IsSucceed))
                    {
                        // 写入跺机任务下发完成
                        plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "830");
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "830");
                        // 将移库任务待执行改为正在执行
                        _db.Updateable<WcsTask>()
@@ -192,12 +193,12 @@
                    var (res, val) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosTask.PlcPos);
                    var modPosEndStation = modDevice.listStation.FirstOrDefault(m => m.Text == "目的工位");
                    var (endStationRes, endStation) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosTask.PlcPos);
                    var (endStationRes, endStation) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosEndStation.PlcPos);
                    if (res.IsSucceed)
                    {
                        // 获取任务信息
                        string tasknoVal = val.ToString();
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == true);
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false);
                        if (modTask == null)
                        {
                            Log.Error(string.Format("PLC控制字840:未找到对应的任务。"));
@@ -218,17 +219,17 @@
                        {
                            // 获取跺机起始工位点位配置,读取起始工位
                            var modPosStartStation = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位");
                            var (startStationRes, startStationVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosStartStation.PlcPos);
                            var (startStationRes, startStationVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Short, modDevice.DbNumber, modPosStartStation.PlcPos);
                            if (startStationRes.IsSucceed)
                            {
                                // 根据工位号获取对应的输送线IP
                                var plcConveyorConn = PLCCommon.GetPlcIp(startStationVal);
                                PLCUtil plcConveyorConn = PLCCommon.GetPlcIp(startStationVal.ToString());
                                if (plcConveyorConn.Connected)
                                {
                                    // 向取货工位写入流程字640  取货已完成
                                    var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == startStationVal
                                                            && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == true);
                                    var retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640");
                                    var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == startStationVal.ToString()
                                                            && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false);
                                    var modcTaskMonitor = new WcsTaskMonitor()
                                    {
                                        TaskNo = modTask.TaskNo,
@@ -236,12 +237,24 @@
                                        PlcName = ConveyorMod.Text,
                                        PalletNo = modTask.PalletNo,
                                        Status = TaskStatusEnum.Complete,
                                        StartLocat = startStationVal,
                                        StartLocat = startStationVal.ToString(),
                                        EndLocat = modTask.EndLocate                  // 目标储位地址
                                    };
                                    // 读取wcs控制字
                                    var (ress, va1s) = plcConveyorConn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos);
                                    if (va1s.ToString() == "630")
                                    {
                                        modcTaskMonitor.InteractiveMsg = string.Format("工位:{0},写入取货完成:640", startStationVal);
                                        // 插入交互日志
                                        _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                    }
                                    var retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640");
                                    if (!retc.IsSucceed)
                                    {
                                        modcTaskMonitor.InteractiveMsg = string.Format("输送线取货工位:{0},写入取货完成640失败等待在次写入", startStationVal);
                                        modcTaskMonitor.InteractiveMsg = string.Format("工位:{0},写入取货完成640失败", startStationVal);
                                        // 插入交互日志
                                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                        //下发任务日志
@@ -249,40 +262,58 @@
                                        break;
                                    }
                                    modcTaskMonitor.InteractiveMsg = string.Format("输送线取货工位:{0},写入取货完成640成功", startStationVal);
                                    // 插入交互日志
                                    _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                    //下发任务日志
                                    HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                }
                                // 读取wcs控制字
                                var (resss, va1ss) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos);
                                if (va1ss.ToString() == "830")
                                {
                                    modInsertTaskMonitor.InteractiveMsg = string.Format("工位:{0}跺机取货完成写入850", startStationVal);
                                    modInsertTaskMonitor.EndLocat = modTask.EndLocate;                  // 目标储位地址
                                                                                                        // 插入交互日志
                                    _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                }
                                // 写入流程控制字
                                var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "850");
                                if (!ret.IsSucceed)
                                {
                                    modInsertTaskMonitor.InteractiveMsg = string.Format("工位:{0}跺机取货完成写入850失败,等待再次写入。", startStationVal);
                                    modInsertTaskMonitor.EndLocat = modTask.EndLocate;                  // 目标储位地址
                                                                                                        // 插入交互日志
                                    _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                    break;              // 写入失败跳出等待再次写入
                                }
                                modInsertTaskMonitor.InteractiveMsg = string.Format("输送线取货工位:{0}跺机取货完成850成功", startStationVal);
                                modInsertTaskMonitor.EndLocat = modTask.EndLocate;                  // 目标储位地址
                                                                                                    // 插入交互日志
                                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                //下发任务日志
                                HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            }
                        }
                        else if (modTask.TaskType == TaskTypeEnum.Out)
                        {
                            // 读取wcs控制字
                            var (resss, va1ss) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos);
                            if (va1ss.ToString() == "830")
                            {
                                // 记录任务明细
                                modInsertTaskMonitor.InteractiveMsg = string.Format("储位地址:{0}取货完成写入850", modTask.StartLocate);
                                modInsertTaskMonitor.EndLocat = endStation;                  // 放货工位
                            }
                            // 写入流程控制字
                            var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "850");
                            if (!ret.IsSucceed)
                            {
                                modInsertTaskMonitor.InteractiveMsg = string.Format("储位地址:{0}取货完成写入850失败,等待再次写入。", modTask.StartLocate);
                                modInsertTaskMonitor.EndLocat = modTask.EndLocate;                  // 目标储位地址
                                                                                                    // 插入交互日志
                                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                break;              // 写入失败跳出等待再次写入
                            }
                            // 记录任务明细
                            modInsertTaskMonitor.InteractiveMsg = string.Format("储位地址:{0}取货完成", modTask.StartLocate);
                            modInsertTaskMonitor.EndLocat = endStation;                  // 放货工位
                            //下发任务日志
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                        else
                        {
@@ -295,12 +326,13 @@
                            modInsertTaskMonitor.InteractiveMsg = string.Format("储位地址:{0}取货完成", modTask.StartLocate);
                            modInsertTaskMonitor.EndLocat = endStation;                  // 目标储位
                        }
                        // 插入交互日志
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                        //下发任务日志
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // 插入交互日志
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            //下发任务日志
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                        //修改led屏信息
                        //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
                    }
@@ -315,7 +347,7 @@
                    if (res.IsSucceed)
                    {
                        string tasknoVal = val.ToString();
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == true);
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false);
                        if (modTask == null)
                        {
                            Log.Error(string.Format("跺机控制字860:未找到对应的任务。"));
@@ -352,24 +384,34 @@
                                    if (modTask.Origin == "WMS")
                                    {
                                        // 反馈WMS
                                        var requestMode = new TaskRequest()
                                        var requestMode = new TaskRequestWMS()
                                        {
                                            TaskNo = modTask.TaskNo,
                                            PalletNo = modTask.PalletNo,
                                            TaskType = TaskTypeEnum.In,
                                            TaskStatus = TaskStatusEnum.Complete
                                            TaskType = ((int)TaskTypeEnum.In).ToString(),
                                            TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
                                        };
                                        HttpService httpService = new HttpService();
                                        var modResponseTask = httpService.RequestTask(requestMode).Result;
                                        if (modResponseTask.StatusCode == "0")
                                        if (modResponseTask.StatusCode == 0)
                                        {
                                            modTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成";
                                        }
                                        else
                                        {
                                            Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg));
                                        }
                                    }
                                    // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                                    modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.StartLocate).Select(s => s.LedIP).First();
                                    // 插入交互日志
                                    _db.Insertable(modTaskMonitor).ExecuteCommand();
                                    //下发任务日志
                                    HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                    // led显示内容
                                    LedDisplay(modDevice.LedIP, "工位:" + modTask.StartLocate, "入库完成 " + $"任务完成:{modTask.TaskNo}", "托盘号:" + modTask.PalletNo);
                                    // 此处添加不空跑业务
                                }
@@ -384,7 +426,7 @@
                                    if (plcConveyorConn.Connected)
                                    {
                                        // 根据目标地址和巷道获取放货工位对应的排列层
                                        PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, modTask.TaskType.ToString(),
                                        PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, ((int)modTask.TaskType).ToString(),
                                            modTask.StartRoadway, modTask.EndRoadway);
                                        // 根据工位号获取工位信息
                                        var wcsDevice = PLCTaskAction.plcDevices.First(s => s.PlcId == plcConveyorConn.PlcId && s.Level == DeviceLevelEnum.Station && s.StationNum == taskInfo.EndStation);
@@ -395,19 +437,19 @@
                                        var listResult = new List<Result>();
                                        //任务号
                                        var modPosTask = listPos.FirstOrDefault(s => s.Text == "任务号");
                                        listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo));
                                        listResult.Add(plcConveyorConn.SetPlcDBValue(modPosTask.PosType, wcsDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo));
                                        //任务类型
                                        var modPosTaskType = listPos.FirstOrDefault(s => s.Text == "任务类型");
                                        listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, ((int)modTask.TaskType).ToString()));
                                        listResult.Add(plcConveyorConn.SetPlcDBValue(modPosTaskType.PosType, wcsDevice.DbNumber, modPosTaskType.PlcPos, ((int)modTask.TaskType).ToString()));
                                        //托盘号
                                        var modPosPalletNo = listPos.FirstOrDefault(s => s.Text == "托盘码");
                                        listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
                                        listResult.Add(plcConveyorConn.SetPlcDBValue(modPosPalletNo.PosType, wcsDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
                                        //起始工位
                                        var modPosLocatNo = listPos.FirstOrDefault(s => s.Text == "起始工位");
                                        listResult.Add(plcConn.SetPlcDBValue(modPosLocatNo.PosType, modDevice.DbNumber, modPosLocatNo.PlcPos, taskInfo.EndStation));
                                        listResult.Add(plcConveyorConn.SetPlcDBValue(modPosLocatNo.PosType, wcsDevice.DbNumber, modPosLocatNo.PlcPos, taskInfo.EndStation));
                                        // 目标工位
                                        var modPosEndLocatNo = listPos.FirstOrDefault(s => s.Text == "目的工位");
                                        listResult.Add(plcConn.SetPlcDBValue(modPosEndLocatNo.PosType, modDevice.DbNumber, modPosEndLocatNo.PlcPos, outCode));
                                        listResult.Add(plcConveyorConn.SetPlcDBValue(modPosEndLocatNo.PosType, wcsDevice.DbNumber, modPosEndLocatNo.PlcPos, outCode));
                                        // 是否写入成功
                                        if (listResult.All(s => s.IsSucceed))
@@ -435,6 +477,14 @@
                                                    _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                                    //下发任务日志
                                                    HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                                    // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                                                    var taskModel = _db.Queryable<WcsTask>().First(w => w.TaskNo == modTask.TaskNo);
                                                    modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskModel.StartLocate).Select(s => s.LedIP).First();
                                                    // led显示内容
                                                    LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "出库中 ", "托盘号:" + modTask.PalletNo);
                                                    break;
                                                }
                                            }
@@ -478,16 +528,16 @@
                                    if (modTask.Origin == "WMS")
                                    {
                                        // 反馈WMS
                                        var requestMode = new TaskRequest()
                                        var requestMode = new TaskRequestWMS()
                                        {
                                            TaskNo = modTask.TaskNo,
                                            PalletNo = modTask.PalletNo,
                                            TaskType = TaskTypeEnum.Move,
                                            TaskStatus = TaskStatusEnum.Complete
                                            TaskType = TaskTypeEnum.Move.ToString(),
                                            TaskStatus = TaskStatusEnum.Complete.ToString()
                                        };
                                        HttpService httpService = new HttpService();
                                        var modResponseTask = httpService.RequestTask(requestMode).Result;
                                        if (modResponseTask.StatusCode == "0")
                                        if (modResponseTask.StatusCode == 0)
                                        {
                                            modcTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成";
                                            //修改储位信息 任务类型 执行状态 起始位置 目标位置
@@ -752,6 +802,10 @@
                    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");
@@ -775,9 +829,8 @@
                            // 通知任务界面任务已存在更新 请更新界面
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led更新内容
                            //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                            //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
                            // led显示内容
                            LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "申请入库 " + $"目标巷道:{EndLocate}", "托盘号:" + palletVal);
                        }
                    }
@@ -790,6 +843,7 @@
                break;
            case "330":
                {
                    // 写入任务 托盘移动 340
                    // 获取工位托盘码信息
@@ -838,6 +892,8 @@
                        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)
                        {
@@ -860,8 +916,8 @@
                            // 通知任务界面任务已存在更新 请更新界面
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led更新内容
                            //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
                            // led显示内容
                            LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "入库中 " + $"目标巷道:{endLocatVlue}", "托盘号:" + palletVal);
                        }
                    }
@@ -896,6 +952,11 @@
                    string TaskNo = "";
                    // 向WMS申请储位信息
                    strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, roadway, ref TaskNo);
                    // 根据任务号获取起始工位地址,根据起始工位地址获取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();
                    if (!strMsg.Contains("-1"))
                    {
                        // 写入流程字 630
@@ -921,9 +982,8 @@
                            // 通知任务界面任务已存在更新 请更新界面
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led更新内容
                            //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                            //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
                            // led显示内容
                            LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "入库中 " + $"申请储位地址:{strMsg}", "托盘号:" + palletVal);
                        }
                    }
                    else
@@ -982,7 +1042,9 @@
                        string lie = int.Parse(endLocate.Substring(2, 2)).ToString();
                        string ceng = int.Parse(endLocate.Substring(4, 2)).ToString();
                        var djMod = PLCTaskAction.plcDevices.First(m => m.StationNum == modTask.EndRoadway
                        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流程字");
@@ -990,7 +1052,7 @@
                        // 获取跺机当前状态
                        var (djRes, djVal) = plcStackeConn.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos);
                        if (!djRes.IsSucceed || djVal != "820")
                        if (!djRes.IsSucceed || djVal.ToString() != "820")
                        {
                            // 跺机非空闲等待
                            break;
@@ -1004,7 +1066,7 @@
                        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 == "托盘号");
                        var modPosPalletNo = djInfos.FirstOrDefault(s => s.Text == "托盘码");
                        listResult.Add(plcStackeConn.SetPlcDBValue(modPosPalletNo.PosType, djMod.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
                        //起始工位
@@ -1108,9 +1170,12 @@
                        // 通知任务界面任务已存在更新 请更新界面
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        // led更新内容
                        //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                        //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == modInsertTaskMonitor.TaskNo);
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First();
                        // led显示内容
                        LedDisplay(modDevice.LedIP, "到达工位:" + modDevice.StationNum, "出库完成 " + $"储位地址:{modInsertTaskMonitor.StartLocat}", "托盘号:" + palletVal);
                    }
                    // 反馈WMS出库完成
                    //TaskReques taskReques = new TaskReques();
@@ -1134,27 +1199,61 @@
                        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;
                        _db.Updateable(modTask).ExecuteCommand();
                        HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                        // 插入任务明细 
                        var modInsertTaskMonitor = new WcsTaskMonitor()
                        {
                            TaskNo = taskVal,
                            TaskNo = modTask.TaskNo,
                            PlcId = modDevice.Id,
                            PlcName = modDevice.Text,
                            InteractiveMsg = $"写入指令450:{modDevice.StationNum}拣选完成,托盘离开工位",
                            PalletNo = palletVal,
                            Status = TaskStatusEnum.Complete,
                            StartLocat = starVal,
                            StartLocat = starVal.ToString(),
                            EndLocat = modDevice.StationNum,
                        };
                        if (modTask.Origin == "WMS")
                        {
                            // 反馈WMS
                            var requestMode = new TaskRequestWMS()
                            {
                                TaskNo = modTask.TaskNo,
                                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更新内容
                        //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                        //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
                        // led显示内容
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.StartLocate).Select(s => s.LedIP).First();
                        LedDisplay(modDevice.LedIP, "工位:" + modTask.StartLocate, $"拣选完成,托盘离开工位", "托盘号:" + modTask.PalletNo);
                    }
                    #endregion
                }
@@ -1202,6 +1301,23 @@
        }
    }
    /// <summary>
    /// Led屏展示信息
    /// </summary>
    /// <param name="ip">地址</param>
    /// <param name="top">上方区域</param>
    /// <param name="content">中间区域</param>
    /// <param name="foot">底部区域</param>
    private static void LedDisplay(string ip, string top, string content, string foot)
    {
        try
        {
            LedDll Led = new LedDll();
            Led.LEDstr(ip, top, content, foot);
        }
        catch { }
    }
    private static void Test(WcsDeviceDto modDevice)
    {
        //写死测试读string