IPC-610
2024-09-26 cff60cb1cccf70fe33ed9c951c46143fe41fc43a
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -1217,8 +1217,8 @@
                    #endregion
                }
                break;
            #region 出库交互
            #region 出库交互
            case "420":
                {
                    #region 托盘到达拣选工位/出库口
@@ -1345,6 +1345,95 @@
            #endregion
            #region 叫空托盘跺
            case "50":
                // plc申请空托
                {
                    // 调用WMS空托出库接口,返回出库任务存入出库表
                    var strMsg = "";
                    var http = new HttpService();
                    strMsg = http.IssuePlnOutHouseWcs("1", "205");
                    if (!strMsg.Contains("-1"))
                    {
                        // 写入plc流程字60
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "60");
                    }
                    else
                    {
                        // 申请巷道失败!LED显示
                        Log.Error(string.Format($"工位号:{modDevice.StationNum}申请空托跺失败:{strMsg};"));
                    }
                }
                break;
            case "80":
                // 空托盘跺已到位
                {
                    // 调用wms任务出库任务完成
                    // 获取跺机点位配置
                    var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                    var (res, val) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosTask.PlcPos);
                    // 根据任务号获取任务信息
                    if (res.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)
                        {
                            Log.Error(string.Format($"工位号:{modDevice.StationNum}空托盘到达,未找到对应的任务!任务号{tasknoVal};"));
                            break;
                        }
                        // 写入plc流程字90
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "90");
                        if (ret.IsSucceed)
                        {
                            // 改变任务状态
                            modTask.Status = TaskStatusEnum.Complete;
                            modTask.FinishDate = DateTime.Now;
                            _db.Updateable(modTask).ExecuteCommand();
                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                            var modTaskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = modTask.TaskNo,
                                PlcId = modDevice.Id,
                                PlcName = modDevice.Text,
                                PalletNo = modTask.PalletNo,
                                Status = TaskStatusEnum.Complete,
                                StartLocat = modTask.StartLocate,
                                EndLocat = modTask.EndLocate,
                                InteractiveMsg = $"任务完成"
                            };
                            if (modTask.Origin == "WMS")
                            {
                                // 反馈WMS
                                var requestMode = new TaskRequestWMS()
                                {
                                    TaskNo = modTask.TaskNo,
                                    PalletNo = modTask.PalletNo,
                                    TaskType = ((int)TaskTypeEnum.Out).ToString(),
                                    TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
                                };
                                HttpService httpService = new HttpService();
                                var modResponseTask = httpService.RequestTask(requestMode).Result;
                                if (modResponseTask.StatusCode == 0)
                                {
                                    modTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成";
                                }
                                else
                                {
                                    Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg));
                                }
                            }
                            // 插入交互日志
                            _db.Insertable(modTaskMonitor).ExecuteCommand();
                            //下发任务日志
                            HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                    }
                }
                break;
            #endregion
            default: break;
        }
@@ -1415,7 +1504,7 @@
                            {
                                // 写入流程控制字 2
                                var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                if (retVal.IsSucceed)
                                if (!retVal.IsSucceed)
                                {
                                    Log.Error("演示模式写入分道号失败!");
                                    break;
@@ -1614,9 +1703,9 @@
                    {
                        // 根据工位号,获取托盘号
                        var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
                        // 根据工位号获取托盘线该工位号的配置信息
                        var numModel = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business);
                        var posModel = PLCTaskAction.plcPositions.First(m => m.DeviceId == numModel.Id && m.Text == "目标工位" && m.IsDelete == false);
                        // 根据工位号获取 托盘线该工位号的配置信息
                        var numModel = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId != modDevice.PlcId);
                        var posModel = PLCTaskAction.plcPositions.First(m => m.DeviceId == numModel.Id && m.Text == "目的工位" && m.IsDelete == false);
                        if (checkTaskMedel == null)
                        {
                            Log.Error(string.Format("组托失败根据码垛工位{0},获取托盘号失败!", modDevice.StationNum));
@@ -1634,13 +1723,14 @@
                        // 码垛工位托盘号
                        string palletNo = checkTaskMedel.PalletNo;
                        // 是否演示模式
                        if (PLCTaskAction.boDemo)
                        {
                            // 直接箱wms申请巷道
                            var http = new HttpService();
                            string TaskNo = "", EndLocate = "";
                            string strMsg = http.RequestRoadWay(palletNo, modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo);
                            if (!strMsg.Contains("-1"))
                            if (strMsg.Contains("-1"))
                            {
                                Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg));
                                break;
@@ -1651,13 +1741,14 @@
                                var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && m.Status == TaskStatusEnum.Wait);
                                if (taskModel != null) 
                                {
                                    // 写入码垛工位目标工位,写入交互流程组托成功 执行入库
                                    string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2");     // 获取入库取货工位
                                    // 获取入库取货工位
                                    string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2");
                                    // 写入托盘输送线码垛工位 目的工位,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息}
                                    var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue);
                                    if (retVal.IsSucceed)
                                    {
                                        // 写入组托回复流程字
                                        // 写入码垛交互-组托回复流程字
                                        retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                        // 将入库任务由正在执行改为正在执行
@@ -1707,8 +1798,10 @@
                                var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && m.Status == TaskStatusEnum.Wait);
                                if (taskModel != null)
                                {
                                    // 写入码垛工位目标工位,写入交互流程组托成功 执行入库
                                    string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2");     // 获取入库取货工位
                                    // 获取入库取货工位
                                    string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2");
                                    // 写入托盘输送线码垛工位 目的工位,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息}
                                    var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue);
                                    if (retVal.IsSucceed)
                                    {