liudl
2025-03-13 b71144811c970ddb7296f5243f722ec6b00cf805
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");//获取叠托机叠托数量
                        if (!groupMsg.Contains("-1"))
                        groupMsg = http.BindPlnInHouseWcs(Qty.ToString(), palletVal);
                        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;
                        }
                    }
                    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,7 +1442,7 @@
                            InteractiveMsg = $"写入指令430:托盘到达{modDevice.StationNum}工位",
                            PalletNo = palletVal,
                            Status = TaskStatusEnum.Complete,
                            StartLocat = starVal,
                            StartLocat = starVal.ToString(),
                            EndLocat = modDevice.StationNum,
                        };
@@ -1777,6 +1783,7 @@
                                    // 插入任务明细 
                                    var modInsertTaskMonitor = new WcsTaskMonitor()
                                    {
                                        TaskNo = tasknoVal,
                                        PlcId = modDevice.Id,
                                        PlcName = modDevice.Text,
                                        InteractiveMsg = $"写入指令151:{modDevice.StationNum}工位可接受AGV放货入库",
@@ -1845,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")
        {
            // 主扫交互流程
@@ -1861,12 +1868,20 @@
                            var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "通道号");
                            // 演示模式直接写入分道号
                            Random random = new Random();
                            int ranNumber = random.Next(2) == 0 ? 1 : 5;
                            var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, ranNumber.ToString());
                            //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("分道成功,道号是:" + ranNumber));
                                Log.Information(string.Format("分道成功,道号是:" + fendao));
                                // 写入流程控制字 2
                                var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                if (!retVal.IsSucceed)
@@ -2187,6 +2202,84 @@
                default: break;
            }
        }
        //一楼主扫分道
        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  
        {
            // 插码交互
@@ -2281,6 +2374,7 @@
                            {
                                item.PalletNo = palletNo;
                                item.UpdateTime = DateTime.Now;
                                item.OrderCode = checkTaskMedel.OrderNo;
                            }
                            var rowCount = _db.Updateable(boxInfo).ExecuteCommand();
@@ -2296,6 +2390,13 @@
                                    // 触发结批 分道变为结批中
                                    AutoEndLot(boxInfo[0].LotNo, plcConn, "2");
                                }
                                //检查已码垛箱数,码垛数量与完工数量相等后自动结批
                                //var finishiqty = _db.Queryable<WcsBoxInfoLog>().Count(m => m.SkuNo = )
                                //if (true)
                                //{
                                //}
                            }
                            else 
                            {
@@ -2429,6 +2530,24 @@
                                    }
                                    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);
@@ -2540,7 +2659,8 @@
            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)
                    {
@@ -2586,6 +2706,7 @@
                                // 是否写入成功
                                if (listResult.All(s => s.IsSucceed))
                                {
                                    //wcs 写入数量及规格 30
                                    var ret1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "30");
                                }
@@ -2597,89 +2718,9 @@
                            }
                        }
                    }
                    break;
                default:
                    break;
            }
        }
        else
        {
            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 != "0")
                            {
                                // 箱信息为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);
                                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;
            }
        }
    }
    /// <summary>