Files
433_STM32/Core/Inc/modbus_rtu_master.h

144 lines
5.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @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