hwh
2024-09-19 8ae6fce575bd8b29e858724df186535abe5b6e52
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -15,12 +15,6 @@
public static class PLCService
{
    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
    private static readonly IHubContext<TaskLogHub, ITaskLogHub> _taskLogHubContext;
    static PLCService()
    {
        _taskLogHubContext = App.GetService<IHubContext<TaskLogHub, ITaskLogHub>>();
    }
    public static void OnChangeEvent(object sender, EventArgs e)
    {
@@ -40,6 +34,9 @@
                    AGV(mod);
                    break;
                case PLCTypeEnum.PalletMachine:
                    PalletMachine(mod);
                    break;
                case PLCTypeEnum.StackingRobot:
                    PalletMachine(mod);
                    break;
                default:
@@ -145,7 +142,7 @@
                            .SetColumns(s => s.Status == TaskStatusEnum.Doing)
                            .Where(s => s.Id == modTask.Id)
                            .ExecuteCommand();
                        _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>());
                        HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                        WcsTaskMonitor modInsertTaskMonitor;
                        if (string.IsNullOrEmpty(taskInfo.EndStation))
                        {
@@ -181,7 +178,7 @@
                        // 插入交互日志
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                        //下发任务日志
                        _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        //修改led屏信息
                        //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
                    }
@@ -248,7 +245,7 @@
                                        // 插入交互日志
                                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                        //下发任务日志
                                        _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                        break;
                                    }
@@ -256,7 +253,7 @@
                                    // 插入交互日志
                                    _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                    //下发任务日志
                                    _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                    HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                }
                                // 写入流程控制字
@@ -271,7 +268,7 @@
                                                                                                    // 插入交互日志
                                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                //下发任务日志
                                _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            }
                        }
                        else if (modTask.TaskType == TaskTypeEnum.Out)
@@ -303,7 +300,7 @@
                        // 插入交互日志
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                        //下发任务日志
                        _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        //修改led屏信息
                        //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
                    }
@@ -340,8 +337,8 @@
                                    modTask.Status = TaskStatusEnum.Complete;
                                    modTask.FinishDate = DateTime.Now;
                                    _db.Updateable(modTask).ExecuteCommand();
                                    _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>());
                                    var modcTaskMonitor = new WcsTaskMonitor()
                                    HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                                    var modTaskMonitor = new WcsTaskMonitor()
                                    {
                                        TaskNo = modTask.TaskNo,
                                        PlcId = modDevice.Id,
@@ -366,13 +363,13 @@
                                        var modResponseTask = httpService.RequestTask(requestMode).Result;
                                        if (modResponseTask.StatusCode == "0")
                                        {
                                            modcTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成";
                                            modTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成";
                                        }
                                    }
                                    // 插入交互日志
                                    _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                    _db.Insertable(modTaskMonitor).ExecuteCommand();
                                    //下发任务日志
                                    _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                    HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                    // 此处添加不空跑业务
                                }
@@ -437,7 +434,7 @@
                                                    // 插入交互日志
                                                    _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                                    //下发任务日志
                                                    _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                                    HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                                    break;
                                                }
                                            }
@@ -466,8 +463,7 @@
                                    modTask.FinishDate = DateTime.Now;
                                    _db.Updateable(modTask).ExecuteCommand();
                                    //下发任务日志
                                    _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>());
                                    HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                                    var modcTaskMonitor = new WcsTaskMonitor()
                                    {
                                        TaskNo = modTask.TaskNo,
@@ -501,7 +497,7 @@
                                    // 插入交互日志
                                    _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                    //下发任务日志
                                    _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                    HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                    // 此处添加不空跑业务
                                }
@@ -535,7 +531,7 @@
                        break;
                    modTask.Status = TaskStatusEnum.Exception;
                    _db.Updateable(modTask).UpdateColumns(s => s.Status).ExecuteCommand();
                    _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>());
                    HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                    Log.Information($"【堆垛机】wcs任务变更空取异常,任务号:{modTask.TaskNo}");
                    var modTaskRequest = modTask.Adapt<TaskRequest>();
                    HttpService httpService = new HttpService();
@@ -546,7 +542,7 @@
                        modTask.IsSuccess = TaskSuccessEnum.Success;
                        _db.Updateable(modTask).UpdateColumns(s => s.IsSuccess).ExecuteCommand();
                        //下发任务日志
                        _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>());
                        HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                    }
                    else
                    {
@@ -554,7 +550,7 @@
                        modTask.IsSuccess = TaskSuccessEnum.Fail;
                        modTask.Information = modResponseTask.Message;
                        _db.Updateable(modTask).UpdateColumns(s => new { s.IsSuccess, s.Information }).ExecuteCommand();
                        _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>());
                        HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                    }
                }
                break;
@@ -575,7 +571,7 @@
                    }
                    modTask.Status = TaskStatusEnum.Exception;
                    _db.Updateable(modTask).UpdateColumns(s => s.Status).ExecuteCommand();
                    _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>());
                    HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                    Log.Information($"【堆垛机】wcs任务变更满取异常,任务号:{modTask.TaskNo}");
                    var modTaskRequest = modTask.Adapt<TaskRequest>();
                    HttpService httpService = new HttpService();
@@ -629,7 +625,7 @@
                            // 插入交互日志
                            _db.Insertable(modcTaskMonitor).ExecuteCommand();
                            //下发任务日志
                            _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                    }
@@ -647,13 +643,89 @@
        }
    }
    /// <summary>
    /// 堆垛机不空跑
    /// </summary>
    /// <param name="modTask">操作完成的任务</param>
    /// <param name="plcConn">plc连接</param>
    private static void ContinuousOperation(WcsTask modTask, PLCUtil plcConn)
    {
        //列 todo:上面代码拿来的,这里不理解为啥是1,2 不是2,2?
        int col = modTask.EndLocate.Substring(1, 2).ToInt();
        int row = modTask.EndLocate.Substring(0, 2).ToInt();
        int storey = modTask.EndLocate.Substring(4, 2).ToInt();
        int deep = modTask.EndLocate.Substring(6, 2).ToInt();
        // 查询所有待执行的任务
        var listTask = _db.Queryable<WcsTask>().Where(s => s.Status == TaskStatusEnum.Wait).ToList();
        switch (modTask.TaskType)
        {
            case TaskTypeEnum.In:
                {
                    // 先找出对应排列层的入库任务
                    var listInTask = listTask.Where(s => s.TaskType == TaskTypeEnum.In)
                                             .Select(s => s.EndLocate.Substring(0, 6))
                                             .ToHashSet();
                    // 找出库任务,对应巷道的任务
                    var listNextTask = listTask.Where(s => s.TaskType == TaskTypeEnum.Out && s.StartRoadway == modTask.EndRoadway).ToList();
                    foreach (var modNext in listNextTask)
                    {
                        // 如果有对应排列层的入库任务,那就不能优先执行
                        if (listInTask.Contains(modNext.EndLocate.Substring(0, 6)))
                        {
                            continue;
                        }
                        // todo: 写入modNext任务信息给plc
                        Console.WriteLine($"入库任务{modTask.TaskNo}执行完成后,不空跑逻辑检测下一任务为{modNext.TaskNo}");
                        break;
                    }
                }
                break;
            case TaskTypeEnum.Out:
                {
                    // 先找出对应排列层的出库任务
                    var listInTask = listTask.Where(s => s.TaskType == TaskTypeEnum.Out)
                                             .Select(s => s.EndLocate.Substring(0, 6))
                                             .ToHashSet();
                    // 找入库任务,对应巷道的任务
                    var listNextTask = listTask.Where(s => s.TaskType == TaskTypeEnum.In && s.StartRoadway == modTask.EndRoadway).ToList();
                    foreach (var modNext in listNextTask)
                    {
                        // 如果有对应排列层的出库任务,那就不能优先执行
                        if (listInTask.Contains(modNext.EndLocate.Substring(0, 6)))
                        {
                            continue;
                        }
                        // todo: 写入modNext任务信息给plc
                        Console.WriteLine($"出库任务{modTask.TaskNo}执行完成后,不空跑逻辑检测下一任务为{modNext.TaskNo}");
                        break;
                    }
                }
                break;
            case TaskTypeEnum.Move:
                {
                    var modDevice = _db.Queryable<WcsDevice>().Where(s => s.PlcId == plcConn.PlcId && s.DeviceType == DeviceTypeEnum.Show).First();
                    var (result, value) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos);
                    //当前堆垛机所在位置
                    var height = Math.Round(value / 790000d * 200).ToInt();
                    //todo:这里看能不能找到堆垛机所在位置在哪个排列层,优先寻找附近的任务?
                }
                break;
        }
    }
    /// <summary>
    /// 输送线业务处理
    /// </summary>
    /// <param name="modDevice"></param>
    private static void ConveyorLine(WcsDeviceDto modDevice)
    {
        var plcConn = modDevice.PLCUtil;
        // 获取楼层数
        // 获取楼层数ceshi
        var louCeng = PLCCommon.GetRoadwayByStationNew(modDevice.StationNum);
        switch (modDevice.Value.ToString())
        {
@@ -670,15 +742,19 @@
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
                        break;
                    }
                    var http = new HttpService();
                    string TaskNo = "", EndLocate = "";
                    strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, louCeng, ref EndLocate, ref TaskNo);
                    if (!strMsg.Contains("-1"))
                    {
                        // 写入330
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "330");
                        if (ret.IsSucceed)
                        {
                            // 插入任务明细 
@@ -693,15 +769,12 @@
                                StartLocat = modDevice.StationNum,
                                EndLocat = EndLocate,
                            };
                            // 插入交互日志
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            // 通知任务界面任务已存在更新 请更新界面
                            if (PLCTaskAction.boRefresh)
                            {
                                _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            }
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led更新内容
                            //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                            //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
@@ -711,7 +784,7 @@
                    else
                    {
                        // 申请巷道失败!LED显示
                        Log.Error(string.Format($"申请巷道失败:{ strMsg },读写plc错误"));
                        Log.Error(string.Format($"申请巷道失败:{strMsg},读写plc错误"));
                    }
                }
                break;
@@ -722,15 +795,19 @@
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
                        break;
                    }
                    string pallet = palletVal.ToString();
                    // 获取任务信息
                    var modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.PalletNo == pallet && (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.TaskType == TaskTypeEnum.In && s.StartRoadway == modDevice.StationNum);
                    var modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.PalletNo == pallet && (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.TaskType == TaskTypeEnum.In);
                    if (modTask == null)
                    {
                        // 此托盘没有对应的转移任务 led显示
                        break;
                    }
                    // 获取巷道口入库工位
                    string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, louCeng);
                    // 给PLC写入任务数据
@@ -738,8 +815,9 @@
                    // 任务号、任务类型、托盘号
                    var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号");
                    listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo));
                    var modPosTaskType = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号");
                    listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, modTask.TaskType.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));
                    // 起始工位、目的工位
@@ -747,7 +825,7 @@
                    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))
                    {
@@ -757,10 +835,10 @@
                           .Where(s => s.Id == modTask.Id)
                           .ExecuteCommand();
                        // 写入流程字 330 340
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "340");
                        if (ret.IsSucceed)
                        {
                            // 插入任务明细 
@@ -780,10 +858,7 @@
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            // 通知任务界面任务已存在更新 请更新界面
                            if (PLCTaskAction.boRefresh)
                            {
                                _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            }
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led更新内容
                            //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
@@ -795,7 +870,7 @@
            case "620":
                {
                    // 申请储位 更新入库任务(储位地址) 630
                    var strMsg = "";
                    var taskModel = "";
                    // 判断是否演示模式
@@ -813,6 +888,10 @@
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
                        break;
                    }
                    var http = new HttpService();
                    string TaskNo = "";
                    // 向WMS申请储位信息
@@ -841,10 +920,7 @@
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            // 通知任务界面任务已存在更新 请更新界面
                            if (PLCTaskAction.boRefresh)
                            {
                                _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            }
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            // led更新内容
                            //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                            //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
@@ -855,7 +931,7 @@
                        // 申请储位失败!LED显示
                        Log.Error(string.Format($"申请储位失败:{strMsg},读写plc错误"));
                    }
                }
                break;
            case "630":
@@ -865,9 +941,13 @@
                    // 获取工位托盘码信息
                    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();
                    // 获取任务信息
@@ -877,11 +957,13 @@
                        // 此托盘没有对应的转移任务 led显示
                        break;
                    }
                    var sInfo = PLCCommon.GetStokePlc(modTask.EndRoadway, louCeng);
                    if (string.IsNullOrWhiteSpace(sInfo.Ip))
                    {
                        throw new Exception("根据巷道获取跺机IP失败,请联系管理员");
                        //需加上LED显示
                        Log.Error(string.Format($"根据巷道获取跺机IP失败,请联系管理员"));
                        break;
                    }
                    // 跺机连接
                    var plcStackeConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == sInfo.Ip);
@@ -907,7 +989,8 @@
                        // 获取跺机当前状态
                        var (djRes, djVal) = plcStackeConn.GetPlcDBValue(djMod.PosType, djMod.DbNumber, djMod.PlcPos);
                        if (djVal != "820")
                        if (!djRes.IsSucceed || djVal != "820")
                        {
                            // 跺机非空闲等待
                            break;
@@ -919,12 +1002,13 @@
                        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 == "任务类型");
                        listResult.Add(plcStackeConn.SetPlcDBValue(modPosTaskType.PosType, djMod.DbNumber, modPosTaskType.PlcPos, modTask.TaskType.ToString()));
                        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(modPosPallet.PosType, djMod.DbNumber, modPosPallet.PlcPos, modTask.PalletNo));
                        listResult.Add(plcStackeConn.SetPlcDBValue(modPosPalletNo.PosType, djMod.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
                        //起始工位
                        var modPosStrStationNum = djInfos.FirstOrDefault(s => s.Text == "取货排");
                        var modPosStrStationNum = djInfos.FirstOrDefault(s => s.Text == "起始工位");
                        listResult.Add(plcStackeConn.SetPlcDBValue(modPosStrStationNum.PosType, djMod.DbNumber, modPosStrStationNum.PlcPos, modDevice.StationNum));
                        //取货排、列、层
@@ -964,7 +1048,7 @@
                                // 插入交互日志
                                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                //下发任务日志
                                _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                break;
                            }
@@ -972,17 +1056,18 @@
                            // 插入交互日志
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            if (PLCTaskAction.boRefresh)
                            {   //下发任务日志
                                _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            {
                                //下发任务日志
                                HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            }
                        }
                        }
                    }
                    #endregion
                }
                break;
@@ -995,7 +1080,7 @@
                    // led显示托盘信息
                    // 写入430
                    var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "430");
                    if (ret.IsSucceed)
                    {
                        var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
@@ -1021,11 +1106,8 @@
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                        // 通知任务界面任务已存在更新 请更新界面
                        if (PLCTaskAction.boRefresh)
                        {
                            _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        // led更新内容
                        //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                        //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
@@ -1069,10 +1151,7 @@
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                        // 通知任务界面任务已存在更新 请更新界面
                        if (PLCTaskAction.boRefresh)
                        {
                            _taskLogHubContext.Clients.All.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        // led更新内容
                        //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                        //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
@@ -1104,6 +1183,25 @@
    }
    /// <summary>
    /// 拆垛机器人业务处理
    /// </summary>
    /// <param name="modDevice"></param>
    private static void StackingRobot(WcsDeviceDto modDevice)
    {
        var plcConn = modDevice.PLCUtil;
        switch (modDevice.Value.ToString())
        {
            case "0":
                {
                    // 若拆垛工位为空闲,查询任务表是否有未绑定的出库任务,做绑定操作
                }
                break;
            default:
                break;
        }
    }
    private static void Test(WcsDeviceDto modDevice)
    {
        //写死测试读string