adc上下门限设置问题

我再root.sr中

“Entity_AdcSensor_1V2”: {
“Id”: 100,
“Name”: “Adc voltage Sensor”,
“PowerState”: 1,
“Presence”: 1,
“Instance”: 100
},
“ThresholdSensor_AdcSensor_1V2”: {
“OwnerId”: 32,
“OwnerLun”: 0,
“EntityId”: “<=/Entity_AdcSensor_1V2.Id”,
“EntityInstance”: “<=/Entity_AdcSensor_1V2.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 2,
“ReadingType”: 1,
“SensorName”: “P1V2”,
“Unit”: 0,
“BaseUnit”: 4,
“ModifierUnit”: 0,
“Analog”: 1,
“NominalReading”: 120,
“NormalMaximum”: 126,
“NormalMinimum”: 114,
“MaximumReading”: 127,
“MinimumReading”: 0,
“Reading”: “<=/Scanner_Adc_0.Value |> expr($1 / 10)”,
“AssertMask”: 516,
“DeassertMask”: 516,
“ReadingMask”: 4626,
“Linearization”: 0,
“RBExp”: 208,
“M”: 20,
“UpperNonrecoverable”: 72,
“UpperCritical”: 66,
“UpperNoncritica”: 63,
“LowerNonrecoverable”: 48,
“LowerCritical”: 54,
“LowerNonCritical”: 57,
“PositiveHysteresis”: 4,
“NegativeHysteresis”: 4
},

根据sensor | 文档中心 | openUBMC 查看了字段意义,

我发现设置的上下门限值,只有两个生效,其他的四个值不生效不显示。

~ ~ $ ipmcget -t sensor -d list
sensor id | sensor name | value | unit | status | lnr | lc | lnc | unc | uc | unr | phys | nhys
0x3 | 1711 Core Temp | 52.000 | degrees C | ok | na | na | na | 105.000 | na | na | 2.000 | 2.000
0x5 | P1V2 | 1.780 | Volts | cr | na | 1.080 | na | na | 1.320 | na | 0.080 | 0.080
0x6 | P1V8 | 0.890 | Volts | cr | na | 1.620 | na | na | 1.980 | na | 0.040 | 0.040

而且我发现生效的那两个值,还需要乘上系数 ”M“字段,是这样的吗?

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

ADC传感器上下门限设置问题分析与解答

根据您提供的配置和现象,以下是对ADC传感器上下门限设置问题的详细分析和解答。

问题一:为何只有两个门限值生效,其他四个不显示?

:pushpin: 根本原因:ReadingMask 掩码配置限制

您的配置中只显示了 Lower Critical (LC)Upper Critical (UC) 两个门限值,而其余4个门限(LNR, LNC, UNC, UNR)未显示,其根本原因是 ReadingMask 的值为 4626,它限制了哪些门限能在外部(如WEB界面、CLI命令)显示。

:magnifying_glass_tilted_left: ReadingMask 的作用和解析

  • ReadingMask 定义:该字段是一个16位的位掩码,用于控制门限传感器的6个阈值(上/下限的紧急、严重、一般)是否对外可见。

  • 标准定义参考(来自 IPMI 规范):

    • Bit 2: Lower Non-Recoverable Threshold
    • Bit 3: Lower Critical Threshold
    • Bit 4: Lower Non-Critical Threshold
    • Bit 5: Upper Non-Critical Threshold
    • Bit 6: Upper Critical Threshold
    • Bit 7: Upper Non-Recoverable Threshold
  • 计算 4626 的二进制表示

    4626 = 1001000010010₂
    

    从低位开始(Bit 0~Bit 15),该掩码实际置位的位为:

    • Bit 1 (十进制2)
    • Bit 4 (十进制16)
    • Bit 8 (十进制256)
    • Bit 12 (十进制4096)

    这些位(2, 16, 256, 4096)加起来正好是 2 + 16 + 256 + 4096 = 4370,但 4626 ≠ 4370。说明您的 4626不完全符合标准门限掩码,可能存在冲突或误配。

:white_check_mark: 正确的 ReadingMask 配置方法

若想让所有6个门限都对外可见,应设置 ReadingMask0x7F3(十进制 2035),其含义如下:

0x7F3 = 11111110011₂

对应:

  • Bit 1: Set → 启用 Lower Non-Critical
  • Bit 2: Set → 启用 Lower Non-Recoverable
  • Bit 3: Set → 启用 Lower Critical
  • Bit 4: Set → 启用 Upper Non-Critical
  • Bit 5: Set → 启用 Upper Critical
  • Bit 6: Set → 启用 Upper Non-Recoverable

建议修改为
"ReadingMask": 2035

若仍使用 4626,很可能导致系统仅识别部分有效位,从而只显示 LC 和 UC。


问题二:为何实际显示的门限值需要乘以“M”系数?

:white_check_mark: 是的,显示值需通过转换公式还原为真实电压值

:wrench: ADC传感器的值转换机制

ADC原始读数是硬件采集的无量纲数值,必须通过转换公式才能还原为真实物理值(如电压)。转换通常遵循 IPMI 标准定义的 Linearization Formula,公式如下:

$$
\text{Physical Reading} = (M \times \text{Raw Reading} + (M \times \text{RB_Exp})) / 100
$$

但在 openUBMC 中,您还额外使用了表达式转换:

"Reading": "<=/Scanner_Adc_0.Value |> expr($1 / 10)"

这意味着:

  1. 原始ADC值 → 被除以 10 → 再参与后续逻辑。

:bar_chart: 举例说明您的配置

您设置如下参数:

  • "M": 20
  • "RBExp": 208
  • 实际电压预期:1.2V (nominal)

假设原始ADC值为 120(对应原始“P1V2”为1.2V):

  • 经过 /10 后变为 12
  • 系统若未考虑此预处理,直接使用 M=20 计算:20 * 12 / 100 = 2.4V完全错误

:white_check_mark: 正确做法:调整 MReading 表达式配合

您当前的 M=20 是基于未先除10的场景设计的。由于您已手动对Reading预除10,应按以下方式之一校正:


:white_check_mark: 解决方案建议

项目 当前配置 推荐修正
ReadingMask 4626 :cross_mark: 20350x7F3 :white_check_mark:
Reading表达式 expr($1 / 10) :cross_mark: 建议移除或调整 M 配合
M 20 :cross_mark: 若保留 /10,则设为 200
验证方式 - 使用 busctl get 查看原始值,对比WEB显示值

:white_check_mark: 修改建议一(推荐):让系统自动处理转换

"ThresholdSensor_AdcSensor_1V2": {
  ...
  "Reading": "<=/Scanner_Adc_0.Value",         // 移除 /10
  "M": 20,
  "RBExp": 208,
  "ReadingMask": 2035                        // 支持所有门限显示
}

系统将自动完成:Physical = (20 * Raw + 20*208)/100 = (20*Raw + 4160)/100

:white_check_mark: 修改建议二:保留表达式,则调整 M

"ThresholdSensor_AdcSensor_1V2": {
  ...
  "Reading": "<=/Scanner_Adc_0.Value |> expr($1 / 10)",
  "M": 200,                                  // 因为数据已缩小10倍,M需放大10倍
  "RBExp": 208,
  "ReadingMask": 2035
}

附加注意事项

:warning: 门限值单位一致性

您配置的门限(如 UpperCritical: 66)是原始ADC映射值还是实际电压值(V)

  • 如果 66 是原始ADC值,则系统会结合 MReading 正确换算为 1.32V
  • 如果意图是直接输入 1.32V,则必须将 1.32 * 100 / (M/10) 转回ADC码再填入(需逆向计算)

:white_check_mark: 建议:所有门限值基于原始ADC码填写,确保一致性。


:white_check_mark: 验证方法

  1. 使用 busctl 查看原始属性值

    busctl get-property bmc.kepler.Sensors ThresholdSensor_AdcSensor_1V2 UpperCritical
    
  2. 对比 WEB 界面显示值 是否正确还原为电压。

  3. 检查告警触发是否符合预期


总结

问题 原因 解决方案
只有两个门限生效 ReadingMask=4626 不规范,仅部分位有效 修改为 20350x7F3
其他门限不显示 掩码未启用 Lower/Upper Non-Critical & Non-Recoverable 确保掩码 Bit 2~7 正确置位
显示值需乘 M 系统按 ADC 公式转换,且您添加了 /10 表达式 调整 M 或移除 /10 并重算
转换逻辑混乱 预处理与 IPMI 公式叠加导致偏差 使用标准流程,避免重复缩放

强烈建议

  1. 使用标准 ReadingMask=2035
  2. 移除 Reading 中的 /10 表达式,交由 IPMI 公式统一处理
  3. 确保门限值基于原始ADC码设置

完成修改后,重启 sensor 服务或进行 BMC 重启,应能完整显示所有上下门限。

相关链接:

  1. 定制化门限类传感器的轻微告警下门限值为0,严重告警上门限读值反转
  2. 【告警&事件】告警描述信息显示的数值和门限传感器显示的数值不一致
  3. ipmi命令设置门限后,无法恢复到原始配置的门限
  4. ipmi命令设置门限,最小值和最大值的计算有问题
  5. 上下电常见问题指南 | 文档中心 | openUBMC