144 lines
5.2 KiB
C
144 lines
5.2 KiB
C
/**
|
||
******************************************************************************
|
||
* @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
|