状态字读取
能读取什么
两个对象:
库不解释状态字的位含义
状态字是位串,不是数值。库里:
- 校验位宽(16 位 / 32 位)和数组长度(7 项)
- 保留原始字节,不做位到故障代码的翻译
- 不清除保留位,不自动识别故障业务
- 不参与
engineering_values—— 位串没有数值倍率
各状态的业务含义(如"失压"、"逆相序"、"报警")须由应用按附录 F 自行定义位掩码。这是刻意的取舍:不同厂家对保留位的用法不同,库不替你猜。
数据地址表
运行状态字 2014
7 项对应标准附录 F.1~F.7,长度固定 7,与 DeviceLayout 无关。
跟随上报状态字 2015
属性 4 可写 ≠ 你能写
AttributeDefinition::writable = true 表示标准定义了写入能力,实际写入还要过两关:
- 客户端侧:
Client的运行 schema 必须显式开放该属性 - 设备侧:设备必须允许写入
见写参数与执行方法。
最小完整示例
读取运行状态字并按位掩码判断:
位序需要按设备文档核对
上面示例用「高字节在前」拼成 16 位整数,这是常见约定。但位串内部的位序(是 bit0 在前还是在后)取决于设备实现和附录 F 的定义,库不做转换。正式产品应对照该型号的说明书确认,并把掩码定义集中管理。
常用变体
只读一个状态字
索引 1~7 对应状态字 1~7,索引 0 是整个数组。不要假设索引越界安全,库会按 7 项校验。
读跟随上报状态字
读跟随上报模式字
变化检测
轮询状态字时,按位比较前后两次的原始字节,只上报变化的位:
请求与响应报文
以下示例固定:SA 六个 00 字节、逻辑地址 0、CA=0、PIID=0、控制域请求 43/响应 C3。
读取运行状态字 1
请求(2014/2/1):
响应:
每个位串元素前必须先写字节长度,再写内容。注意元素 4 是 80 04 而其他是 04 10 —— 这不是解析错误,位串内容本就不同。
读取全部 7 个运行状态字
请求(2014/2/0):
响应:
同样是 7 项,OAD 回显为索引 0。
读取跟随上报状态字
请求(2015/2/0):
响应(32 位位串):
这里位长字节是 20(十六进制 32),表示 32 位。四个内容字节中最后一个是 02,只有 bit1 为 1。
读不到位串时
2015/2/0 返回时是单个位串,不是数组。若设备把跟随上报状态做成数组,解析会因类型不符失败。这是属性定义差异,属正常。