| | |
| | | || task.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode(); |
| | | } |
| | | |
| | | // 如果是组盘任务(包括换盘) |
| | | // 如果是组盘任务 |
| | | if (task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode()) |
| | | { |
| | | // 生成托盘条码前缀 |
| | | const string prefix = "TRAY"; |
| | | |
| | | // 生成两个托盘条码(用于组盘操作) |
| | | // 生成两个托盘条码(用于组盘操作)(测试用,后续读取线体条码) |
| | | string trayBarcode1 = RobotBarcodeGenerator.GenerateTrayBarcode(prefix); |
| | | string trayBarcode2 = RobotBarcodeGenerator.GenerateTrayBarcode(prefix); |
| | | |
| | |
| | | QuartzLogger.Error($"生成托盘条码失败", stateForUpdate.RobotCrane.DeviceName); |
| | | } |
| | | } |
| | | else if (task.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode()) |
| | | { |
| | | // 换盘任务 |
| | | // 目标:正常电芯抓取完成后,补充假电芯至48个 |
| | | const int targetTotal = 48; |
| | | const int fakeBatteryPickPosition = 5; // 假电芯抓取位置 |
| | | const int pickCountPerExecution = 4; // 每次抓取数量 |
| | | |
| | | int targetNormalCount = task.RobotTaskTotalNum; // 正常电芯目标数量 |
| | | int currentCompletedCount = stateForUpdate.RobotTaskTotalNum; // 已完成数量 |
| | | |
| | | // 如果目标数量为48,直接下发正常任务 |
| | | if (targetNormalCount == targetTotal) |
| | | { |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate); |
| | | } |
| | | // 如果已完成数量小于目标数量,继续抓取正常电芯 |
| | | else if (currentCompletedCount < targetNormalCount) |
| | | { |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate); |
| | | } |
| | | // 正常电芯已完成,进入假电芯补充模式 |
| | | else if (currentCompletedCount == targetNormalCount && !stateForUpdate.IsInFakeBatteryMode) |
| | | { |
| | | // 首次进入假电芯模式,设置标志 |
| | | stateForUpdate.IsInFakeBatteryMode = true; |
| | | _logger.LogInformation("HandlePutFinishedStateAsync:正常电芯抓取完成,进入假电芯补充模式,任务号: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"正常电芯抓取完成,进入假电芯补充模式", stateForUpdate.RobotCrane?.DeviceName); |
| | | } |
| | | |
| | | // 如果处于假电芯补充模式,计算并下发补数任务 |
| | | if (stateForUpdate.IsInFakeBatteryMode) |
| | | { |
| | | int remaining = targetTotal - currentCompletedCount; |
| | | if (remaining > 0) |
| | | { |
| | | // 计算每次抓取的数量(最多4个) |
| | | int pickCount = Math.Min(pickCountPerExecution, remaining); |
| | | |
| | | // 获取可用的假电芯平面点位 |
| | | var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(pickCount); |
| | | if (positions.Count == 0) |
| | | { |
| | | _logger.LogError("HandlePutFinishedStateAsync:无可用假电芯点位,任务号: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Error($"无可用假电芯点位", stateForUpdate.RobotCrane?.DeviceName); |
| | | return; |
| | | } |
| | | |
| | | // 下发假电芯取货指令 |
| | | await _taskProcessor.SendSocketRobotFakeBatteryPickAsync(task, stateForUpdate, positions); |
| | | } |
| | | else |
| | | { |
| | | // 假电芯补充完成,重置标志 |
| | | stateForUpdate.IsInFakeBatteryMode = false; |
| | | _logger.LogInformation("HandlePutFinishedStateAsync:换盘任务完成,任务号: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"换盘任务完成", stateForUpdate.RobotCrane?.DeviceName); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 非组盘任务,直接发送取货指令 |