| | |
| | | |
| | | // 初始化命令处理器 |
| | | // 简单命令处理器:处理状态更新等简单命令 |
| | | var simpleCommandHandler = new RobotSimpleCommandHandler(_taskProcessor, socketGateway, _logger); |
| | | var simpleCommandHandler = new RobotSimpleCommandHandler(_taskProcessor, socketGateway, _logger, _stateManager); |
| | | // 前缀命令处理器:处理 pickfinished、putfinished 等带参数的命令 |
| | | var prefixCommandHandler = new RobotPrefixCommandHandler(robotTaskService, _taskProcessor, _stateManager, socketGateway, fakeBatteryPositionService, _logger); |
| | | |
| | |
| | | return; |
| | | } |
| | | |
| | | if (state.CurrentAction == "Picking" || state.CurrentAction == "Puting") |
| | | { |
| | | return; |
| | | } |
| | | |
| | | // 轮询获取该设备的待处理任务 |
| | | var task = _taskProcessor.GetTask(robotCrane); |
| | | // 获取该设备的互斥锁,确保 Job 执行与消息处理互斥 |
| | | var robotLock = _stateManager.GetOrCreateLock(ipAddress); |
| | | |
| | | // 如果没有获取到待处理任务,且RobotArmObject为1(有物料),则获取该设备执行中的任务 |
| | | if (task == null && state.RobotArmObject == 1) |
| | | { |
| | | task = _taskProcessor.GetExecutingTask(robotCrane); |
| | | } |
| | | // 锁被消息处理器占用时直接跳过本次 tick,等下次调度再执行 |
| | | //if (!await robotLock.WaitAsync(TimeSpan.Zero)) |
| | | //{ |
| | | // 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) |