STM32从零到量产开发:四路继电器工业控制模块开发— Modbus RTU 通讯协议设计

STM32从零到量产开发:四路继电器工业控制模块开发— Modbus RTU 通讯协议设计 STM32从零到量产开发四路继电器工业控制模块开发— Modbus RTU 通讯协议设计文档版本v1.0.0对应固件 v1.0.0 / 设备类型码 0x0002适用产品P02_Relay_Controller_4Channels Relay Industrial Control Module本文档面向主站/网关开发工程师描述设备的 Modbus RTU 从站协议。所有示例帧的 CRC16 均已用脚本实算多项式 0x8005初值 0xFFFF小端。1. 物理层与链路层项目说明物理接口RS485A/B 差分半双工默认波特率9600 bps见 §6 波特率索引表数据位 / 停止位 / 校验8 / 1 / 无8N1从站地址范围1 ~ 2470 为广播地址用于写指令不回响应帧间隔T3.53.5 个字符时间9600bps 下约 3.6ms建议 ≥ 5ms 余量字节超时1.5 个字符时间约 1.5ms 9600接线RS485_A 接总线 ARS485_B 接总线 B总线两端需加 120Ω 终端电阻。设备由外部提供隔离电源。2. 帧格式Modbus RTU[ 从站地址 ][ 功能码 ][ 数据域 ][ CRC 低字节 ][ CRC 高字节 ] 1 字节 1 字节 N 字节 1 字节 1 字节字节序地址、数据域中的多字节数值寄存器值、寄存器地址、数量均为大端MSB 在前。CRCModbus CRC16多项式 0x8005初值 0xFFFF小端即低字节先发。广播地址0 时设备执行写操作但不回任何响应读操作不支持广播。3. 支持的功能码功能码名称访问对象说明0x01读线圈继电器读取 RELAY1~4 状态0x02读离散输入DI读取 DI1~4 状态0x03读保持寄存器通信参数读从站地址/波特率/故障安全配置等0x04读输入寄存器诊断/运行信息运行时间、计数、固件版本、设备类型、SN 等0x05写单个线圈继电器单个继电器开/断0x06写单个保持寄存器通信参数改地址/波特率/故障安全0x0F写多个线圈继电器批量控制 4 路继电器0x10写多个保持寄存器通信参数批量写配置本设备常用单寄存器0x06 即可覆盖0x11上报从站标识Report Slave ID设备信息返回固件版本、设备类型码、运行状态4. 异常码异常码含义触发场景0x01非法功能码收到本设备不支持的功能码0x02非法数据地址寄存器地址/范围越界0x03非法数据值数值非法如从站地址0、波特率索引越界、故障安全秒0 且使能1 等0x06设备忙正在处理上一条请求极少触发异常响应格式[地址][功能码 | 0x80][异常码][CRC低][CRC高]5. 寄存器映射总览对象地址范围读写内容线圈 Coils0x0000 ~ 0x0003读/写RELAY1~40断开, 1吸合离散输入 Discrete Inputs0x0000 ~ 0x0003只读DI1~40断开, 1闭合输入寄存器 Input Registers0x0000 ~ 0x000F只读运行秒/复位/帧/CRC/异常/运行小时/寿命/固件/类型/SN/故障安全保持寄存器 Holding Registers0x0000 ~ 0x0004读/写从站地址/波特率/通信使能/故障安全使能/超时秒说明线圈、离散输入、输入寄存器、保持寄存器是 Modbus 的四个独立地址空间各自从 0x0000 编号互不相干。6. 通信参数保持寄存器 0x0000~0x0004地址名称读写范围/取值说明0x0000从站地址 SlaveAddr读/写1~247掉电保存重启后/下次回复后生效0x0001波特率索引 BaudIndex读/写0~4见下表掉电保存回复后切换波特率0x0002通信使能 LinkEnable读/写0 / 10静默模式不回复任何帧1正常回复0x0003故障安全使能 FailSafeEn读/写0 / 11开启通信故障安全默认 10x0004故障安全超时 FailSafeSec读/写0~255秒0 表示禁用需配合 FailSafeEn0波特率索引表P02 专用索引波特率09600出厂默认1192002384003576004115200⚠️系列差异提醒同系列 P03 模块的波特率索引表不同额外支持 4800且 9600 在索引 1。若网关需同时接入 P02/P03请按本表各自区分详见 §13。出厂默认值SlaveAddr1BaudIndex09600LinkEnable1FailSafeEn1FailSafeSec10。7. 线圈 — 继电器0x0000~0x0003线圈地址位名称写值含义0x0000bit0RELAY10xFF00吸合0x0000断开0x0001bit1RELAY2同上0x0002bit2RELAY3同上0x0003bit3RELAY4同上继电器为低电平有效驱动线圈写 1吸合 输出闭合。写保持寄存器 FailSafeSec 触发故障安全时所有继电器强制断开安全态。8. 离散输入 — DI0x0000~0x0003只读离散地址位名称含义0x0000bit0DI1外部接点闭合1断开00x0001bit1DI2同上0x0002bit2DI3同上0x0003bit3DI4同上读响应中首字节的低 4 位为 DI1~DI4 状态。9. 输入寄存器0x0000~0x000F只读地址名称位宽含义0x0000运行秒数 Uptime16累计运行秒16 位回绕0x0001复位次数 ResetCount16累计上电复位次数0x0002有效帧计数 FrameCount16收到合法 Modbus 帧数0x0003CRC 错误计数 CrcErrCount16CRC 校验失败计数0x0004异常响应计数 ExcepCount16回复异常帧累计次数通信质量评估0x0005运行小时 RunHours16累计运行小时0x0006继电器1 动作次数16寿命计数翻转时 10x0007继电器2 动作次数16同上0x0008继电器3 动作次数16同上0x0009继电器4 动作次数16同上0x000A寿命告警位图 LifeAlarm16bit0~3 对应 RELAY1~4 寿命越限默认阈值 100000 次0x000B固件版本 FwVer160xMMmm如 0x0100 v1.00x000C设备类型码 DevType160x0002P02 标识0x000D序列号低16位 SN_Low16取自芯片 UID全球唯一0x000E序列号高16位 SN_High16取自芯片 UID0x000F故障安全态 FailSafe16bit0使能bit8当前是否触发1已切安全态10. 故障安全机制#1 量产增强设备默认开启通信故障安全FailSafeEn1超时 10s。主站连续FailSafeSec秒未发来任何有效 Modbus 帧→ 设备自动把所有继电器切到安全态断开防止主站死机导致失控。任意一帧合法 Modbus 帧到达 → 立即清除故障安全态恢复由主站控制。由主站重新下发控制指令即可恢复继电器状态无需人工复位。设计原则心跳/保活必须用只读帧如 FC01 读线圈、FC03 读保持、FC04 读输入绝不能拿控制帧如 FC0F 全开当心跳——控制帧只改变状态不能做保活。11. 心跳 / 保活 SOP双视角主站视角以小于FailSafeSec默认 10s的周期周期性发送只读轮询帧推荐 FC04 读输入寄存器或 FC01 读线圈维持链路活跃。例如每 5s 读一次 0x0000 运行秒数。设备视角收到任意合法帧即清零故障安全计时器若计时超过阈值则进入安全态并置位 0x000F 的 bit8。12. 设备识别FC17 Report Slave ID主站发送01 11即可获取设备标识。P02 响应含固件版本与设备类型码 0x0002。示例见 §14可验证设备类型码主站据此加载对应的寄存器字典。13. 系列关系说明P02 与 P03 属于同一产品系列同芯片STM32F103RCT6、同 Modbus 协议框架9 功能码、异常码 01/02/03/06、大端数据小端 CRC、故障安全默认开。两者通信参数保持寄存器 0x0000~0x0004 含义完全对齐主站设地址/设波特率/开关故障安全的帧格式一致。差异主站须注意项目P02本文档P03模拟量模块设备类型码0x00020x0003波特率索引表09600…411520004800,19600…5115200业务寄存器继电器/DI 相关ADC/DAC/校准/报警相关LinkEnable可写0静默只读恒为 1无静默模式接入网关时建议先用 FC17 读取设备类型码再按产品加载寄存器字典。14. 通信示例CRC 已实算以下主站地址均为 10x01。CRC 以「低字节 高字节」给出。14.1 读线圈FC01— 读 4 路继电器状态请求: 01 01 00 00 00 04 3D C9 响应: 01 01 01 00 51 88 (00 4 路全断)14.2 写单线圈FC05— 继电器1 吸合请求: 01 05 00 00 FF 00 8C 3A 响应: 01 05 00 00 FF 00 8C 3A (原样回显)14.3 写多线圈FC0F— 4 路全开请求: 01 0F 00 00 00 04 01 0F 7E 92 响应: 01 0F 00 00 00 04 (原样回显起始/数量)14.4 读保持寄存器FC03— 读从站地址请求: 01 03 00 00 00 01 84 0A 响应: 01 03 02 00 01 79 84 (00 01 地址 1)14.5 写保持寄存器FC06— 改波特率为 115200索引 4请求: 01 06 00 01 00 04 D9 C9 响应: 01 06 00 01 00 04 D9 C9 (原样回显之后设备切换 115200)14.6 读离散输入FC02— 读 4 路 DI请求: 01 02 00 00 00 04 79 C9 响应: 01 02 01 00 A1 88 (00 无 DI 闭合)14.7 读输入寄存器FC04— 读运行小时请求: 01 04 00 05 00 01 21 CB 响应: 01 04 02 00 05 79 33 (00 05 5 小时)14.8 上报从站标识FC17请求: 01 11 C0 2C 响应: 含设备类型码 0x0002 运行状态详见固件实现可用 FC04 单独读 0x000B/0x000C 获取版本与类型14.9 异常响应示例FC01 非法功能码请求: 01 08 ... (假设主站发了一个不支持的功能码 0x08) 响应: 01 81 01 81 90 (功能码|0x800x81, 异常码 0x01非法功能)15. 出厂默认参数速查参数值从站地址1波特率9600索引 0通信使能1正常回复故障安全开启超时 10s继电器上电态全断安全态设备类型码0x0002固件版本v1.0.00x0100本文档依据 P02 工程源码modbus_rtu.c/flash_param.c/bsp_rs485.c核对编写示例帧 CRC 经脚本验证。