hwh
2024-09-23 0d8b3d25883c158d8ff63e029a30360400fae810
堆垛机不空跑
1个文件已修改
99 ■■■■■ 已修改文件
Admin.NET/WCS.Application/PLC/PLCService.cs 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -665,15 +665,12 @@
    /// </summary>
    /// <param name="modTask">操作完成的任务</param>
    /// <param name="plcConn">plc连接</param>
    private static void ContinuousOperation(WcsTask modTask, PLCUtil plcConn)
    /// <param name="modDevice">设备信息</param>
    private static void ContinuousOperation(WcsTask modTask, PLCUtil plcConn, WcsDeviceDto modDevice)
    {
        //列 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();
        WcsTask modNextTask = null;
        switch (modTask.TaskType)
        {
            case TaskTypeEnum.In:
@@ -696,6 +693,7 @@
                        // todo: 写入modNext任务信息给plc
                        Console.WriteLine($"入库任务{modTask.TaskNo}执行完成后,不空跑逻辑检测下一任务为{modNext.TaskNo}");
                        modNextTask = modNext;
                        break;
                    }
                }
@@ -720,21 +718,106 @@
                        // todo: 写入modNext任务信息给plc
                        Console.WriteLine($"出库任务{modTask.TaskNo}执行完成后,不空跑逻辑检测下一任务为{modNext.TaskNo}");
                        modNextTask = modNext;
                        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 modDevicePos = _db.Queryable<WcsDevice>().Where(s => s.PlcId == plcConn.PlcId && s.DeviceType == DeviceTypeEnum.Show).First();
                    var (result, value) = plcConn.GetPlcDBValue(modDevicePos.PosType, modDevicePos.DbNumber, modDevicePos.PlcPos);
                    //当前堆垛机所在位置
                    var height = Math.Round(value / 790000d * 200).ToInt();
                    //todo:这里看能不能找到堆垛机所在位置在哪个排列层,优先寻找附近的任务?
                }
                break;
        }
        if (modNextTask != null)
        {
            // 获取转换后的起始排列层 06010101
            PlcTaskInfo startTaskInfo = PLCCommon.GetEndPai(modTask.StartRoadway.Substring(1, 2), modTask.StartLocate.Substring(2, 2),
            modTask.StartLocate.Substring(0, 2), modTask.StartLocate.Substring(4, 2),
            modTask.StartLocate.Substring(6, 2));
            // 给PLC写入任务数据
            var listResult = new List<Result>();
            // 任务号托盘号
            var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号");
            listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo));
            var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘码");
            listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
            // 起始排列层
            var modPosRow = modDevice.listStation.FirstOrDefault(s => s.Text == "取货排");
            listResult.Add(plcConn.SetPlcDBValue(modPosRow.PosType, modDevice.DbNumber, modPosRow.PlcPos, startTaskInfo.EndPai));
            var modPosColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "取货列");
            listResult.Add(plcConn.SetPlcDBValue(modPosColumn.PosType, modDevice.DbNumber, modPosColumn.PlcPos, startTaskInfo.EndLie));
            var modPosStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "取货层");
            listResult.Add(plcConn.SetPlcDBValue(modPosStorey.PosType, modDevice.DbNumber, modPosStorey.PlcPos, startTaskInfo.EndCeng));
            // 目标放货工位(固定排列层)
            PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, ((int)modTask.TaskType).ToString(),
                        modTask.StartRoadway, modTask.EndRoadway);
            var modPosEndRow = modDevice.listStation.FirstOrDefault(s => s.Text == "放货排");
            listResult.Add(plcConn.SetPlcDBValue(modPosEndRow.PosType, modDevice.DbNumber, modPosEndRow.PlcPos, taskInfo.EndPai));
            var modPosEndColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "放货列");
            listResult.Add(plcConn.SetPlcDBValue(modPosEndColumn.PosType, modDevice.DbNumber, modPosEndColumn.PlcPos, taskInfo.EndLie));
            var modPosEndStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "放货层");
            listResult.Add(plcConn.SetPlcDBValue(modPosEndStorey.PosType, modDevice.DbNumber, modPosEndStorey.PlcPos, taskInfo.EndCeng));
            // 是否写入成功
            if (listResult.All(s => s.IsSucceed))
            {
                // 写入跺机任务下发完成
                var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "830");
                // 将移库任务待执行改为正在执行
                _db.Updateable<WcsTask>()
                    .SetColumns(s => s.Status == TaskStatusEnum.Doing)
                    .Where(s => s.Id == modTask.Id)
                    .ExecuteCommand();
                HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                WcsTaskMonitor modInsertTaskMonitor;
                if (string.IsNullOrEmpty(taskInfo.EndStation))
                {
                    // 同巷道移库
                    modInsertTaskMonitor = new WcsTaskMonitor()
                    {
                        TaskNo = modTask.TaskNo,
                        PlcId = modDevice.Id,
                        PlcName = modDevice.Text,
                        InteractiveMsg = $"写入指令:{modTask.StartLocate}储位====》{modTask.EndLocate}储位。",
                        PalletNo = modTask.PalletNo,
                        Status = TaskStatusEnum.Complete,
                        StartLocat = modTask.StartLocate,
                        EndLocat = modTask.EndLocate,
                    };
    }
                else
                {
                    // 出库任务 跨巷道移库
                    modInsertTaskMonitor = new WcsTaskMonitor()
                    {
                        TaskNo = modTask.TaskNo,
                        PlcId = modDevice.Id,
                        PlcName = modDevice.Text,
                        InteractiveMsg = $"写入指令:{modTask.StartLocate}储位====》{taskInfo.EndStation}工位。",
                        PalletNo = modTask.PalletNo,
                        Status = TaskStatusEnum.Complete,
                        StartLocat = modTask.StartLocate,
                        EndLocat = modTask.EndLocate,
                    };
                }
                // 插入交互日志
                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                //下发任务日志
                HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                //修改led屏信息
                //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
            }
        }
    }
    /// <summary>
    /// 输送线业务处理