liudl
2025-04-14 a815f0c44f8e435b0261c469f07654f0114726b9
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -28,6 +28,8 @@
    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
    private static int fendao = 1;
    public static void OnChangeEvent(object sender, EventArgs e)
    {
        try
@@ -997,10 +999,11 @@
                    string groupMsg = "";
                    if (modDevice.StationNum == "27")
                    {
                        var Qty = plcConn.GetPlcDBValue(PLCDataTypeEnum.Int,"DB135.0").ToString();//获取叠托机叠托数量
                        groupMsg = http.BindPlnInHouseWcs(Qty, palletVal);
                        var (res2,Qty) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Short,"DB135","0");//获取叠托机叠托数量
                        groupMsg = http.BindPlnInHouseWcs(Qty.ToString(), palletVal);
                        if (!groupMsg.Contains("-1"))
                        if (groupMsg.Contains("-1"))
                        {
                            var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                            if (res350.IsSucceed && palletVal350 != "350")
@@ -1017,8 +1020,8 @@
                            {
                                plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350");
                            }
                            break;
                        }
                        break;
                    }
                    string IsBale = "0";
                    strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, louCeng, ref EndLocate, ref TaskNo);
@@ -1427,6 +1430,9 @@
                        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();
                        ////string b = taskVal.GetValue();
                        //string a = palletVal.ToString();
                        // 插入任务明细 
                        var modInsertTaskMonitor = new WcsTaskMonitor()
                        {
@@ -1436,10 +1442,10 @@
                            InteractiveMsg = $"写入指令430:托盘到达{modDevice.StationNum}工位",
                            PalletNo = palletVal,
                            Status = TaskStatusEnum.Complete,
                            StartLocat = starVal,
                            StartLocat = starVal.ToString(),
                            EndLocat = modDevice.StationNum,
                        };
                        // 插入交互日志
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
@@ -1483,7 +1489,7 @@
                        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)
@@ -1749,8 +1755,53 @@
                    #endregion
                }
                break;
            #region 小车可放信号
            case "150":
                { // 获取工位任务号信息
                    var strMsg = "";
                    var http = new HttpService();
                    // 获取托盘任务号
                    var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                    var (res1, val) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                    if (res1.IsSucceed)
                    {
                        string tasknoVal = val.ToString();
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false);
                        if (modTask == null)
                        {
                            //读取成功后写入151
                            var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "151");//收到可放信号后写入151
                            if (ret.IsSucceed)
                            {
                                //回传WMS可放信号
                                strMsg = http.RequesContinueAgv(val.ToString(), modDevice.StationNum);
                                if (!strMsg.Contains("-1"))
                                {
                                    // 插入任务明细
                                    var modInsertTaskMonitor = new WcsTaskMonitor()
                                    {
                                        TaskNo = tasknoVal,
                                        PlcId = modDevice.Id,
                                        PlcName = modDevice.Text,
                                        InteractiveMsg = $"写入指令151:{modDevice.StationNum}工位可接受AGV放货入库",
                                        Status = TaskStatusEnum.Complete,
                                        StartLocat = modDevice.StationNum
                                    };
                                    // 插入交互日志
                                    _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                }
                            }
                            break;
                        }
                    }
                     //
                }
                break;
            #endregion
            default: break;
        }
@@ -1801,7 +1852,7 @@
    private static async void BoxConveyorLine(WcsDeviceDto modDevice) 
    {
        var plcConn = modDevice.PLCUtil;
        //二楼主扫分道
        if (modDevice.DbNumber == "DB101")//&& modDevice.DbNumber == "DB102"&& (modDevice.DbNumber == "DB102"||modDevice.PlcIdIP == "10.18.51.110")
        {
            // 主扫交互流程
@@ -1811,15 +1862,26 @@
                    // 主扫申请分道 wcs写入2
                    {
                        // 判断是否演示模式 true:演示模式   false:生产模式
                        if (PLCTaskAction.boDemo)
                        if (PLCTaskAction.boDemo)
                        {
                            // 通道号
                            var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "通道号");
                            // 演示模式直接写入1分道
                            var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "1");
                            // 演示模式直接写入分道号
                            //Random random = new Random();
                            //int ranNumber = random.Next(2) == 0 ? 1 : 5;
                            if (fendao == 1)
                            {
                                fendao = 5;
                            }
                            else
                            {
                                fendao = 1;
                            }
                            var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, fendao.ToString()); //
                            if (ret.IsSucceed)
                            {
                                Log.Information(string.Format("分道成功,道号是:" + fendao));
                                // 写入流程控制字 2
                                var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                if (!retVal.IsSucceed)
@@ -1899,11 +1961,11 @@
                                {
                                    // 判断是否关联单据 wcsordertask
                                    var orderModel = _db.Queryable<WcsOderTask>()
                                        .First(m => m.SkuNo == boxInfo.SkuNo && m.Status== TaskStatusEnum.Wait && m.LotNo == boxInfo.LotNo && m.IsDelete == false);
                                        .First(m => m.SkuNo == boxInfo.SkuNo && m.Status == TaskStatusEnum.Wait && m.LotNo == boxInfo.LotNo && m.IsDelete == false);
                                    if (orderModel != null)
                                    {
                                        // 根据boxinfo表产线字段自动绑定分道(1线产品只能绑定到8道)
                                        if (boxInfo.LineNo != "1")
                                        if (boxInfo.LineNo != "一线")
                                        {// 绑定到除8道外其他道
                                            // 获取未绑定道
@@ -1930,7 +1992,7 @@
                                                    break;
                                                }
                                                foreach (var lineNoModel in lineNoModels)
                                                foreach (var lineNoModel in lineNoModels)
                                                {
                                                    // 读取设备验证是否绑定分道
                                                    var (respg, pzNo) = plcConn.GetPlcDBValue(lineNoModel.PosType, lineNoModel.DbNumber, lineNoModel.PlcPos);
@@ -1941,16 +2003,17 @@
                                                            // plc此分道未解绑
                                                            break;
                                                        }
                                                        else
                                                        else
                                                        {
                                                            // 自动绑定分道
                                                            lineNoModel.OrderNo = orderModel.OrderNo;
                                                            lineNoModel.LotNo = boxInfo.LotNo;
                                                            lineNoModel.SkuNo = boxInfo.SkuNo;
                                                            lineNoModel.SkuName = boxInfo.SkuName;
                                                            lineNoModel.Qty = orderModel.Qty;
                                                            lineNoModel.Qty = 0;
                                                            lineNoModel.Status = "1";//已绑定
                                                            lineNoModel.PZNo = skuInfo.PZNo;
                                                            lineNoModel.FinishQty = 0;
                                                            // 给PLC写入品规
                                                            var ret = plcConn.SetPlcDBValue(lineNoModel.PosType, lineNoModel.DbNumber, lineNoModel.PlcPos, skuInfo.PZNo);
@@ -1972,7 +2035,7 @@
                                                            }
                                                        }
                                                    }
                                                    else
                                                    else
                                                    {
                                                        // 读取plc失败
                                                        break;
@@ -1980,7 +2043,7 @@
                                                }
                                            }
                                            else
                                            else
                                            {
                                                // 若没有空闲道,进行剔除处理。防止堵塞件箱线
                                                var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0");
@@ -1997,7 +2060,7 @@
                                                break;
                                            }
                                        }
                                        else
                                        else
                                        {// 绑定到8道
                                         // 获取未绑定道
                                            var lineNo8Model = _db.Queryable<WcsCheckTask>()
@@ -2040,9 +2103,10 @@
                                                        lineNo8Model.LotNo = boxInfo.LotNo;
                                                        lineNo8Model.SkuNo = boxInfo.SkuNo;
                                                        lineNo8Model.SkuName = boxInfo.SkuName;
                                                        lineNo8Model.Qty = orderModel.Qty;
                                                        lineNo8Model.Qty = 0;
                                                        lineNo8Model.Status = "1";//已绑定
                                                        lineNo8Model.PZNo = skuInfo.PZNo;
                                                        lineNo8Model.FinishQty = 0;
                                                        // 给PLC写入品规
                                                        var ret = plcConn.SetPlcDBValue(lineNo8Model.PosType, lineNo8Model.DbNumber, lineNo8Model.PlcPos, skuInfo.PZNo);
@@ -2070,7 +2134,7 @@
                                                    // 读取plc失败
                                                    break;
                                                }
                                            }
                                            else
@@ -2091,7 +2155,7 @@
                                            }
                                        }
                                    }
                                    else
                                    else
                                    {
                                        // 不关联单据直接进行剔除处理
                                        var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0");
@@ -2117,14 +2181,16 @@
                                        var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                        if (retVal.IsSucceed)
                                        {
                                            if (modDevice.DbNumber == "DB102")//1L拆跺分拣后需要回传箱码
                                            {
                                                var http = new HttpService();
                                                IsBaleModel2 ret1 = http.RequestBoxno(boxNoVal);
                                                if (ret1.Success == -1)
                                            {  // liudl 此段程序不会执行 确认后直接删除
                                                if (modDevice.DbNumber == "DB102")//1L拆跺分拣后需要回传箱码
                                                {
                                                    Log.Error("箱码分拣回传失败,需要手动拣货。失败箱码:"+boxNoVal);
                                                    break;
                                                    var http = new HttpService();
                                                    IsBaleModel2 ret1 = http.RequestBoxno(boxNoVal);
                                                    if (ret1.Success == -1)
                                                    {
                                                        Log.Error("箱码分拣回传失败,需要手动拣货。失败箱码:" + boxNoVal);
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
@@ -2138,10 +2204,88 @@
                default: break;
            }
        }
        else
        //一楼主扫分道
        else if (modDevice.DbNumber == "DB102")
        {
            switch (modDevice.Value.ToString())
            {
                case "1":
                    // 1楼件箱PLC请求WCS读码
                    {
                        // 读取plc箱码
                        var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "主扫条码");
                        var (res, boxNo) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos);
                        if (string.IsNullOrWhiteSpace(boxNo.ToString()))
                        {
                            // 箱信息为null写入剔除通道号:0
                            var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "0");
                            if (ret.IsSucceed)
                            {
                                // 写入流程控制字 2
                                var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                if (retVal.IsSucceed)
                                {
                                    Log.Error("箱码为null或已绑定托盘,进行剔除。");
                                    break;
                                }
                            }
                        }
                        else
                        {
                            // 箱码
                            string boxNoVal = boxNo.ToString();
                            // 通道号
                            var modLineNo = modDevice.listStation.FirstOrDefault(m => m.Text == "通道号");
                            // 调用wms接口验证箱码是否可拣货并返回装车口
                            var http = new HttpService();
                            RequestloadingAddre requesModel = http.ResultBoxInfoExportWcs(boxNoVal);
                            if (requesModel.Success != "1")
                            {
                                // 箱信息为null写入剔除通道号:0
                                var ret = plcConn.SetPlcDBValue(modLineNo.PosType, modDevice.DbNumber, modLineNo.PlcPos, "0");
                                if (ret.IsSucceed)
                                {
                                    // 写入流程控制字 2
                                    var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                    if (retVal.IsSucceed)
                                    {
                                        Log.Error("出库分拣根据箱码获取装车口失败,进行剔除。" + requesModel.Message);
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                // 写入出库分道号
                                // var ret = plcConn.SetPlcDBValue(modLineNo.PosType, modDevice.DbNumber, modLineNo.PlcPos, requesModel.loadingAddre);
                                var ret = plcConn.SetPlcDBValue(modLineNo.PosType, modDevice.DbNumber, modLineNo.PlcPos, requesModel.loadingAddre);
                                if (ret.IsSucceed)
                                {
                                    // 写入流程控制字 2
                                    var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                    if (retVal.IsSucceed)
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }; break;
                case "10":
                    // 1楼件箱PLC读码失败,WCS不做处理直接剔除手持拣货。
                    {
                    }; break;
                default:
                    break;
            }
        }
        else
        {
            // 插码交互
            switch (modDevice.Value.ToString())
            switch (modDevice.Value.ToString())
            {
                case "1":
                    // 托盘条码可读
@@ -2151,7 +2295,7 @@
                        // 读取PLC托盘条码号
                        var (res, palletVal) = plcConn.GetPlcDBValue(modPalletNo.PosType, modDevice.DbNumber, modPalletNo.PlcPos);
                        string palletNo = palletVal.ToString();
                        if (string.IsNullOrEmpty(palletNo))
                        if (string.IsNullOrEmpty(palletNo))
                        {
                            Log.Error(string.Format("{0},读取的托盘号为null", modDevice.Text));
                            break;
@@ -2159,18 +2303,18 @@
                        // 根据工位号将托盘号保存在分道表
                        var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
                        if (checkTaskMedel == null)
                        if (checkTaskMedel == null)
                        {
                            Log.Error(string.Format("根据码垛工位{0},获取分道失败!", modDevice.StationNum));
                            break;
                        }
                        checkTaskMedel.PalletNo = palletNo;
                        var rowCount = _db.Updateable(checkTaskMedel).ExecuteCommand();
                        if (rowCount > 0 )
                        if (rowCount > 0)
                        {
                            // plc写入读取成功表示 2
                            var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                            if (retVal.IsSucceed)
                            if (retVal.IsSucceed)
                            {
                                // liudl  此处需添加
                                // 通知分拣码垛页更新
@@ -2190,24 +2334,24 @@
                            var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1");
                            break;
                        }
                        else
                        else
                        {
                            // 获取箱条码
                            // 获取箱条码配置
                            var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "箱条码");
                            var (res, boxVal) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos);
                            string boxNo = boxVal.ToString();
                            if (string.IsNullOrEmpty(boxNo))
                            if (string.IsNullOrEmpty(boxNo))
                            {
                                Log.Error($"码垛工位{modDevice.StationNum},箱码为null插码失败!请人工强制结批。" );
                                Log.Error($"码垛工位{modDevice.StationNum},箱码为null插码失败!请人工强制结批。");
                                // 写入插入结果 2:插码失败
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                                break;
                            }
                            // 验证箱码表是否存在此箱码
                            var boxInfo = _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.BoxNo == boxNo).ToList();
                            if (boxInfo.Count == 0)
                            if (boxInfo.Count == 0)
                            {
                                Log.Error($"码垛工位{modDevice.StationNum},箱码{boxNo}不存在!请人工强制结批。");
                                // 写入插入结果 2:插码失败
@@ -2215,44 +2359,123 @@
                                break;
                            }
                            // 获取当前分道托盘号
                            var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
                            string port = modDevice.StationNum.ToString();
                            var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == port && m.Status == "1");
                            if (checkTaskMedel == null)
                            {
                                Log.Error(string.Format("根据码垛工位{0},获取分道失败!", modDevice.StationNum));
                                break;
                            }
                            string palletNo = checkTaskMedel.PalletNo;
                            if (string.IsNullOrEmpty(palletNo))
                            if (string.IsNullOrEmpty(palletNo))
                            {
                                Log.Error(string.Format("获取码垛工位{0}上的托盘号失败!",modDevice.StationNum));
                                Log.Error(string.Format("获取码垛工位{0}上的托盘号失败!", modDevice.StationNum));
                                break;
                            }
                            // 修改插码表
                            foreach (WcsBoxInfo item in boxInfo)
                            foreach (WcsBoxInfo item in boxInfo)
                            {
                                item.PalletNo = palletNo;
                                item.UpdateTime = DateTime.Now;
                                item.OrderCode = checkTaskMedel.OrderNo;
                            }
                            checkTaskMedel.Qty += boxInfo.First().QtyCount;//记录当前托盘上物料数量
                            _db.Updateable(checkTaskMedel).ExecuteCommand();
                            var rowCount = _db.Updateable(boxInfo).ExecuteCommand();
                            Log.Information(string.Format("插码成功,箱码是:" + boxNo, modDevice.StationNum));
                            if (rowCount > 0)
                            {
                                // 插码成功
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1");
                                //是否结批箱 
                                if (boxInfo[0].EndLotFlag == "1" && retVal.IsSucceed)
                                //if (boxInfo[0].EndLotFlag == "1" && retVal.IsSucceed)
                                //{
                                //    // 触发结批 分道变为结批中
                                //    AutoEndLot(boxInfo[0].LotNo, plcConn, "2");
                                //}
                                if (retVal.IsSucceed)
                                {
                                    // 触发结批 分道变为结批中
                                    AutoEndLot(boxInfo[0].LotNo, plcConn, "2");
                                    //判读是否接收完工数量
                                    var models = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.First().SkuNo && w.LotNo == boxInfo.First().LotNo);
                                    if (models.FinishQty>0)
                                    {
                                        //检查已码垛箱数(不含零箱),码垛数量与完工数量相等后自动结批:写入PLC信号——结批中
                                        int Fqty = (int)models.FinishQty;//完工数量
                                        int Jpqty = 0;//已码垛数量
                                        //获取已组盘数量
                                        var checkNum = _db.Queryable<WcsBoxInfoLog>().Where(m => m.SkuNo == models.SkuNo && m.LotNo == models.LotNo && m.OrderCode == checkTaskMedel.OrderNo).ToList();//组盘表箱码信息
                                        if (checkNum.Count > 0)
                                        {
                                            if (!string.IsNullOrEmpty(checkNum.First().BoxNo2) || !string.IsNullOrEmpty(checkNum.First().BoxNo3))//有支码
                                            {
                                                foreach (var item in checkNum)
                                                {
                                                    Jpqty = (int)(Jpqty + item.Qty);
                                                }
                                            }
                                            else//无支码
                                            {
                                                foreach (var item in checkNum)
                                                {
                                                    Jpqty = (int)(Jpqty + item.QtyCount);
                                                }
                                            }
                                        }
                                        //获取已插码数量
                                        var checkNum2 = _db.Queryable<WcsBoxInfo>().Where(m => m.SkuNo == models.SkuNo && m.LotNo == models.LotNo &&(m.PalletNo != null || m.PalletNo != "") && m.OrderCode == checkTaskMedel.OrderNo).ToList();//箱码表已码垛箱码信息
                                        if (checkNum2.Count > 0)
                                        {
                                            if (!string.IsNullOrEmpty(checkNum2.First().BoxNo2) || !string.IsNullOrEmpty(checkNum2.First().BoxNo3))//有支码
                                            {
                                                foreach (var item2 in checkNum2)
                                                {
                                                    Jpqty = (int)(Jpqty + item2.Qty);
                                                }
                                            }
                                            else//无支码
                                            {
                                                foreach (var item2 in checkNum2)
                                                {
                                                    Jpqty = (int)(Jpqty + item2.QtyCount);
                                                }
                                            }
                                        }
                                        //获取零箱数量
                                        var checkNum3 = _db.Queryable<WcsBoxInfo>().Where(m => m.BitBoxMark == "1" && m.SkuNo == models.SkuNo && m.LotNo == models.LotNo).ToList();
                                        if (checkNum3.Count > 0)
                                        {
                                            if (!string.IsNullOrEmpty(checkNum3.First().BoxNo2) || !string.IsNullOrEmpty(checkNum3.First().BoxNo3))//有支码
                                            {
                                                foreach (var item3 in checkNum3)
                                                {
                                                    Jpqty = (int)(Jpqty + item3.Qty);
                                                }
                                            }
                                            else//无支码
                                            {
                                                foreach (var item3 in checkNum3)
                                                {
                                                    Jpqty = (int)(Jpqty + item3.QtyCount);
                                                }
                                            }
                                        }
                                        if (Jpqty == Fqty)
                                        {
                                            // 触发结批 分道变为结批中
                                            AutoEndLot(boxInfo[0].LotNo, plcConn, "2");
                                        }
                                    }
                                }
                            }
                            else
                            else
                            {
                                // 插码失败
                                Log.Error($"箱码{boxNo};码垛工位{modDevice.StationNum},插码失败,请强制结批");
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                                if (retVal.IsSucceed)
                                if (retVal.IsSucceed)
                                {
                                    // 触发结批 不解绑分道
                                    AutoEndLot(boxInfo[0].LotNo, plcConn, "1");
@@ -2263,8 +2486,8 @@
                    break;
                case "40":
                    // 请求组托,申请入库
                     {
                        lock (OLock)
                    {
                        lock (OLock)
                        {
                            // 根据工位号,获取托盘号
                            var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
@@ -2277,7 +2500,7 @@
                                // 写入交互工位目标地址
                                var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234");
                                if (retVal.IsSucceed)
                                if (retVal.IsSucceed)
                                {
                                    // 写入组托回复流程字
                                    retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
@@ -2300,11 +2523,11 @@
                                    Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg));
                                    break;
                                }
                                else
                                else
                                {
                                    // 获取入库任务信息
                                    var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing));
                                    if (taskModel != null)
                                    if (taskModel != null)
                                    {
                                        // 获取入库取货工位
                                        string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2");
@@ -2359,10 +2582,10 @@
                                        //    taskModel.Status = TaskStatusEnum.Doing;
                                        //    _db.Updateable(taskModel).ExecuteCommand();
                                        //}
                                    }
                                    }
                                }
                            }
                            else
                            else
                            {
                                // 根据托盘号,将组托信息插入boxinfolog表 并删除boxinfo表数据
                                var boxInfoList = _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.PalletNo == palletNo).ToList();
@@ -2379,19 +2602,40 @@
                                    }
                                    break;
                                }
                                //判断托盘上的箱码是否已组盘
                                foreach (var item in boxInfoList)
                                {
                                    var groupBoxno = _db.Queryable<WcsBoxInfoLog>().Where(w => w.BoxNo == item.BoxNo).ToList();
                                    if (groupBoxno.Count>0)
                                    {
                                        Log.Error(string.Format("申请巷道失败,码垛工位{0},箱码信息不存在", modDevice.StationNum));
                                        // 写入交互工位目标地址
                                        var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234");
                                        if (retVal.IsSucceed)
                                        {
                                            // 写入组托回复流程字
                                            retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                        }
                                        break;
                                    }
                                }
                                // 组托成功后将信息存到log表
                                string sqlStr = $"insert into WCSBoxInfoLog select * from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'";
                                int insertCount = _db.Ado.ExecuteCommand(sqlStr);
                                if (insertCount > 0)
                                {
                                    // 组托成功后将信息存到log表
                                    string sqlStr2 = $"delete from WCSBoxInfoLog where  IsDelete=0 and PalletNo='{palletNo}'";
                                    string sqlStr2 = $"delete from WCSBoxInfo where  IsDelete=0 and PalletNo='{palletNo}'";
                                    _db.Ado.ExecuteCommand(sqlStr2);
                                }
                                //组盘成功后清空分拣表当前托盘上物料数量
                                checkTaskMedel.Qty = 0;
                                _db.Updateable(checkTaskMedel).ExecuteCommand();
                                // 向WMS申请巷道
                                var http = new HttpService();
                                string TaskNo = "", EndLocate = "";
                                string strMsg = http.BindRequestRoadWay(checkTaskMedel.OrderNo,palletNo, checkTaskMedel.BoxCount.ToDecimal(),"0", checkTaskMedel.SkuNo, checkTaskMedel.LotNo, "","", boxInfoList,
                                string strMsg = http.BindRequestRoadWay(checkTaskMedel.OrderNo, palletNo, checkTaskMedel.Qty.ToDecimal(), "0", checkTaskMedel.SkuNo, checkTaskMedel.LotNo, "", "", boxInfoList,
                                    modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo);
                                if (strMsg.Contains("-1"))
                                {
@@ -2408,6 +2652,17 @@
                                        var ret1 = plcConn.SetPlcDBValue(checkTaskMedel.PosTypeLot, modDevice.DbNumber, checkTaskMedel.PlcPos, "0");
                                        if (ret1.IsSucceed)
                                        {
                                            //更新入库订单
                                            var orderTask = _db.Queryable<WcsOderTask>().Where(w => w.SkuNo == checkTaskMedel.SkuNo && w.LotNo == checkTaskMedel.LotNo && w.IsDelete == false).ToList();
                                            if (orderTask.Count >0)
                                            {
                                                foreach (var item in orderTask)
                                                {
                                                    item.Status = TaskStatusEnum.Complete;
                                                    _db.Updateable(item).ExecuteCommand();
                                                }
                                            }
                                            //写入流程字成功后更新分拣任务    liudl 最后一托盘申请完入库才可清空
                                            checkTaskMedel.OrderNo = "";
                                            checkTaskMedel.TaskNo = "";
@@ -2418,9 +2673,12 @@
                                            checkTaskMedel.Qty = 0;
                                            checkTaskMedel.PZNo = "";
                                            checkTaskMedel.Status = "0";      // 绑定分道 0:解绑  1:绑定 
                                            checkTaskMedel.FinishQty = 0;
                                            //更新分拣任务
                                            _db.Updateable(checkTaskMedel).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
                                        }
                                    }
                                    // 获取入库任务信息
@@ -2443,7 +2701,7 @@
                                        {
                                            // 写入组托回复流程字
                                            var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                            if (retVal.IsSucceed)
                                            if (retVal.IsSucceed)
                                            {
                                                // 将入库任务由正在执行改为正在执行
                                                taskModel.Status = TaskStatusEnum.Doing;
@@ -2473,24 +2731,25 @@
                        }
                    }
                    break;
                default:break;
            }
                default: break;
            }
        }        
    }
    /// <summary>
    /// 拆垛机器人业务处理
    /// 出库件箱输送和拆垛机器人业务处理
    /// </summary>
    /// <param name="modDevice"></param>
    private static void StackingRobot(WcsDeviceDto modDevice)
    {
        var plcConn = modDevice.PLCUtil;
        if (modDevice.DbNumber == "DB131" && modDevice.DbNumber == "DB132" && modDevice.DbNumber == "DB133" && modDevice.DbNumber == "DB134")
        if (modDevice.DbNumber == "DB131" || modDevice.DbNumber == "DB132" || modDevice.DbNumber == "DB133" || modDevice.DbNumber == "DB134")
        {
            switch (modDevice.Value.ToString())
            {
                case "10"://10  plc请求wcs读托盘码   20 wcs读取ok  wcs 写入数量及规格  30
                    var strMsg = "";
                    //wcs读取ok20
                    var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "20");
                    if (ret.IsSucceed)
                    {
@@ -2505,7 +2764,7 @@
                        // 根据任务号获取任务信息
                        if (res1.IsSucceed)
                        {
                            var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.EndLocate == "009" && m.IsDelete == false);
                            var modTask = _db.Queryable<WcsTask>().First(m => m.TaskNo == tasknoVal && m.EndLocate == "009" && m.IsDelete == false);
                            if (modTask == null)
                            {
                                Log.Error(string.Format($"出库任务未下发,请人工处理,无法拆垛!"));
@@ -2515,45 +2774,42 @@
                            //通过任务号和托盘号向WMS申请此托盘的拆垛信息
                            var http = new HttpService();
                            RequestBoxInfoCheckAll tasklist = http.RequestBoxCheckinfo(palletVal, tasknoVal);
                            if (!tasklist.Success.Contains("-1"))
                            if (tasklist.Success != -1)
                            {
                                //获取拆垛物料品种(需要增加物料判断,同一个物料号可能会出现不同的码垛规则)
                                var pz = _db.Queryable<WcsMateialPzInfo>().First(m => m.SkuNo == tasklist.list[0].SkuNo);
                                var pz = _db.Queryable<WcsMateialPzInfo>().First(m => m.SkuNo == tasklist.data.SkuNo);
                                //下发拆托规格,拆箱数和托盘上总箱数(不绑定机器人,拆垛任务信息只下发一次)
                                // 给PLC写入任务数据
                                var listResult = new List<Result>();
                                // 获取托盘规则
                                var Standard = modDevice.listStation.FirstOrDefault(m => m.Text == "规格");
                                listResult.Add(plcConn.SetPlcDBValue(Standard.PosType, modDevice.DbNumber, Standard.PlcPos, tasklist.list[0].Standard));
                                listResult.Add(plcConn.SetPlcDBValue(Standard.PosType, modDevice.DbNumber, Standard.PlcPos, pz.PZNo));
                                //抓箱数
                                var qty = modDevice.listStation.FirstOrDefault(m => m.Text == "拆箱数量");
                                listResult.Add(plcConn.SetPlcDBValue(qty.PosType, modDevice.DbNumber, qty.PlcPos, tasklist.list[0].Qty.ToString()));
                                listResult.Add(plcConn.SetPlcDBValue(qty.PosType, modDevice.DbNumber, qty.PlcPos, tasklist.data.Qty.ToString()));
                                //总箱数
                                var qtycount = modDevice.listStation.FirstOrDefault(m => m.Text == "总箱数");
                                listResult.Add(plcConn.SetPlcDBValue(qtycount.PosType, modDevice.DbNumber, qtycount.PlcPos, tasklist.list[0].QtyCount.ToString()));
                                listResult.Add(plcConn.SetPlcDBValue(qtycount.PosType, modDevice.DbNumber, qtycount.PlcPos, tasklist.data.QtyCount.ToString()));
                                // 是否写入成功
                                if (listResult.All(s => s.IsSucceed))
                                {
                                    var ret1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "20");
                                    //wcs 写入数量及规格 30
                                    var ret1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "30");
                                }
                                else
                                {
                                    Log.Error(string.Format($"码垛信息未写入!托盘号:"+palletVal+",码垛位:"+modDevice.StationNum));
                                    Log.Error(string.Format($"码垛信息未写入!托盘号:" + palletVal + ",码垛位:" + modDevice.StationNum));
                                    break;
                                }
                            }
                        }
                    }
                    break;
                default:
                    break;
                break;
            }
        }
        }
    }
    /// <summary>