ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AI-on-the-edge-device 后处理参数详解:NUMBER.AllowNegativeRates(允许表计倒走/负速率)

AI-on-the-edge-device 后处理参数详解:NUMBER.AllowNegativeRates(允许表计倒走/负速率) AI-on-the-edge-device 后处理参数详解NUMBER.AllowNegativeRates允许表计倒走/负速率【免费下载链接】AI-on-the-edge-deviceEasy to use device for connecting old measuring units (water, power, gas, ...) to the digital world项目地址: https://gitcode.com/GitHub_Trending/ai/AI-on-the-edge-device导读NUMBER.AllowNegativeRates是 AI-on-the-edge-device 项目中 PostProcessing 后处理模块 用于控制读数是否允许递减倒走的布尔型参数。默认情况下固件会把本次读数小于上次有效读数判定为负速率异常并回退到上一次的有效值当水表、电表等计量设备存在可逆计数场景例如双向计量或演示环境时可通过该参数放行负向变化。本文将结合 配置样例 与 后处理源码 的调用链讲清该参数的作用域、配置写法、底层判定逻辑及其与相邻一致性校验参数的协作关系。参数速览项目内容参数全名NUMBER.AllowNegativeRates默认值false类型布尔true/false所属配置小节[PostProcessing]作用范围按NUMBER独立生效每个 ROI 数字序列一个官方说明允许表计倒走读数递减即允许出现负速率参数定义位于 param-docs/parameter-pages/PostProcessing/NUMBER.AllowNegativeRates.md其权威表述为Allow a meter to count backwards (decreasing values).参数语义什么是负速率为什么默认禁止在真实计量场景中水表、电表、气表的累计读数应当只增不减。因此后处理流水线把本次读数Value小于上一次有效读数PreValue视为异常信号可能意味着图像识别错误例如数字轮反转、遮挡导致误读ROI 配置错位或参考图Reference异常表计本身被倒装或存在故障。如果放任这类读数进入输出与数据日志会造成速率Rate为负、历史曲线回退等数据污染。因此在默认配置false下固件会拦截并回退读数。官方文档也明确提示倒走并不常见在大多数情况下都不是期望行为This is unusual (it means there is a negative rate) and not wanted in most cases!作用域与命名为什么必须带NUMBER前缀该参数最容易被误用的地方在于命名。它不是全局参数而是针对某一个数字序列Number Sequence独立配置的——NUMBER是在 ROI感兴趣区域中定义的数字序列名称例如 默认配置 中的main、main.ana1等。官方文档对此给出明确警告If you edit the config file manually, you must prefix this parameter withNUMBERfollowed by a dot (eg.main.AllowNegativeRates). The reason is that this parameter is specific for eachNUMBER(NUMBERis the name of the number sequence defined in the ROIs).也就是说手动编辑config.ini时必须写成main.AllowNegativeRates这类带序列名前缀的形式不带前缀的裸参数AllowNegativeRates在 AllowNegativeRates.md 中被明确标记为unused已废弃应改用NUMBER.AllowNegativeRates。这一设计在源码中体现得非常直接。解析函数 handleAllowNegativeRate 通过_decsep参数接收NUMBER.AllowNegativeRates的完整键名并用find_first_of(.)拆出序列名void ClassFlowPostProcessing::handleAllowNegativeRate(string _decsep, string _value) { string _digit, _decpos; int _pospunkt _decsep.find_first_of(.); if (_pospunkt -1) { _digit _decsep.substr(0, _pospunkt); // 取出 NUMBER如 main } else { _digit default; // 无前缀时视为默认值 } for (int j 0; j NUMBERS.size(); j) { bool _zwdc alphanumericToBoolean(_value); // 匹配当前序列名或 default 时写入 if ((_digit default) || (NUMBERS[j]-name _digit)) { NUMBERS[j]-AllowNegativeRates _zwdc; } } }可见无前缀的写法会被当作default只会写入名称恰好为default的序列这正是要求必须带NUMBER前缀的根本原因。配置方法Web UI 与手动编辑 config.ini方式一通过 Web 配置界面NUMBER.AllowNegativeRates属于后处理PostProcessing配置项可在设备 Web 界面的后处理配置页中按数字序列设置。其false为默认值UI 中不修改即保持默认行为。方式二手动编辑 SD 卡配置文件配置存储在 SD 卡的 config.ini位于[PostProcessing]小节内参考写法如下[PostProcessing] main.DecimalShift 0 main.AnalogDigitTransitionStart 9.2 main.ChangeRateThreshold 2 PreValueUse true PreValueAgeStartup 720 main.AllowNegativeRates false main.MaxRateValue 0.05 ;main.MaxRateType AbsoluteChange main.ExtendedResolution false main.IgnoreLeadingNaN false ErrorMessage true main.CheckDigitIncreaseConsistency false要点参数值仅接受布尔值true/false解析通过alphanumericToBoolean完成每行以;开头表示注释等价于使用默认值例如将整行改为;main.AllowNegativeRates true即可恢复默认false若固件版本升级main.cpp 的配置迁移逻辑 会自动处理该类参数当检测到被注释的AllowNegativeRates行时会先改写为默认值false再取消注释避免旧配置残留异常值。源码级原理负速率判定与回退调用链AllowNegativeRates字段定义于 ClassFlowDefineTypes.h 的NumberPost结构体中注释明确了其语义allowNegativeRate; defines if the consistency checks allow negative rates between consecutive meter readings.每个数字序列在初始化时被强制置为false见 ClassFlowPostProcessing.cpp 第 687 行_number-AllowNegativeRates false;确保未显式配置时始终走严格模式。后处理流水线中的判定逻辑在每次读数的主处理循环中仅当PreValueUse PreValueOkay启用了上一值使用且上一值有效时才会触发负速率检查核心代码位于 ClassFlowPostProcessing.cpp 第 895-927 行if ((!NUMBERS[j]-AllowNegativeRates) (NUMBERS[j]-Value NUMBERS[j]-PreValue)) { LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, handleAllowNegativeRate for device: NUMBERS[j]-name); if ((NUMBERS[j]-Value NUMBERS[j]-PreValue)) { // 若开启扩展分辨率额外输出 value/preValue/preToll 便于排查见 issue #2447 NUMBERS[j]-ErrorMessageText NUMBERS[j]-ErrorMessageText Neg. Rate - Read: zwvalue - Raw: NUMBERS[j]-ReturnRawValue - Pre: RundeOutput(NUMBERS[j]-PreValue, NUMBERS[j]-Nachkomma) ; NUMBERS[j]-Value NUMBERS[j]-PreValue; // 回退到上一有效值 NUMBERS[j]-ReturnValue ; // 清空本次输出 NUMBERS[j]-timeStampLastValue imagetime; // 写入错误日志并记录数据日志跳过后续 MaxRate 等检查 LogFile.WriteToFile(ESP_LOG_ERROR, TAG, _zw); WriteDataLog(j); continue; } }由此可以归纳出AllowNegativeRates false时的完整行为链触发条件Value PreValue且上一次值有效PreValueOkay、已启用PreValueUse生成错误消息追加Neg. Rate - Read: ... - Raw: ... - Pre: ...到ErrorMessageText该消息会随ErrorMessage参数输出值回退Value被重置为PreValueReturnValue被清空本次读数不对外发布日志记录以ESP_LOG_ERROR级别写入日志文件并调用WriteDataLog记录数据日志提前终止continue跳过后续 MaxRate 校验与速率计算。反之当AllowNegativeRates true时上述分支整体跳过负向差值会正常进入速率计算NUMBERS[j]-FlowRateAct (NUMBERS[j]-Value - NUMBERS[j]-PreValue) / LastPreValueTimeDifference; NUMBERS[j]-ReturnRateValue to_string(NUMBERS[j]-FlowRateAct);此时FlowRateAct当前速率可以取负值且后续MaxRateValue的一致性校验使用abs(_ratedifference) abs(NUMBERS[j]-MaxRateValue)进行绝对值比较因此负速率同样会受到最大速率上限的约束——即允许倒走不等于允许任意幅度倒走。与相邻后处理参数的协作关系理解NUMBER.AllowNegativeRates还需要把握它与[PostProcessing]小节其他参数的联动参数与 AllowNegativeRates 的关系PreValueUse负速率检查的前置开关false时不做任何与上一值相关的比对本参数失去意义PreValueAgeStartup决定启动阶段上一值可用性间接影响PreValueOkayNUMBER.ChangeRateThreshold先于负速率检查执行的小幅抖动过滤阈值内强制回退到 PreValue见 ClassFlowPostProcessing.cpp 第 896-904 行NUMBER.MaxRateValue/NUMBER.MaxRateType负速率通过后仍需满足最大变化率限制按绝对值比较ErrorMessage决定Neg. Rate - Read: ...这类错误消息是否输出NUMBER.CheckDigitIncreaseConsistency数字进位一致性检查与负速率检查属于不同的校验维度从结构体注释ClassFlowDefineTypes.h可以看到AllowNegativeRates与MaxRateValue、ChangeRateThreshold、PreValue等共同构成上一值一致性校验体系本参数只负责是否允许负向差异这一个维度。测试覆盖负速率场景的验证方式仓库的测试组件 jomjol-flowcontroll 直接覆盖了本参数的行为辅助函数 setAllowNegatives 用于批量设置被测对象各数字序列的AllowNegativeRates从而构造允许倒走与禁止倒走两组对照测试test_flow_pp_negative.cpp 从命名与测试体系看专门针对负向读数/负速率场景进行断言可结合 test_suite_flowcontroll.cpp 的集成方式运行验证。这为参数行为提供了可回归验证的工程保障也说明禁止倒走是经过测试固化下来的默认安全策略。使用建议保持默认false绝大多数单向计量场景水表、电表、气表累计读数都应当禁止倒走防止误读污染数据仅在确有必要时开启例如双向计量、可逆计数器或演示/测试环境中需要验证负速率输出链路时再对特定序列设置为true务必带前缀手动编辑时写成main.AllowNegativeRates true不要使用已废弃的裸参数AllowNegativeRates配合 MaxRateValue 使用即使允许负速率也应保留MaxRateValue上限避免异常大幅回退绕过校验观察日志开启后可在日志中核对是否存在Neg. Rate记录被放行确认行为符合预期。【免费下载链接】AI-on-the-edge-deviceEasy to use device for connecting old measuring units (water, power, gas, ...) to the digital world项目地址: https://gitcode.com/GitHub_Trending/ai/AI-on-the-edge-device创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表