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()函数仍可能返回“备用”状态,而无法准确反映当前不可操作的真实状态。
问题原因解析
根据提供的伪代码和行为描述,根本原因如下:
-
AC上电初期电源未供电,无法响应控制命令
在AC刚恢复时,电源模块本身尚未完成初始化并建立稳定电压输出(即仍处于OFF状态),此时其内部控制寄存器(如用于设置工作模式的CONTROL_CMD = 0xD0)无法被正常访问或写入。因此,即使BMC侧尝试通过set_power_mode()发送主备模式指令(如COLD_STANDBY1),这些命令将无效或被忽略,导致模式切换失败。
-
get_work_mode()函数缺乏对电源运行状态的前置判断
当前get_work_mode()实现直接读取CONTROL_CMD寄存器值,并据此判断为主用或备用模式。但在电源未激活(OFF位为1)的情况下,该寄存器读取结果可能是默认值、缓存值或无效值,从而导致误判。例如:
- 若默认值为0x01,则会被错误地解释为“ACTIVE_MODE”;
- 即使电源未启用,函数也未检查STATUS_BYTE中的OFF标志,直接返回基于 CONTROL_CMD 的结果,造成状态误导。
-
系统启动流程中模式重置逻辑存在问题
日志显示系统确实尝试在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_strategy 或 power_mgmt 组件引入依赖检测机制,仅当检测到所有 PSU 的 STATUS_BYTE 中 OFF 位为0(即已输出)后再执行主备模式设置。可通过轮询或事件通知方式实现。
-
提供配置开关以禁用自动切换:
根据知识库中提到的 CSR 配置字典建议,可新增一个配置项(如 AutoRestorePowerMode),允许用户选择是否在重启后自动恢复之前的电源模式。若关闭,则保持默认的标准冗余模式(00h),避免不必要的切换风险。
总结与建议
当前问题的本质是电源控制逻辑与时序协调缺失所致。建议采取以下措施修复:
- 修改
get_work_mode() 函数,加入对电源运行状态(STATUS_BYTE.OFF)的检查;
- 调整
power_strategy 的模式恢复逻辑,确保在 PSU 完全就绪后再执行模式设置;
- 引入配置项,允许禁用 AC 后自动恢复主备模式的功能;
- 增加模式设置后的状态验证与重试机制,提升可靠性。
以上优化可从根本上解决“显示状态与实际不符”及“无效切换”的问题,增强系统稳定性与用户体验。
AI的回复确实是直戳问题痛点。如采用修改 get_work_mode() 函数方式的话,如何返回“负载均衡”状态。代码目前只有“主用(Enabled)”和“备用(StandbySpare)”模式两种。
wwhh
(Wwhh)
6
当前在2个电源下会有主备模式和负载均衡模式,并且从联机帮助中有说明,什么情况下会进行模式之间的自动切换。
当前不涉及CRPS标准的电源工作模式定义。