wangfq
|
794db633dc
|
fix: Modbus 主动上报缺少线圈断开/重连事件触发
根因: modbus_report_schedule() 只检测继电器翻转, 没有检测
loop1_LOOP_OK 变化。线圈断开时依赖 150ms/800ms 周期上报,
若断开-重连-再断开在一个周期内完成, 中间事件被吞掉。
修复:
- +extern loop1_LOOP_OK
- +_last_loop_ok 状态追踪器
- +线圈断开/重连边沿检测 (对齐 700BS rs485_poll 行为)
- +modbus_init 初始化 _last_loop_ok
|
2026-07-30 21:47:48 +08:00 |
|
wangfq
|
2142674c3e
|
refactor: Modbus 默认波特率 115200 + 资源分析重评估
分析结论 (115200 vs 9600):
- TX 阻塞: 4.3ms (曾 44.8ms) → 活动态 CPU 仅 +2.9%
- 主循环延迟 < 半个测量窗, 不影响线圈检测/光耦/BLE
- 从"临界可用"变为"完全充裕"
固件修复:
- rs485_init: 硬编码 RS485_BAUD → 使用 g_storage_uart_baud (flash 可配)
- 协议文档: Modbus 默认 115200
- DLD154Tool: 串口默认 115200
|
2026-07-30 17:39:27 +08:00 |
|
wangfq
|
df6e38f118
|
refactor: Modbus 缓冲大小用宏替换硬编码 250
- rs485_modbus.h: +MB_MAX_READ_REGS(125) / MB_MAX_DATA_BYTES(250) / MB_RESP_BUF_SIZE(255)
- rs485_modbus.c: data_buf[250]→data_buf[MB_MAX_DATA_BYTES]
buf[5+250] →buf[MB_RESP_BUF_SIZE]
quantity>125→quantity>MB_MAX_READ_REGS
|
2026-07-30 15:28:11 +08:00 |
|
wangfq
|
e32f3892fe
|
feat: Modbus RTU V1.6 私有协议编码实现
新增:
- rs485_modbus.h/c — 完整 Modbus RTU 从机实现 (516行)
· FC 0x02 读离散输入 (9-bit 位图: car_state/线圈/光耦/继电器)
· FC 0x03 读保持寄存器 (含 HR 0x0010/0x0011)
· FC 0x04 读输入寄存器 (基础 IR + 全数据块 0x0100-0x0112)
· FC 0x06/0x10 写寄存器 (含值域校验+只读拦截)
· FC 0x11 Report Slave ID
· CRC16 查表 (poly=0xA001)
· 全数据块组装 (19 reg = 38B big-endian)
· 主动上报 3 级速率调度 (事件立即/活动150ms/空闲800ms)
· 车间距/通过时间测量 (mstick/2=10ms单位, relay边沿触发)
· 光耦状态实时读取 (GPIOB_ReadPortPin)
· Holding Register 写穿透: Fusion Mode 同步 direction_mode,
Hold Time 同步 g_hold_time, Freq Level 同步 g_loop_cng_unit
改造:
- rs485_700bs.h/c: 暴露 rs485_send() + rx缓冲(_rx_buf/_rx_len/_rx_last_tick) 供Modbus共用
- peripheral_main.c: g_fm_700bs_disable 分派 700BS/Modbus; modbus_init() 随 rs485_init 调用
|
2026-07-30 12:02:24 +08:00 |
|