wanshenmean
3 天以前 b690250002ee04f4309e6a90fd16fbfd9bd959e2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotJob.cs
@@ -203,46 +203,65 @@
                    return;
                }
                if (state.CurrentAction == "Picking" || state.CurrentAction == "Puting")
                {
                    return;
                }
                // 轮询获取该设备的待处理任务
                // 优先通过状态中缓存的任务编号查找执行中的任务
                Dt_RobotTask? task = null;
                if (state.CurrentTaskNum.HasValue)
                {
                    task = _taskProcessor.GetTaskByNum(state.CurrentTaskNum.Value);
                }
                // 获取该设备的互斥锁,确保 Job 执行与消息处理互斥
                var robotLock = _stateManager.GetOrCreateLock(ipAddress);
                // 缓存的任务号未找到对应任务时,按设备编码获取新任务
                task ??= _taskProcessor.GetTask(robotCrane);
                // 如果没有获取到待处理任务,且RobotArmObject为1(有物料),则获取该设备执行中的任务
                //if (task == null && state.RobotArmObject == 1)
                // 锁被消息处理器占用时直接跳过本次 tick,等下次调度再执行
                //if (!await robotLock.WaitAsync(TimeSpan.Zero))
                //{
                //    task = _taskProcessor.GetExecutingTask(robotCrane);
                //    return;
                //}
                // 如果有待处理任务
                if (task != null)
                // 获取该设备的互斥锁,确保 Job 执行与消息处理互斥
                await robotLock.WaitAsync();
                try
                {
                    // 获取最新的设备状态
                    var latestState = _stateManager.GetState(ipAddress);
                    if (latestState == null)
                    if (state.CurrentAction == "Picking" || state.CurrentAction == "Puting")
                    {
                        // 状态不存在,可能设备未初始化
                        return;
                    }
                    // 检查任务总数是否未达到上限
                    if (latestState.RobotTaskTotalNum < RobotConst.MaxTaskTotalNum)
                    // 轮询获取该设备的待处理任务
                    // 优先通过状态中缓存的任务编号查找执行中的任务
                    Dt_RobotTask? task = null;
                    if (state.CurrentTaskNum.HasValue)
                    {
                        // 调用工作流编排器执行任务
                        // 编排器会根据当前状态决定下一步动作
                        await _workflowOrchestrator.ExecuteAsync(latestState, task, ipAddress);
                        task = _taskProcessor.GetTaskByNum(state.CurrentTaskNum.Value);
                    }
                    // 缓存的任务号未找到对应任务时,按设备编码获取新任务
                    task ??= _taskProcessor.GetTask(robotCrane);
                    // 如果没有获取到待处理任务,且RobotArmObject为1(有物料),则获取该设备执行中的任务
                    //if (task == null && state.RobotArmObject == 1)
                    //{
                    //    task = _taskProcessor.GetExecutingTask(robotCrane);
                    //}
                    // 如果有待处理任务
                    if (task != null)
                    {
                        // 获取最新的设备状态
                        var latestState = _stateManager.GetState(ipAddress);
                        if (latestState == null)
                        {
                            // 状态不存在,可能设备未初始化
                            return;
                        }
                        // 检查任务总数是否未达到上限
                        if (latestState.RobotTaskTotalNum < RobotConst.MaxTaskTotalNum)
                        {
                            // 调用工作流编排器执行任务
                            // 编排器会根据当前状态决定下一步动作
                            await _workflowOrchestrator.ExecuteAsync(latestState, task, ipAddress);
                        }
                    }
                }
                finally
                {
                    robotLock.Release();
                }
            }
            catch (Exception ex)