关于电源主备的问题

1.问题现象:

在设置为主备模式的情况下,AC后重新上电,电源会自动切回主备模式,且web端显示两个电源状态为备用电源。但实际的工作模式却不是主备模式(即不是下图的01h或者02h),但却返回了“备用”状态

2.问题原因:

AC上电后,模组并为上电。此时电源处关机状态(即STATUS_BYTE寄存器,OFF位为1),无电压输出。在此状态下,是无法设置主备状态的,工作模式处于标准冗余态(00h)。

3.set_power_mode伪代码

function pmbus.set_power_mode(mode):
    log("Setting work mode: " + mode)
    CONTROL_CMD = 0xD0
    
    if mode == ACTIVE_MODE:
        log("Power" + ps_id + " switching to active")
        write_chip_byte(CONTROL_CMD, COLD_ACTIVE)
    elif mode == STANDBY_MODE:
        log("Power" + ps_id + " switching to standby")
        write_chip_byte(CONTROL_CMD, COLD_STANDBY1)

get_work_mode伪代码

function pmbus.get_work_mode():
    CONTROL_CMD = 0xD0
    try:
        work_mode = chip_read_byte(CONTROL_CMD)
        log("Power" + ps_id + " work mode: " + work_mode)
        return (work_mode == 1) ? "ACTIVE_MODE" : "STANDBY_MODE"
    except:
        log_error("Get work mode failed")
        return "ACTIVE_MODE"

4.问题:

(1).在设置为主备模式的情况下,AC后重新上电,电源会自动切回主备模式?日志里显示确实是会切换到主备模式的。

(2) .在电源处关机状态(即STATUS_BYTE寄存器,OFF位为1)时,get_work_mode()如何返回一个“负载均衡”状态。或者在AC上电后不自动切换为主备模式。

你这是CRPS标准的电源工作模式定义吧,实际当前的PSU工作模式就只有两个值,不太好硬套

是的

答案内容由AI生成,仅供参考:

问题现象分析

在设置电源为主备模式(Active/Standby)后,系统经历AC断电再上电过程。重新上电过程中,Web界面显示两个电源均处于“备用”状态,且日志表明系统尝试恢复主备模式配置。然而,实际的电源工作模式并未正确切换至主备模式(即未进入01h或02h状态),而是停留在标准冗余模式(00h)。这导致了显示状态与实际运行状态不一致的问题:虽然系统声称已切换回主备模式,但底层硬件并未真正执行该模式切换。

此外,在电源处于关机状态(STATUS_BYTE寄存器中OFF位为1,表示无输出电压)时,调用get_work_mode()函数仍可能返回“备用”状态,而无法准确反映当前不可操作的真实状态。


问题原因解析

根据提供的伪代码和行为描述,根本原因如下:

  1. AC上电初期电源未供电,无法响应控制命令
    在AC刚恢复时,电源模块本身尚未完成初始化并建立稳定电压输出(即仍处于OFF状态),此时其内部控制寄存器(如用于设置工作模式的CONTROL_CMD = 0xD0)无法被正常访问或写入。因此,即使BMC侧尝试通过set_power_mode()发送主备模式指令(如COLD_STANDBY1),这些命令将无效或被忽略,导致模式切换失败。

  2. get_work_mode()函数缺乏对电源运行状态的前置判断
    当前get_work_mode()实现直接读取CONTROL_CMD寄存器值,并据此判断为主用或备用模式。但在电源未激活(OFF位为1)的情况下,该寄存器读取结果可能是默认值、缓存值或无效值,从而导致误判。例如:

    • 若默认值为0x01,则会被错误地解释为“ACTIVE_MODE”;
    • 即使电源未启用,函数也未检查STATUS_BYTE中的OFF标志,直接返回基于 CONTROL_CMD 的结果,造成状态误导
  3. 系统启动流程中模式重置逻辑存在问题
    日志显示系统确实尝试在AC后恢复主备模式,说明存在自动切换逻辑。但由于此操作发生在电源尚未准备好时,写入失败。更严重的是,后续未进行状态验证与重试机制,导致假性成功上报——即软件认为已设置成功,但硬件未响应。


针对具体问题的解答

(1)为何在主备模式下AC后会尝试自动切回主备模式?

这是由系统的电源策略组件 power_strategy 所驱动的行为。根据知识库信息,power_strategy 是负责管理电源模式切换的核心模块,支持主备(main-backup)与负载均衡(load-balancing)之间的自动转换。它会在系统启动阶段依据持久化配置或默认策略,尝试恢复预设的电源工作模式。

尽管这一行为符合设计预期(即记忆上次模式),但问题在于切换时机不当power_strategy 在 BMC 初始化早期即触发 RedundancyFailure 状态变更和模式设置动作,而此时 PSU 可能还未完成自检和输出准备,导致命令失效。

(2)如何避免在电源关机状态下错误返回“负载均衡”或“备用”状态?是否可以禁止AC后自动切换?

  • 改进 get_work_mode() 的健壮性
    应在读取 CONTROL_CMD 寄存器前,先读取 STATUS_BYTE 寄存器并检测 OFF 位:

    function get_work_mode():
        status_byte = chip_read_byte(STATUS_BYTE)
        if (status_byte & OFF_BIT):  # 电源未开启
            return "POWER_OFF"
        
        work_mode = chip_read_byte(CONTROL_CMD)
        return (work_mode == COLD_ACTIVE) ? "ACTIVE_MODE" : "STANDBY_MODE"
    

    这样可确保只有在电源已激活的前提下才返回有效模式,避免误判。

  • 延迟模式设置直至电源就绪
    建议 power_strategypower_mgmt 组件引入依赖检测机制,仅当检测到所有 PSU 的 STATUS_BYTE 中 OFF 位为0(即已输出)后再执行主备模式设置。可通过轮询或事件通知方式实现。

  • 提供配置开关以禁用自动切换
    根据知识库中提到的 CSR 配置字典建议,可新增一个配置项(如 AutoRestorePowerMode),允许用户选择是否在重启后自动恢复之前的电源模式。若关闭,则保持默认的标准冗余模式(00h),避免不必要的切换风险。


总结与建议

当前问题的本质是电源控制逻辑与时序协调缺失所致。建议采取以下措施修复:

  1. 修改 get_work_mode() 函数,加入对电源运行状态(STATUS_BYTE.OFF)的检查;
  2. 调整 power_strategy 的模式恢复逻辑,确保在 PSU 完全就绪后再执行模式设置;
  3. 引入配置项,允许禁用 AC 后自动恢复主备模式的功能;
  4. 增加模式设置后的状态验证与重试机制,提升可靠性。

以上优化可从根本上解决“显示状态与实际不符”及“无效切换”的问题,增强系统稳定性与用户体验。

AI的回复确实是直戳问题痛点。如采用修改 get_work_mode() 函数方式的话,如何返回“负载均衡”状态。代码目前只有“主用(Enabled)”和“备用(StandbySpare)”模式两种。

当前在2个电源下会有主备模式和负载均衡模式,并且从联机帮助中有说明,什么情况下会进行模式之间的自动切换。

当前不涉及CRPS标准的电源工作模式定义。