wxw
3 天以前 60f0db204b1ef475b8a14ab309e8eeac0db5e208
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -21,6 +21,8 @@
public static class PLCService
{
    private static readonly object OLock = new object();
    private static readonly object RuKuLock = new object();
    private static readonly object OutLock = new object();
    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
    private static decimal weight94 = 0;
@@ -87,12 +89,18 @@
                    {
                        break;//出库锁定打开则不执行出库任务
                    }
                    //判断该巷道有没有到达取货工位的入库任务,优先执行入库任务再执行移库/出库任务
                    var taskIn = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.TaskType == TaskTypeEnum.In && s.EndRoadway == modDevice.StationNum && !string.IsNullOrEmpty(s.EndLocate));
                    if (taskIn != null)
                    {
                        break;
                    }
                    PlcTaskInfo taskInfo = new PlcTaskInfo();
                    if (modTask.TaskType == TaskTypeEnum.Move)
                    {
                        // 移库目标地址
                        taskInfo = PLCCommon.GetEndPai(modTask.EndLocate.Substring(1, 2), modTask.EndLocate.Substring(2, 2),
                        taskInfo = PLCCommon.GetEndPai(modTask.EndLocate.Substring(0, 2), modTask.EndLocate.Substring(2, 2),
                                    modTask.EndLocate.Substring(0, 2), modTask.EndLocate.Substring(4, 2),
                                    modTask.EndLocate.Substring(6, 2));
                        
@@ -108,7 +116,7 @@
                        {
                            #region 跨跺机任务处理     ###########
                            // 判断目标位置是否是跨跺机出库工位
                            if (modTask.EndLocate == "266" && modTask.StartRoadway != "R05")
                            if (modTask.EndLocate == "266")// && modTask.StartRoadway != "R05"
                            {
                                // 判断入库工位是否存在未完成的入库任务
                                var modInTask = _db.Queryable<WcsTask>().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime, OrderByType.Asc)
@@ -133,17 +141,19 @@
                                        break;
                                    }
                                }
                                string aaa = PLCCommon.RoadwayToOutStationNum(modTask.StartRoadway, "1");  // 获取1楼中专工位号
                                taskInfo.Ip = PLCCommon.GetPlcIp(aaa).PlcIP;
                                taskInfo.EndPai = "2";
                                taskInfo.EndLie = "60";
                                taskInfo.EndCeng = "1";
                                taskInfo.EndStation = aaa;
                                if (modTask.StartRoadway != "R05")
                                {
                                    string aaa = PLCCommon.RoadwayToOutStationNum(modTask.StartRoadway, "1");  // 获取1楼中专工位号
                                    taskInfo.Ip = PLCCommon.GetPlcIp(aaa).PlcIP;
                                    taskInfo.EndPai = "2";
                                    taskInfo.EndLie = "60";
                                    taskInfo.EndCeng = "1";
                                    taskInfo.EndStation = aaa;
                                }
                            }
                            if (modTask.EndLocate == "265" && modTask.StartRoadway != "R05" && modTask.StartRoadway != "R06")
                            if (modTask.EndLocate == "265") // && modTask.StartRoadway != "R05" && modTask.StartRoadway != "R06"
                            {
                                // 判断入库工位是否存在未完成的入库任务
                                var modInTask = _db.Queryable<WcsTask>().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime, OrderByType.Asc)
@@ -168,13 +178,15 @@
                                        break;
                                    }
                                }
                                string aaa = PLCCommon.RoadwayToOutStationNum(modTask.StartRoadway, "1");  // 获取1楼中专工位号
                                taskInfo.Ip = PLCCommon.GetPlcIp(aaa).PlcIP;
                                taskInfo.EndPai = "2";
                                taskInfo.EndLie = "60";
                                taskInfo.EndCeng = "1";
                                taskInfo.EndStation = aaa;
                                if (modTask.StartRoadway != "R05" && modTask.StartRoadway != "R06")
                                {
                                    string aaa = PLCCommon.RoadwayToOutStationNum(modTask.StartRoadway, "1");  // 获取1楼中专工位号
                                    taskInfo.Ip = PLCCommon.GetPlcIp(aaa).PlcIP;
                                    taskInfo.EndPai = "2";
                                    taskInfo.EndLie = "60";
                                    taskInfo.EndCeng = "1";
                                    taskInfo.EndStation = aaa;
                                }
                            }
                            // 写入放货工位固定地址
@@ -378,6 +390,14 @@
                                        var retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640");
                                        if (retc.IsSucceed)
                                        {
                                            // 再次读取wcs控制字,确保写入成功640
                                            var (ress2, va1s2) = plcConveyorConn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos);
                                            if (va1s2.ToString() == "630")//还是等于630说明640没有写入成功,再次写入640
                                            {
                                                retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640");
                                                Log.Information($"840垛机取货完成写入640失败后再次写入,DbNumber:{ConveyorMod.DbNumber}");
                                            }
                                            modcTaskMonitor.InteractiveMsg = string.Format("工位:{0},写入取货完成:640", startStationVal);
                                            // 插入交互日志
                                            _db.Insertable(modcTaskMonitor).ExecuteCommand();
@@ -824,14 +844,14 @@
                                break;
                            case TaskTypeEnum.Move:       // 移库任务
                                {
                                    var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号");
                                    var result = plcConn.SetPlcDBValueRepeat(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo);
                                    if (!result.IsSucceed)
                                    {
                                        Log.Error($"{modDevice.Text}写入任务号失败");
                                        break;
                                    }
                                    result = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "870");
                                    //var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号");
                                    //var result = plcConn.SetPlcDBValueRepeat(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo);
                                    //if (!result.IsSucceed)
                                    //{
                                    //    Log.Error($"{modDevice.Text}写入任务号失败");
                                    //    break;
                                    //}
                                    var result = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "870");
                                    if (!result.IsSucceed)
                                    {
                                        Log.Error($"{modDevice.Text}控制字写入870失败");
@@ -1200,55 +1220,59 @@
        #region#实时显示重量到LED屏幕
        var modPosPalletWeightIng = modDevice.listStation.FirstOrDefault(m => m.Text == "实际重量");
        var (resPalletWeightIng, palletWeightValIng) = plcConn.GetPlcDBValue(modPosPalletWeightIng.PosType, modDevice.DbNumber, modPosPalletWeightIng.PlcPos);
        switch (modDevice.StationNum)
        if (modPosPalletWeightIng != null)
        {
            case "094":
                {
                    if (Convert.ToDecimal(palletWeightValIng) != weight94)
            var (resPalletWeightIng, palletWeightValIng) = plcConn.GetPlcDBValue(modPosPalletWeightIng.PosType, modDevice.DbNumber, modPosPalletWeightIng.PlcPos);
            switch (modDevice.StationNum)
            {
                case "094":
                    {
                        LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                        weight94 = Convert.ToDecimal(palletWeightValIng);
                        if (Convert.ToDecimal(palletWeightValIng) != weight94)
                        {
                            LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                            weight94 = Convert.ToDecimal(palletWeightValIng);
                        }
                    }
                }
                break;
            case "160":
                {
                    if (Convert.ToDecimal(palletWeightValIng) != weight160)
                    break;
                case "160":
                    {
                        LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                        weight160 = Convert.ToDecimal(palletWeightValIng);
                        if (Convert.ToDecimal(palletWeightValIng) != weight160)
                        {
                            LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                            weight160 = Convert.ToDecimal(palletWeightValIng);
                        }
                    }
                }
                break;
            case "155":
                {
                    if (Convert.ToDecimal(palletWeightValIng) != weight155)
                    break;
                case "155":
                    {
                        LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                        weight155 = Convert.ToDecimal(palletWeightValIng);
                        if (Convert.ToDecimal(palletWeightValIng) != weight155)
                        {
                            LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                            weight155 = Convert.ToDecimal(palletWeightValIng);
                        }
                    }
                }
                break;
            case "152":
                {
                    if (Convert.ToDecimal(palletWeightValIng) != weight152)
                    break;
                case "152":
                    {
                        LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                        weight152 = Convert.ToDecimal(palletWeightValIng);
                        if (Convert.ToDecimal(palletWeightValIng) != weight152)
                        {
                            LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                            weight152 = Convert.ToDecimal(palletWeightValIng);
                        }
                    }
                }
                break;
            case "153":
                {
                    if (Convert.ToDecimal(palletWeightValIng) != weight153)
                    break;
                case "153":
                    {
                        LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                        weight153 = Convert.ToDecimal(palletWeightValIng);
                        if (Convert.ToDecimal(palletWeightValIng) != weight153)
                        {
                            LedDisplay(modDevice.LedIP, $"当前重量(KG):{Convert.ToDecimal(palletWeightValIng)}");
                            weight153 = Convert.ToDecimal(palletWeightValIng);
                        }
                    }
                }
                break;
                    break;
            }
        }
        #endregion
@@ -1442,7 +1466,28 @@
                    var http = new HttpService();
                    string TaskNo = "", EndLocate = "";
                    strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, louCeng, ref EndLocate, ref TaskNo, (int)palletHeightVal);
                    //根据工位判断是否为叠托机工位申请空托盘跺入库,是:向WMS申请空托盘跺组托
                    string groupMsg = "";
                    if (modDevice.StationNum == "72")
                    {
                        groupMsg = http.BindNullPalletWcs(10, palletVal);
                        if (groupMsg.Contains("-1"))
                        {
                            // 写入输送线退回指令
                            var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum);
                            if (ret.IsSucceed)
                            {
                                plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350");
                            }
                            break;
                        }
                    }
                    //向WMS申请巷道
                    strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, louCeng, ref EndLocate, ref TaskNo, (int)palletHeightVal, Convert.ToString(palletWeightVal));
                    if (!strMsg.Contains("-1"))
                    {
@@ -1789,9 +1834,12 @@
                    #endregion
                    var http = new HttpService();
                    string TaskNo = "";
                    // 向WMS申请储位信息
                    strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, roadway, ref TaskNo, (int)taskInfo2.PalletQty);
                    string TaskNo = "";
                    lock (RuKuLock)
                    {
                        // 向WMS申请储位信息
                        strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, roadway, ref TaskNo, (int)taskInfo2.PalletQty);
                    }
                    // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                    var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo);
@@ -2168,7 +2216,7 @@
                        {
                            // 跺机非空闲等待
                            break;
                        }
                        }
                        // 给PLC写入任务数据
                        var listResult = new List<Result>();
@@ -2363,15 +2411,18 @@
                                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));
                            lock(OutLock)
                            {
                                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));
                                }
                            }
                        }
@@ -2763,6 +2814,7 @@
                            var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                            break;
                        }
                        int chaNum = 0;
                        for (int i = 1; i <= boxNum; i++)
                        {
                            // 获取箱条码
@@ -2773,8 +2825,11 @@
                            if (string.IsNullOrEmpty(boxNo))
                            {
                                Log.Error(string.Format("码垛工位{0},箱码为null插码失败!请人工强制结批。", modDevice.StationNum));
                                // 写入插入结果 2:插码失败
                                plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                                break;
                            }
                            Log.Information($"PLC请求插码,托盘号:{palletNo},箱码:{boxNo}");
                            // 验证箱码表是否存在此箱码
                            var boxInfo = _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.BoxNo == boxNo).ToList();
                            if (boxInfo.Count == 0)
@@ -2799,20 +2854,24 @@
                                plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                                break;
                            }
                            chaNum++;
                        }
                        // 插码成功
                        var retVal2 = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1");
                        if (retVal2.IsSucceed)
                        if (chaNum == boxNum)
                        {
                            //更新已插码数量
                            checkTaskMedel.BoxCount += boxNum;
                            _db.Updateable(checkTaskMedel).ExecuteCommand();
                        }
                        else
                        {
                            // 写入失败
                            Log.Error(string.Format("写入PLC插码结果失败,码垛工位{1},托盘号{2}", modDevice.StationNum, palletNo));
                        }
                            // 插码成功
                            var retVal2 = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1");
                            if (retVal2.IsSucceed)
                            {
                                //更新已插码数量
                                checkTaskMedel.BoxCount += boxNum;
                                _db.Updateable(checkTaskMedel).ExecuteCommand();
                            }
                            else
                            {
                                // 写入失败
                                Log.Error(string.Format("写入PLC插码结果失败,码垛工位{1},托盘号{2}", modDevice.StationNum, palletNo));
                            }
                        }
                    }
                    break;
                case "40":