# Modbus RTU · EVT0.4

目标 USART2/隔离 RS485：9600、8E1、地址1。PDU 地址0起；人读寄存器号 =40001+PDU地址。寄存器字节大端，多word高word在前，RTU CRC低字节在前。见 `modbus-registers.csv`。

FC03 支持遥测0–31、设置256–268、选中事件528–547；单次1–64个，不允许跨不连续区间。版本为0x0200。遥测压力/液位乘100，无效0xffff；辅助接点推定累计秒为32位遥测，内部/EEPROM累计毫秒为64位。遥测地址23是控制变化序号低16位，地址28/29才是 EEPROM 事件序号。

FC06 只允许地址288：1自动、2停止、3复位、4手动P1、5手动P2。非STOP要求运行允许DI有效与存储健康；队列忙返回异常6，STOP可覆盖。回显只确认入队，读取状态/armed/fault确认是否真的执行。手动、复位和自动仍受核心状态/所有保护约束。STOP在存储失效时仍可请求。

FC16 地址256、数量13必须一次整组提交：启/停/超压bar×100，液位%×100，升压bar×100，再4个uint32毫秒定时器。只在 OFF、未启用、两路反馈断开、存储健康时允许。整体约束校验后先提交EEPROM并回读，再应用；失败不应用部分参数并锁输出。禁止连续运行时写参数。

读事件：先FC16写512–513设事件序号32位，再FC03读528–547共20个寄存器。found=0表示已覆盖或不存在；found=1才解释其内容。上电1/控制变化2类事件保存故障、压力/液位、状态、输出、不可用和启用。最多464条，CRC坏记录被跳过；按最新序号向前扫描464个候选序号。事件序号无符号32位回绕。

非本机地址、广播0、CRC错误和不成帧报文静默；异常1不支持功能、2地址范围、3数据非法、4设备/存储/许可错误、6忙。详见源码测试。RS485没有身份认证；接在受控柜内总线，上位机不能绕过独立接点保护。官方规范：https://www.modbus.org/modbus-specifications 。

`firmware/modbus.c` 保留 v0.1只读兼容模块用于核心测试；目标固件使用 `protocol.c` 服务。不能把旧模块的24寄存器表当作当前目标协议。

EVT0.4：目标串口在每次协议请求前同步尚未被控制循环消费的命令。待处理时非STOP命令及整组参数写入返回异常06；STOP可覆盖低优先级命令。读请求不得清空邮箱。该约束新增实际serial.c寄存器模型回归。
