/** ****************************************************************************** * @file modbus_rtu_master.h * @brief Modbus RTU Master 模块头文件 * @note 本模块通过 RS485 (UART3) 以 Modbus RTU 协议轮询 Noris AMS 从站设备, * 读取寄存器 41161 (偏移地址 1160) 中的报警状态, * 提取 Bit4-7 (火灾/水密门/舱底水/气体检测) 映射为紧凑报警字节。 * * 报警状态供 main.c 中的两种上报机制使用: * 1. 变化通知 (Type 0x10): 报警状态变化时,通过 PROTO_TYPE_IO 上报, * 格式与原 DI 变化通知完全一致,上位机代码无需修改。 * 2. 心跳包 (Type 0xAA): 每 30 秒定时上报当前报警状态。 * * @version 1.1 ****************************************************************************** */ #ifndef __MODBUS_RTU_MASTER_H #define __MODBUS_RTU_MASTER_H #ifdef __cplusplus extern "C" { #endif #include "stm32f1xx_hal.h" /* ================================================================ * Modbus RTU 通信参数配置 * 修改以下宏定义可适配不同的从站设备和通信需求 * ================================================================ */ /** 从站设备地址 (Noris AMS 默认地址 = 1) */ #define MODBUS_RTU_SLAVE_ADDR 1 /** 目标寄存器偏移地址 (1160 对应 Noris 协议中的寄存器 41161) */ #define MODBUS_RTU_TARGET_REG 1160 /** 单次读取的寄存器数量 (当前只读取 1 个报警寄存器) */ #define MODBUS_RTU_REG_QTY 1 /** 轮询间隔 (毫秒),每隔此时间发送一次 Read Holding Registers 请求 */ #define MODBUS_RTU_POLL_INTERVAL 1000 /** 响应超时 (毫秒),发送请求后等待从站响应的最长时间,超时则丢弃本次轮询 */ #define MODBUS_RTU_RESP_TIMEOUT 500 /** 帧内字符间隔超时 (毫秒),接收过程中两个相邻字节的最大间隔时间, * 超过此时间认为一帧数据接收完成 */ #define MODBUS_RTU_INTER_CHAR_TIMEOUT 10 /** 发送回波屏蔽时间 (毫秒),UART3 发送后屏蔽自身回波的时间窗口, * 防止将自身发送的数据误判为从站响应 */ #define MODBUS_RTU_TX_ECHO_MARGIN 10 /* ================================================================ * Noris AMS 报警位提取宏 * 从 16 位寄存器值中提取各个报警标志位 * * 寄存器 41161 的位布局: * Bit4: 火灾综合报警 (Fire) * Bit5: 水密门综合报警 (Door) * Bit6: 舱底水综合报警 (Bilge) * Bit7: 气体检测综合报警 (Gas) * * 提取后映射到紧凑报警字节: * Bit0 ← Bit4 (火灾) * Bit1 ← Bit5 (水密门) * Bit2 ← Bit6 (舱底水) * Bit3 ← Bit7 (气体检测) * ================================================================ */ /** 提取火灾综合报警 (寄存器 Bit4) */ #define NORIS_FIRE_ALARM(reg) (((reg) >> 4) & 0x01) /** 提取水密门综合报警 (寄存器 Bit5) */ #define NORIS_DOOR_ALARM(reg) (((reg) >> 5) & 0x01) /** 提取舱底水综合报警 (寄存器 Bit6) */ #define NORIS_BILGE_ALARM(reg) (((reg) >> 6) & 0x01) /** 提取气体检测综合报警 (寄存器 Bit7) */ #define NORIS_GAS_ALARM(reg) (((reg) >> 7) & 0x01) /* ================================================================ * 接收缓冲区配置 * ================================================================ */ /** Modbus RTU 接收缓冲区最大长度 (字节), * 正常响应帧为 7 字节,64 字节足够容纳各种响应 */ #define MODBUS_RTU_MAX_RX_BUF 64 /* ================================================================ * 公共函数接口 * ================================================================ */ /** * @brief Modbus RTU Master 模块初始化 * @note 在系统启动时调用,将状态机重置为 IDLE 状态, * 清空接收缓冲区和报警状态变量 * @retval 无 */ void ModbusRTU_Master_Init(void); /** * @brief Modbus RTU Master 主任务函数 * @note 在主循环中周期性调用,实现状态机驱动的轮询逻辑: * IDLE → WAIT_POLL → WAIT_RESPONSE → PROCESS → IDLE * * 状态说明: * - IDLE: 等待轮询间隔到达 (1000ms) * - WAIT_POLL: 发送 Modbus RTU 请求帧 * - WAIT_RESPONSE: 等待从站响应或超时 * - PROCESS: 解析响应帧,提取寄存器值和报警位 * * @retval 无 */ void ModbusRTU_Master_Task(void); /** * @brief 向 Modbus RTU 接收缓冲区送入一个字节 * @note 在 UART3 接收中断回调中调用 (HAL_UART_RxCpltCallback), * 仅在 WAIT_RESPONSE 状态且不在回波屏蔽期内才接收数据 * @param byte: 从 UART3 接收到的原始字节 * @retval 无 */ void ModbusRTU_FeedRxByte(uint8_t byte); /** * @brief 获取当前 Modbus RTU 报警状态 * @note 返回紧凑报警字节,位定义如下: * Bit0: 火灾报警 * Bit1: 水密门报警 * Bit2: 舱底水报警 * Bit3: 气体检测报警 * @retval 报警状态字节 (uint8_t) */ uint8_t ModbusRTU_GetAlarmState(void); #ifdef __cplusplus } #endif #endif