emcp/document/显示界面modbus协议寄存器定义.md

421 lines
14 KiB
Markdown
Raw Normal View History

2026-06-12 10:37:57 +08:00
# Modbus 协议寄存器定义文档
## 一、协议概览
2026-06-12 10:37:57 +08:00
| 项目 | 配置 |
| ---- | ---- |
| 协议类型 | Modbus RTU |
| 从机地址 | 1 |
| 波特率 | 115200 |
| 数据位 | 8 |
| 校验位 | 无 |
| 停止位 | 1 |
2026-06-12 10:37:57 +08:00
---
## 二、寄存器总览
2026-06-12 10:37:57 +08:00
### 2.1 读数据区
2026-06-12 10:37:57 +08:00
| 功能 | 功能码 | 寄存器类型 | 起始地址 | 长度/范围 | 说明 |
| ---- | ------ | ---------- | -------- | --------- | ---- |
| 实时显示数据-线路1 | `0x04` | 输入寄存器 | `0x0000` | `0x0000 ~ 0x0032` | 单精度浮点数32bit2寄存器/点 |
| 实时显示数据-线路2 | `0x04` | 输入寄存器 | `0x0034` | `0x0034 ~ 0x0066` | 参数顺序同线路1 |
| 实时显示数据-线路3 | `0x04` | 输入寄存器 | `0x0068` | `0x0068 ~ 0x009A` | 参数顺序同线路1 |
| 实时显示数据-线路4 | `0x04` | 输入寄存器 | `0x009C` | `0x009C ~ 0x00CE` | 参数顺序同线路1 |
| AI输入 | `0x04` | 输入寄存器 | `0x00D0` | `0x00D0 ~ 0x00DE` | 8路 AI单精度浮点数 |
| B码对时 | `0x04` | 输入寄存器 | `0x00E0` | `0x00E0 ~ 0x00E2` | 秒/分、时/日、月/年 |
| 开入状态 | `0x04` | 输入寄存器 | `0x00E3` | 1寄存器 | 16路每 bit 一路 |
| 开出状态 | `0x04` | 输入寄存器 | `0x00E4` | 1寄存器 | 16路每 bit 一路 |
| 事件总寄存器 | `0x04` | 输入寄存器 | `0x00E5` | 1寄存器 | 内容为 `n` 时表示有 `n` 个事件待读取 |
| 读事件内容 | `0x04` | 输入寄存器 | `0x0100` | `5 * n` | 当 `0x00E5 != 0` 时读取 |
2026-06-12 10:37:57 +08:00
### 2.2 读/写参数区
2026-06-12 10:37:57 +08:00
| 功能 | 功能码 | 寄存器类型 | 起始地址 | 寄存器长度 | 说明 |
| ---- | ------ | ---------- | -------- | ---------- | ---- |
| 时间设置 | `0x03 / 0x10` | 保持寄存器 | `0x0000` | 2 | 时间戳32bit |
| 串口设置 | `0x03 / 0x10` | 保持寄存器 | `0x0004` | 16 | 4路 × 8字节 |
| 线路定值设置 | `0x03 / 0x10` | 保持寄存器 | `0x0014` | 64 | 4路 × (7类定值 + 2个变比参数) |
| AI通道设置 | `0x03 / 0x10` | 保持寄存器 | `0x0054` | 30 | 12路整体下发 |
| AO通道设置 | `0x03 / 0x10` | 保持寄存器 | `0x0072` | 30 | 12路整体下发 |
| AI报警设置 | `0x03 / 0x10` | 保持寄存器 | `0x0090` | 30 | 12路整体下发 |
| 读事件成功回复 | `0x03` | 保持寄存器 | `0x0100` | 1 | 内容为本次成功读取的事件个数 `n` |
2026-06-12 10:37:57 +08:00
### 2.3 线圈区
2026-06-12 10:37:57 +08:00
| 功能 | 功能码 | 寄存器类型 | 起始地址 | 长度 | 说明 |
| ---- | ------ | ---------- | -------- | ---- | ---- |
| 写开出(批量) | `0x0F` | 线圈 | `0x0000` | 12 | 写多个线圈控制12路开出 |
2026-06-12 10:37:57 +08:00
## 三、实时数据寄存器表
2026-06-12 10:37:57 +08:00
### 3.1 线路1实时量
2026-06-12 10:37:57 +08:00
| 寄存器地址 | 参数名 | 寄存器地址 | 参数名 | 寄存器地址 | 参数名 |
| ---------- | ------ | ---------- | ------ | ---------- | ------ |
| `0x0000` | Ua | `0x0012` | Pt | `0x0024` | PFa |
| `0x0002` | Ub | `0x0014` | Qa | `0x0026` | PFb |
| `0x0004` | Uc | `0x0016` | Qb | `0x0028` | PFc |
| `0x0006` | Ia | `0x0018` | Qc | `0x002A` | PFt |
| `0x0008` | Ib | `0x001A` | Qt | `0x002C` | Uab |
| `0x000A` | Ic | `0x001C` | Sa | `0x002E` | Ubc |
| `0x000C` | Pa | `0x001E` | Sb | `0x0030` | Uca |
| `0x000E` | Pb | `0x0020` | Sc | `0x0032` | Frq |
| `0x0010` | Pc | `0x0022` | St | - | - |
### 3.2 线路2~线路4地址范围
| 线路 | 地址范围 | 说明 |
| ---- | -------- | ---- |
| 线路2 | `0x0034 ~ 0x0066` | 参数顺序同线路1 |
| 线路3 | `0x0068 ~ 0x009A` | 参数顺序同线路1 |
| 线路4 | `0x009C ~ 0x00CE` | 参数顺序同线路1 |
### 3.3 AI输入寄存器表
2026-06-12 10:37:57 +08:00
| 寄存器地址 | 输入编号 |
| ---------- | -------- |
| `0x00D0` | Ai1 |
| `0x00D2` | Ai2 |
| `0x00D4` | Ai3 |
| `0x00D6` | Ai4 |
| `0x00D8` | Ai5 |
| `0x00DA` | Ai6 |
| `0x00DC` | Ai7 |
| `0x00DE` | Ai8 |
### 3.4 B码对时寄存器表
| 寄存器地址 | 位分配 | 内容 |
| ---------- | ------ | ---- |
| `0x00E0` | `[15:8] = 秒``[7:0] = 分` | 秒/分 |
| `0x00E1` | `[15:8] = 时``[7:0] = 日` | 时/日 |
| `0x00E2` | `[15:8] = 月``[7:0] = 年` | 月/年 |
### 3.5 状态寄存器表
| 寄存器地址 | 含义 | 说明 |
| ---------- | ---- | ---- |
| `0x00E3` | 开入状态 | 16路输入每 bit 一路 |
| `0x00E4` | 开出状态 | 16路输出每 bit 一路 |
| `0x00E5` | 事件总寄存器 | 值为 `n` 表示有 `n` 个事件待读取 |
2026-06-12 10:37:57 +08:00
---
## 四、事件寄存器定义
### 4.1 读事件内容
| 项目 | 定义 |
| ---- | ---- |
| 触发条件 | 事件总寄存器 `0x00E5 != 0` |
| 功能码 | `0x04` |
| 寄存器类型 | 输入寄存器 |
| 起始地址 | `0x0100` |
| 读取长度 | `5 * n` |
| 数据名 | 数据寄存器 | 格式 | 说明 |
| ------ | ---------- | ---- | ---- |
| 时间戳 | `0x0100 ~ 0x0101` | 32位无符号 | 事件发生时间戳 |
| 毫秒计时 | `0x0102` | 16位无符号 | 事件发生毫秒值 |
| 线路号 + 事件类型 | `0x0103` | 16位无符号 | 高4位为线路号低4位为事件类型 |
| 事件代码 | `0x0103` 低8位扩展语义 | 8位无符号 | 按事件类型解释具体代码 |
| 动作值 | `0x0104` | 16位无符号 | 监测值或动作状态值 |
### 4.2 字段取值说明
#### 线路号
| 值 | 含义 |
| -- | ---- |
| `0` | 装置 |
| `1` | 线路1 |
| `2` | 线路2 |
| `3` | 线路3 |
| `4` | 线路4 |
#### 事件类型
| 值 | 含义 |
| -- | ---- |
| `1` | 保护类 |
| `2` | 动作类 |
| `3` | 报警类 |
| `4` | 操作类 |
| `5` | AI越限类 |
#### 事件代码
| 类别 | 代码定义 |
| ---- | -------- |
| 保护类 | `1 = PT断线``2 = CT断线`,其余依次编号 |
| 报警类 | `1 = 过压``2 = 过流``3 = 频率越限` 等 |
| 动作类 | 开入序号,表示第 `n` 路发生状态变化 |
| AI越限类 | AI通道号表示第 `n` 通道发生越限 |
| 操作类 | 由主站界面操作直接生成记录 |
#### 动作值
| 类别 | 含义 |
| ---- | ---- |
| 保护类 / 报警类 | 越限时的监测值 |
| 动作类 | 开入/开出状态,`0 -> 分`,非 `0 -> 合` |
### 4.3 读事件成功回复
| 项目 | 定义 |
| ---- | ---- |
| 功能码 | `0x03` |
| 寄存器类型 | 保持寄存器 |
| 起始地址 | `0x0100` |
| 数据长度 | 1 |
| 内容 | 本次成功读取的事件个数 `n` |
2026-06-12 10:37:57 +08:00
---
## 五、参数区寄存器说明
2026-06-12 10:37:57 +08:00
### 5.1 参数页读写规则
2026-06-12 10:37:57 +08:00
- 参数页在开机及切换到参数类页面时,应先发送 `03H` 读取参数。
- 参数发生修改后,应发送 `10H` 下发更新。
- 主站应在参数修改成功后生成对应“参数修改”事件,并实时显示、存盘。
- 对时功能除可在系统设置页统一下发外,也可通过上位机独立“对时设置”接口单独触发,底层仍写时间设置寄存器 `0x0000`
2026-06-12 10:37:57 +08:00
### 5.2 参数区表格
| 参数类别 | 功能码 | 寄存器类型 | 起始地址 | 长度 | 说明 |
| -------- | ------ | ---------- | -------- | ---- | ---- |
| 时间设置 | `0x03 / 0x10` | 保持寄存器 | `0x0000` | 2 | 时间戳32bit |
| 串口设置 | `0x03 / 0x10` | 保持寄存器 | `0x0004` | 16 | 4路 × 8字节 |
| 线路定值设置 | `0x03 / 0x10` | 保持寄存器 | `0x0014` | 64 | 含7类定值与2个变比参数 |
| AI通道设置 | `0x03 / 0x10` | 保持寄存器 | `0x0054` | 30 | 12路整体下发 |
| AO通道设置 | `0x03 / 0x10` | 保持寄存器 | `0x0072` | 30 | 12路整体下发 |
| AI报警设置 | `0x03 / 0x10` | 保持寄存器 | `0x0090` | 30 | 12路整体下发 |
| 开出状态字写入 | `0x10` | 保持寄存器 | `0x00A6` | 1 | 16位状态字每 bit 一路开出 |
2026-06-12 10:37:57 +08:00
### 5.2.1 时间设置 / 独立对时说明
| 项目 | 定义 |
| ---- | ---- |
| 寄存器类型 | 保持寄存器 |
| 功能码 | `0x03 / 0x10` |
| 起始地址 | `0x0000` |
| 寄存器长度 | 2 |
| 数据格式 | 32 位时间戳,低 16 位在前,高 16 位在后 |
说明:
- 主站可在系统设置页统一读取/下发该寄存器。
- 主站也可通过独立“对时设置”功能,单独向该寄存器写入目标时间。
- 上位机后端可额外开放独立对时接口,例如:
- `GET /api/config/time-sync`
- `POST /api/config/time-sync`
- 以上接口属于上位机软件封装,底层协议仍然只对应本节 `0x0000` 时间设置寄存器。
### 5.3 通讯设置
#### 5.3.1 基本定义
| 项目 | 定义 |
| ---- | ---- |
| 寄存器类型 | 保持寄存器 |
| 功能码 | `0x03 / 0x10` |
| 起始地址 | `0x0004` |
| 寄存器长度 | `16` |
| 长度说明 | `4(路) × 4(8byte数据/2) = 16` |
说明:
- 对应界面中的“串口设置”区域。
- 共支持 `4` 路串口参数读写。
- 每一路串口参数占用 `8` 字节,即 `4` 个保持寄存器。
- 主站进入参数页面时应先使用 `03H` 回读当前串口参数,界面修改后再使用 `10H` 整组下发。
#### 5.3.2 单路串口参数组成
单路串口参数结构对应 `com_param_t`,总长度 `8` 字节:
| 字段 | 类型 | 字节数 | 说明 |
| ---- | ---- | ------ | ---- |
| `baud_rate` | `uint32_t` | 4 | 波特率 |
| `parity` | `uint8_t` | 1 | 校验位 |
| `data` | `uint8_t` | 1 | 数据位 |
| `stop` | `uint8_t` | 1 | 停止位 |
| `protocol` | `uint8_t` | 1 | 通讯协议 |
#### 5.3.3 寄存器分配
| 串口 | 寄存器范围 | 长度 | 说明 |
| ---- | ---------- | ---- | ---- |
| 串口1 | `0x0004 ~ 0x0007` | 4 | 对应界面中的一组串口参数 |
| 串口2 | `0x0008 ~ 0x000B` | 4 | 对应界面中的一组串口参数 |
| 串口3 | `0x000C ~ 0x000F` | 4 | 预留/扩展串口参数 |
| 串口4 | `0x0010 ~ 0x0013` | 4 | 预留/扩展串口参数 |
#### 5.3.4 界面字段对应关系
对应界面中的典型字段如下:
| 界面字段 | 协议字段 |
| -------- | -------- |
| 串口号 | 由寄存器块位置区分,不单独占用字段 |
| 波特率 | `baud_rate` |
| 校验位 | `parity` |
| 数据位 | `data` |
| 停止位 | `stop` |
| 通讯协议 | `protocol` |
### 5.4 常规配置 / 网卡设置
#### 5.4.1 协议定义说明
| 项目 | 定义 |
| ---- | ---- |
| 配置项 | 网卡号、IP地址、子网掩码、默认网关、通讯协议 |
| 当前协议状态 | 本版 Modbus 协议**未定义对应寄存器** |
| Modbus 读写支持 | 不支持 |
| 处理方式 | 由上位机或系统本地配置逻辑单独处理,不纳入当前 Modbus 参数区 |
说明:
- 对应界面中的“常规配置 / 网卡设置”区域。
- 当前文档已定义“串口设置”的 Modbus 参数区,但**未定义网卡设置的寄存器地址、长度和编码方式**。
- 因此本版协议下,网卡参数**不能**按 `03H / 10H` 通过 Modbus 回读或下发。
- 若后续需要将网卡参数纳入 Modbus 管理,建议在协议后续版本中补充:
- 寄存器类型
- 功能码
- 起始地址
- 寄存器长度
- IP / 掩码 / 网关 / 协议字段编码规则
#### 5.4.2 界面字段范围
对应界面中的典型字段如下:
| 界面字段 | 当前协议状态 |
| -------- | ------------ |
| 网卡号 | 未定义寄存器 |
| IP地址 | 未定义寄存器 |
| 子网掩码 | 未定义寄存器 |
| 默认网关 | 未定义寄存器 |
| 通讯协议 | 未定义寄存器 |
2026-06-12 10:37:57 +08:00
---
## 六、开出控制说明
2026-06-12 10:37:57 +08:00
### 6.1 写保持寄存器方式
2026-06-12 10:37:57 +08:00
| 项目 | 定义 |
| ---- | ---- |
| 功能码 | `0x10` |
| 寄存器类型 | 保持寄存器 |
| 起始地址 | `0x00A6` |
| 长度 | 1 |
| 说明 | 16位状态字每 bit 表示一路开出 |
2026-06-12 10:37:57 +08:00
### 6.2 写线圈方式
2026-06-12 10:37:57 +08:00
| 项目 | 定义 |
| ---- | ---- |
| 功能码 | `0x0F` |
| 寄存器类型 | 线圈 |
| 起始地址 | `0x0000` |
| 长度 | 12 |
| 说明 | 写多个线圈控制12路开出 |
2026-06-12 10:37:57 +08:00
---
2026-06-12 10:37:57 +08:00
## 七、通讯时序说明
2026-06-12 10:37:57 +08:00
### 7.1 开机初始化时序
2026-06-12 10:37:57 +08:00
1. 主站开机后,先通过 `03H` 读取参数区。
2. 若参数读取失败,主站生成报警事件,可归类为“开机自检(通讯链路)”异常。
3. 开机自检结束后,进入周期轮询阶段。
2026-06-12 10:37:57 +08:00
### 7.2 周期轮询时序
2026-06-12 10:37:57 +08:00
1. 主站周期发送 `04H`,读取实时输入寄存器。
2. 收到从站 `04H` 应答后,更新实时数据、状态数据。
3. 随后读取事件总寄存器 `0x00E5`
4.`0x00E5 = 0`,继续下一轮周期轮询。
5.`0x00E5 = n``n > 0`,立即进入读事件流程。
2026-06-12 10:37:57 +08:00
补充说明:
2026-06-12 10:37:57 +08:00
- 若上位机需要在页面上动态显示设备当前时间,可额外按固定周期读取时间设置寄存器 `0x0000`
- 推荐上位机软件每 `1` 秒轮询一次,并通过独立时间推送通道发送给前端页面。
- 推荐的软件推送通道示例:`/ws/time-sync`
2026-06-12 10:37:57 +08:00
### 7.3 读事件时序
2026-06-12 10:37:57 +08:00
1. 主站发送“读事件”指令:
- 功能码:`04H`
- 输入寄存器地址:`0x0100`
- 读取长度:`5 * n`
2. 主站收到正确应答后,解析本批事件内容。
3. 主站发送“读事件成功回复”:
- 功能码:`03H`
- 保持寄存器地址:`0x0100`
- 长度:`1`
- 内容:本次成功读取的事件个数 `n`
4. 从站收到回复后,应将事件总寄存器 `0x00E5` 中的事件个数扣减 `n`
5. 若扣减后 `0x00E5` 仍非 0主站应继续重复读事件流程直到 `0x00E5 = 0`
2026-06-12 10:37:57 +08:00
### 7.4 事件生成与保存
2026-06-12 10:37:57 +08:00
- 从站负责生成并暂存:
- 报警类事件
- 保护类事件
- 动作类事件
- 主站负责生成:
- 操作类事件
2026-06-12 10:37:57 +08:00
主站侧操作类事件至少包括:
2026-06-12 10:37:57 +08:00
| 代码 | 含义 |
| ---- | ---- |
| `1` | 控制分/合 |
| `2` | 读定值失败 |
| `3` | 线路定值修改 |
| `4` | AI报警参数修改 |
| `5` | AI通道参数修改 |
| `6` | AO通道参数修改 |
| `7` | 通讯参数修改 |
| `8` | 密码修改 |
2026-06-12 10:37:57 +08:00
统一要求:
2026-06-12 10:37:57 +08:00
- 从站生成的事件与主站生成的事件,均保存在主站端。
- 主站应形成历史事件记录文件。
- 历史事件应支持按分类、时间段、线路号等条件检索。
2026-06-12 10:37:57 +08:00
### 7.5 时间推送建议
2026-06-12 10:37:57 +08:00
为便于上位机页面显示设备当前时间,建议增加独立时间推送链路:
2026-06-12 10:37:57 +08:00
1. 后台服务每 `1` 秒读取一次时间设置寄存器 `0x0000`
2. 将回读结果转换为标准时间字符串。
3. 通过独立 WebSocket 通道推送给页面。
2026-06-12 10:37:57 +08:00
推荐推送报文格式:
2026-06-12 10:37:57 +08:00
```json
{
"type": "time_sync",
"data": {
"time_sync": "2026-05-25 14:30:01"
}
}
```
2026-06-12 10:37:57 +08:00
说明:
2026-06-12 10:37:57 +08:00
- 该推送属于上位机软件实现建议,不新增下位机寄存器。
- 底层时间真值仍以 `0x0000` 时间设置寄存器为准。