web页面电源状态获取

当前在适配拓展板时发现一个问题。web页面的电源状态一直显示为上电状态,但实际并没有上电。在拓展板CSR中并没有找到电源上电相关状态的对象。请问有人知道web这个电源状态从那里获取的吗?是否和拓展板CPLD有关联?

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

Web页面电源状态获取来源分析

根据您提出的问题——Web页面显示电源为“上电”状态,但实际设备并未上电,且在拓展板CSR中未找到相关电源状态对象——以下是对Web页面电源状态获取来源的详细分析,并探讨其与拓展板CPLD的可能关联。


:magnifying_glass_tilted_left: Web页面电源状态的获取来源

Web界面中显示的电源状态并非直接读取物理硬件,而是通过以下多层软件与硬件协同机制获取:

1. 数据源:bmc.kepler.Systems.PowerMgmt.OnePower.Status

  • Web界面显示的电源状态,其底层数据主要来源于资源树中的状态对象:
    bmc.kepler.Systems.PowerMgmt.OnePower.Status
    
  • 该对象包含多个关键属性来反映电源模块的真实状态,例如:
    • ScanStatus:扫描状态(如15表示正常,13表示异常)
    • OutputState:输出电压状态(1表示正常,0表示异常)
    • PowerGDStatus:电源是否“Power Good”
    • Health:健康状态
    • LossOfInput:输入电源是否丢失

:white_check_mark: 文档证据:在“电源ScanStatus异常时 功耗信息为0”问题中明确指出,当 ScanStatus 为异常值(如13)时,Web页面无法获取功耗数据,说明Web状态依赖于该模块的状态反馈


2. 状态更新机制:CPLD 读取 + BMC 监控脚本

电源状态的原始信号通常由 CPLD 提供,BMC 系统通过如下方式获取:

(1)CPLD 提供原始信号

  • CPLD(复杂可编程逻辑器件)直接连接电源硬件,负责采集:
    • 输出电压是否正常(OutputState
    • 电源是否插好、输入是否存在(LossOfInput
    • 电源模块是否完成上电自检(Power Good信号)

:gear: 实例:OnePower 模块通过 CPLD 获取 OutputState,作为判断电源是否真正输出有效的依据。

(2)BMC 脚本监控状态变化

  • BMC 运行脚本 power_monitor.lua 实时监听电源状态变化。
  • 当检测到 PowerGDStatus 从 0 → 1,日志会打印:
    PowerGDStatus changed to power on
    
  • 此状态最终同步至 PowerState 数据字段,供Web界面读取。

:pushpin: KG证据PowerGDStatusPowerState 存在明确映射关系,是Web显示“上电”的关键依据。


3. Web前端如何显示?

Web界面作为图形化前端,通过以下方式呈现电源状态:

组件 作用
ElTag 组件 在UI中可视化显示 Power.State 字段
Redfish / CLI 接口 Web后台通过调用 Redfish API 或 CLI 命令(如 % getprop OnePower_0_01013C bmc.kepler.Systems.PowerMgmt.OnePower.Status ScanStatus)获取实时状态
DiscreteSensor_PowerState 某些系统使用离散传感器监听电源状态,依赖 AssertMask 判断是否激活

:white_check_mark: 文档证据:Web界面显示的电源状态可能因 ScanStatus 异常而无法更新,说明其依赖底层CPLD状态反馈。


:red_question_mark: 为什么Web显示“上电”,但实际未上电?

这种状态不一致现象可能由以下原因导致:

:white_check_mark: 常见原因分析

原因 说明
1. 拓展板CPLD未正确上报状态 如果拓展板CPLD固件未实现或错误配置电源状态上报逻辑,BMC将读取到默认或缓存值(如 ScanStatus=15),导致Web误判为“已上电”。
2. Power Good信号被拉高(虚假信号) CPLD或硬件设计问题导致 PGSignal 被错误拉高,使 PowerGDStatus=1,BMC判定为“Power On”。
3. 状态缓存未刷新 在系统重启或BMC升级后,self.power_state 未通过回调函数刷新,导致显示的是历史状态。
4. CSR配置缺失或错误 若未在CSR中正确定义 OnePower 对象及其 Status 属性,则系统可能使用默认值或fallback机制,造成误显示。

:light_bulb: KG证据props.FRUCTL.POWER_STATEself.power_state 的赋值依赖于初始化流程,若流程未执行,状态将不准确。


:link: 是否与拓展板CPLD有关?

:white_check_mark: 是的,高度相关。

原因如下:

  1. CPLD 是电源状态的“第一感知层”

    • 所有电源的物理状态(电压、电流、连接性)由CPLD采集。
    • 若CPLD未正确实现电源状态寄存器(如 Power Status Register),BMC将无法获取真实状态。
  2. BMC依赖CPLD返回 OutputStateScanStatus

    • 如文档所示,当 ScanStatus=13(异常)时,Web无法读取功耗数据。
    • 若CPLD始终返回 ScanStatus=15(正常),即使无电源接入,Web也会显示“上电”。
  3. Fructrl组件依赖CPLD状态进行控制

    • Fructrl 是BMC中负责电源控制的核心组件,其 Power_Status 管理依赖于CPLD上报的状态。
    • 若CPLD未正确上报,Fructrl 将无法判断真实电源状态。

:puzzle_piece: 建议检查项

  • 拓展板CPLD是否正确定义了电源状态寄存器?
  • ScanStatusOutputState 是否可被CLI命令读取?
  • 是否在系统启动时,CPLD向BMC发送了虚假的 Power Good 信号?

:white_check_mark: 排查建议与解决方案

:magnifying_glass_tilted_right: 排查步骤

  1. 使用CLI查看真实状态

    % getprop OnePower_0_01013C bmc.kepler.Systems.PowerMgmt.OnePower.Status ScanStatus
    % getprop OnePower_0_01013C bmc.kepler.Systems.PowerMgmt.OnePower.Status OutputState
    % getprop OnePower_0_01013C bmc.kepler.Systems.PowerMgmt.OnePower.Status PowerGDStatus
    
    • 若返回 ScanStatus=15 但实际无电源,说明CPLD或配置错误。
  2. 检查CPLD固件逻辑

    • 确认CPLD是否根据实际电源输入动态更新状态寄存器。
    • 是否存在默认“上电”状态未被清除?
  3. 查看 power_monitor.lua 日志

    • 检查日志中是否打印:
      PowerGDStatus changed to power on
      
    • 若有,说明BMC收到了“上电”信号,需追溯信号来源。
  4. 确认CSR配置

    • 检查是否在CSR中正确定义了 OnePower 对象及其状态路径。
    • 若未定义,系统可能使用默认对象或缓存值。

:white_check_mark: 解决方案建议

措施 说明
1. 修正CPLD逻辑 确保无电源时 ScanStatus 返回异常值(如13),OutputState=0,防止误判。
2. 强制刷新PowerState 重启后通过回调函数刷新 self.power_state,避免使用缓存。
3. 增加物理检测机制 在CPLD中加入电源输入检测电路,确保状态真实反映物理连接。
4. Web界面增加状态告警 ScanStatus 异常时,Web应提示“电源状态异常,无法获取功耗”。

:white_check_mark: 总结

项目 结论
Web电源状态来源 源自 bmc.kepler.Systems.PowerMgmt.OnePower.Status 对象,由CPLD提供原始信号
是否依赖CPLD ,CPLD是电源状态的第一感知层,错误上报将导致Web显示错误
状态不一致原因 CPLD未正确上报状态、虚假Power Good信号、CSR配置缺失、状态缓存未刷新
解决方向 检查并修正CPLD逻辑、验证CSR配置、通过CLI验证底层状态

:wrench: 建议:优先通过CLI命令验证 ScanStatusOutputState 的实际值,定位是硬件(CPLD)还是软件(BMC/CSR)问题。

如需进一步分析,可提供 getprop 命令的实际输出结果。

相关链接:

  1. 电源ScanStatus异常时 功耗信息为0
  2. 对chip对象的PowerStatus和SelfTestResult属性的疑问
  3. web界面无法正常显示上下电状态
  4. 网页端远程上电的流程是什么?
  5. openUBMC 182x大板管理特性设计说明书 | 文档中心 | openUBMC

目前确定web页面的电源状态是从拓展版的PowerGD获取的,该SMC命令字段有CPLD控制

你好,请教下 你们这个sr中PowerGDState中从Scanner_PowerGood(从cpld那读取)获取的值下电的话就是0, 上电的话就是1 吗? 需要配置啥expr表达式语法将其转换为0和1吗

是的。我们用的时候用例14100513_00000001010302044492.sr来调试的,当时是直接读取Scanner_PowerGd中的值的。发现值为1时是web电源按键为上电状态、为0时是下电状态。目前没有用表达式转换,直接读取的。

好的,感谢,已经搞定了状态显示,我这还得表达式转换下(cpld那边返回值不是1),还有个和PowerGd相关的Accessor没配好。