日期时间与校时
能读取什么
时钟信息分布在三个对象上:
4000 的属性 2、3、4 是同一个对象上的不同属性,属性 2 是最常用的读时钟入口。
数据地址表
4000 日期时间对象
三个属性索引都固定 0。
DateTimeS 的 7 个字节
只有 6 个语义字节加一个毫秒字节。实际上协议布局是「年(2) 月 日 时 分 秒 毫秒」共 7 字节。
协议用 FF/FFFF 表示"未指定"。例如 FF FF 年表示年份未知。库里:
- 不做时区转换,不做夏令时处理
- 不转成
time_t,不校验日期合法性(2 月 31 日也能构造出来) - 保留原始字节,需要自己判断是否为"未指定"
要本地化请自行按年月日时分秒组装。
精准校时参数(属性 4)
索引可选顶层结构字段:索引 1~5 分别读这 5 个字段,索引 0 读整个结构。
时钟源(4006)
最小完整示例
读取表计时钟并输出:
常用变体
读校时模式
枚举没有倍率,不要用 engineering_values。
读精准校时参数
整个结构:
单个字段(索引 1~5):
读时钟源
写时钟
写时钟前必须确认校时模式允许,否则设备返回 DAR=3。详见写参数与执行方法。
请求与响应报文
以下示例固定:SA 六个 00 字节、逻辑地址 0、CA=0、PIID=0、控制域请求 43/响应 C3。
读取日期时间
请求(4000/2/0):
响应(2026-10-07 14:16:26):
DateTimeS 在线上占 7 字节,最后一个字节是秒。
读取校时模式
请求(4000/3/0):
响应(Enum 1,允许校时):
数据类型 16 是 Enum,值 01。
读取精准校时参数
请求(4000/4/0):
响应(8、2、1、5、4):
每个 UInt8 字段都带 11 类型标记,因为结构字段必须自带类型。
读取单个结构字段
请求(4000/4/4,只读通讯延时阈值):
响应(UInt8 5,即 5 s):
索引 4 直接对应第 4 个字段,响应里没有 Structure 包装,直接是 11(UInt8)+ 值。
读取时钟源
请求(4006/2/0):
响应(时钟源 1,状态 0):
02 是 Structure,02 是字段数,两个字段都是 16(Enum):01 和 00。
写日期时间
请求(设为 2026-10-07 15:00:00):
响应(成功,DAR=0):
服务 86 是 SET-Response,06 是属性个数,01 是 SET-Normal,最后一个 00 是 DAR。
写校时模式
请求(设为 1):
响应(成功):
写校时模式被拒
响应返回 DAR=3:
Result 成功但业务失败 —— 这是本库最重要的约定之一。DAR=3 通常表示设备侧策略不允许,或参数越界。