BACnet 日期里的 FF 是错误吗:怎样保留通配符而不强造时间戳
BACnet Date/Time中的FF可表示未指定字段,不能一律当损坏字节,也不能直接补成当前日期。四字节Date的年份以1900为偏移,Time最后一字节是百分之一秒;保留字段级未知状态,只有具体字段齐全才构造本地日历时间。
适用版本与输入范围
依据维护者 bacnet-stack 固定标签 bacnet-stack-1.4.0 的下列源码解释公开实现子集。该参考不是 ASHRAE 标准全文;涉及具体楼控设备时仍需记录型号、固件和对象支持范围。 本文所有输入均为原创合成数据,未接真实设备。
日期和时间各有四个字段
附件Date=[126,10,24,6]表达2026年10月24日及星期六;Time=[14,3,5,25]表达14:03:05.25。年份字节126需要加1900,时间小数字段25乘一万才是Python微秒250000,不能误读为25毫秒或所谓“百秒”。输入使用JSON整数数组直接展示字节值,不含应用标签,也不暗含时区。程序构造的local_datetime是无时区日历表示,不会自动加Z冒充UTC。
未指定字段不允许猜补
第二条输入将日与星期设为255,报告中对应null,concrete=false,local_datetime也为null。它可以表示一个部分日期条件,而不是一个可直接写入时序库的瞬间。程序不会取电脑当前日、不将255截成31,也不会把星期缺失当作必然错误。若具体年月日与时分秒齐全,即使星期未指定,仍可构造日历时间;星期的可用性与日期是否完整应分开保存。
明确公开实现子集和拒绝范围
BACnet日期还存在其他特殊月份或日选择含义,本演示只支持普通1到12月、1到31日和FF未指定,不把特殊取值假装成普通日期。范围检查后还调用datetime校验真实日历,避免接受2月30日。时间字段的上限分别为23、59、59、99,显式负例百分之一秒100被拒绝,不进行进位归一化。这样保留了输入错误,避免上层以为数据源确实给了下一秒。
部分日期与绝对时间分别交付
报告同时保留date_fields、time_fields和能否组成具体日历时间的判断,便于计划表、日程与采集值采取不同处理方式。仅凭Date/Time值不能推断设备所处时区、夏令时或时钟准确性,工程若需要UTC必须另有可靠配置和转换规则。本附件未连接控制器,也没测对时误差,适合检查导出数据的字段解释。遇到未支持特殊日期时应保留原始字节并扩展有依据的解析,不应随意猜成现场某一天。
下载与复跑
将输入 fixture.json与独立程序 verify.py放在同一目录,用 Python 3.12 执行 python verify.py,无需安装第三方包。程序从自身目录读取输入并写入 report.json,不要求当前终端恰好位于下载目录。也可查看本次实跑报告和复跑说明。
本次实际运行通过 3 条输入断言,包括标有“显式负例”的记录;负例以JSON字段承载,不会把下载文件本身做成损坏编码。local_datetime没有时区;null表示字段未指定,不能替换为零或当前系统时间。 修改输入后应同时审查期望结果,不能只改断言数字让测试变绿。
对象或字段的基础关系可回到BACnet 对象与服务入门核对,更多接口入口在设备协议库。若需要把已确认的数据点接入展项编排,可了解SoftControl 展厅中控;具体接入能力以项目确认和实际测试为准。
一级依据
来源核对日期:2026-10-24。离线结果只证明给定输入的解析或计算行为;现场兼容性、响应时间、硬件准确度和具体产品支持均未测量。
相关阅读
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。