#### 版本说明
| 版本号 | 修改内容 | 日期 | 作者 |
| --- | --- | --- | --- |
| V1.0 | 协议修改为modbus | 2025-07-29 | 吴兆华 |
| V1.1 | 1. 修改浮点格式为MODBUS ABCD；<br/>2. 完善控制指令业务逻辑描述；<br/>3. 修复错误； | 2025-09-24 | 吴兆华 |
| V1.2 | 1. 修复异常码长度错误 | 2025-09-25 | 吴兆华 |


## 一、基本协议参数
| 参数 | 说明 |
| --- | --- |
| 通信模式 | Modbus RTU（异步串行通信） |
| 从机地址 | 0x01（支持1-247，可通过专用指令修改） |
| 波特率 | 115200bps（默认） |
| 数据格式 | 8位数据位，1位停止位，无校验（8N1） |
| 校验方式 | Modbus CRC16（多项式0xA001） |
| 浮点数传输 | ABCD顺序 |
| 超时时间 | 200ms（通信无响应超时） |


## 二、寄存器地址映射
采用Modbus标准编号：保持寄存器=3xxxx，输入寄存器=4xxxx；

### 1. 保持寄存器（**<font style="color:rgb(0, 0, 0) !important;">40001=0000H</font>**，可读写）
| 相对地址（十进制） | 功能描述 | 数据类型 | 单位 | 说明 |
| --- | --- | --- | --- | --- |
| 0000 | 系统控制命令 | U8 | - | 1：设备初始化<br/>2：开始测量<br/>3：停止测量<br/>4：数据清零<br/>5：开始控温<br/>6：停止控温<br/>详细见《系统控制命令定义》； |
| 0001 | 测量模式设置 | U8 | - | 测量模式：<br/>0：旋光度模式；<br/>1：比旋度模式；<br/>2：浓度模式；<br/>3：国际糖度模式； |
| 0002-0003 | 目标温度设置 | float | ℃ | 单位°C，范围暂定10°C~60°C |
| 0004 | 旋光管长度设置 | U16 | mm | 单位分米，<font style="background-color:#DF2A3F;">范围暂定100mm~300mm</font> |
| 0005 | 测量精度设置 | U8 | - | <font style="background-color:#DF2A3F;">暂定：</font><br/><font style="background-color:#DF2A3F;">0：快速测量</font><br/><font style="background-color:#DF2A3F;">1：高精度测量</font><br/><font style="background-color:#DF2A3F;">对应得逻辑待定</font> |
| 0006 | 自动测量次数设置 | U8 | 次 | <font style="background-color:#DF2A3F;">暂定1~10</font> |


### 2. 输入寄存器（<font style="color:rgba(0, 0, 0, 0.85);">30001=0000H</font>，只读）
| 相对地址（十进制） | 功能描述 | 数据类型 | 单位 | 说明 |
| --- | --- | --- | --- | --- |
| 0000-0001 | 实时温度数据 | float | ℃ |  |
| 0002-0003 | 实时旋光度 | float | ° |  |
| 0004 | 测量结果-模式代码 | U8 | - | 同测量模式（0x00-0x03） |
| 0005-0006 | 测量结果-数值 | float | 取决于模式 | 32位浮点数（旋光度/比旋度：°；浓度：g/100mL；糖度：°Z） |
| 0007-0008 | 测量结果-温度 | float | ℃ | 测量时的实际温度 |
| 0009 | 设备运行状态 | U8 | - | <font style="color:rgba(0, 0, 0, 0.85);">低 8 位有效，高 8 位保留：</font><br/>+ <font style="color:rgba(0, 0, 0, 0.85);">0x00：准备中（初始化、控温）</font><br/>+ <font style="color:rgba(0, 0, 0, 0.85);">0x01：空闲</font><br/>+ <font style="color:rgba(0, 0, 0, 0.85);">0x02：校准中</font><br/>+ <font style="color:rgba(0, 0, 0, 0.85);">0x03：准备就绪</font><br/>+ <font style="color:rgba(0, 0, 0, 0.85);">0x04：测量中</font> |
| 0010~0011 | 异常码 | U32 | - | 每个比特位表示一种异常，对应比特位为1表示有异常，该寄存器为0表示无异常：<br/>bit0：温度异常<br/>bit1：编码器故障<br/>bit2：TEC故障<br/>bit3：电机故障 |
| 0012 | 测量完成标志 | U8 | - | 0=未完成，1=完成（自动测量结束后置1） |
| 0013-0014 | 设备型号 | U8[4] | - | ASCII码，不足4字符以0x00填充（例："P1"存储为0x50 0x31 0x00 0x00） |
| 0015-0016 | 固件版本 | U8[4] | - | <font style="color:rgba(0, 0, 0, 0.85);">主版本 + 次版本 + 修订版 + 构建号</font><br/>按字节依次为主版本、次版本、修订版、构建号（例：0x01 0x02 0x03 0x04表示V1.02.03.04） |


## 三、功能码与命令映射
#### 1. 系统控制命令（写入保持寄存器30001，功能码0x06）
| **命令码（U8）** | **功能描述** | **说明** | |
| --- | --- | --- | --- |
| 1 | 设备初始化 | 1. 设备状态、变量、测量结果等清零/复位，设备切换到校准状态；<br/>2. 设备开始查找零点，并且停止在零点位置，切换到READY状态；<br/>3. 查找零点的结果通过_读设备状态，_获取； | |
| 2 | 开始测量 | 1. 设备需要先检查当前状态是否处于READY。否则返回modbus异常码4。 | |
| 3 | 停止测量 | 1. 不过处于何种状态，都立即停止；<br/>2. 测量过程中得数据清零，状态复位； | |
| 4 | 数据清零 | 1. 测量结果清空 | |
| 5 | 开始控温 | 1. 下位机开始控温；<br/>2. 上位机间隔读取温度； | |
| 6 | 停止控温 | 1. 下位机停止控制温度； | |


## 四、Modbus标准错误码与设备错误映射
| **错误码 (十进制)** | **错误名称** | **映射描述** |
| --- | --- | --- |
| 1 | 非法功能 | 请求的功能码未被从设备识别或不支持；<br/>+ 请求得子命令不支持； |
| 2 | 非法数据地址 | 数据地址不在设备的可访问范围内<br/>+ 保持原释义 |
| 3 | 非法数据值 | 请求中包含的数值不在从设备的允许值范围内<br/>+ 设置目标温度、模式、炫光管长度等； |
| 4 | 从设备故障 | 从设备在执行请求时发生了无法修复的故障<br/>+ 编码器故障、电机故障、TEC故障等 |
| 5 | 确认 | 从设备已接收请求，但需要更多时间来完成操作<br/>+ 初始化操作，设备找零点、测量操作设备找零点 |
| 6 | 从设备忙 | 从设备正忙于处理其他命令，客户端应稍后重新发送请求<br/>+ 设备正在找零点 |
| 7 | 否定确认 | 从设备无法执行请求的程序功能<br/>+ 保持原释义 |
| 8 | 内存奇偶错误 | 从设备尝试读取扩展内存时检测到奇偶校验错误<br/>+ 保持原释义 |
| 10 | 网关路径不可用 | 网关无法为请求分配内部通信路径<br/>+ 无映射 |
| 11 | 网关目标设备无响应 | 网关未从目标设备获得响应<br/>+ 无映射1 |


