#ifndef __FLOWMETER_H #define __FLOWMETER_H #include "usart.h" #include "lib.h" #include "uart.h" #include "delay.h" #include "agile_modbus.h" #include "flow.h" #define FLOWMETER_RS485_PORT_1 UART_2 #define FLOWMETER_RS485_PORT_2 UART_4 #define FLOWMETER_MAX 2U // 流量计最大数量 #define FLOWMETER_MODBUS_RECV_LENGTH 30U // 接收缓冲区大小 #define FLOWMETER_MODBUS_SEND_LENGTH 30U // modbus最大数据长度 #define FLOWMETER_SLAVER_ADDR 1U // 从机地址 #define FLOWMETER1_START_REGISTERS_ADDR 0x02 // 起始寄存器地址 #define FLOWMETER1_REGISTERS_LEN 2U // 寄存器长度,一次性读取0x34个寄存器,FLOWMETER_MODBUS_RECV_LENGTH、FLOWMETER_MODBUS_SEND_LENGTH根据这个来设置 #define FLOWMETER2_START_REGISTERS_ADDR 0x3A // 起始寄存器地址 #define FLOWMETER2_REGISTERS_LEN 2U // 寄存器长度 typedef void (*send_data_cb_t)(uart_id_e id, uint8_t *data, uint16_t len); // 发送数据 typedef struct { uint16_t data1; // 04寄存器值 uint16_t data2; // 05寄存器值 uint16_t data3; // 06寄存器值 } total_flow_t; // 累计总量=04寄存器值*65535+05寄存器值+06寄存器值/1000 typedef union { uint8_t data; struct { uint8_t total_flow : 1, gas_correct : 1, response_time : 1, auto_zero : 1, lower_limit : 1, upper_limit : 1; } bits; } registers_u; // 寄存器 typedef struct { registers_u registers_write_enable; // 写使能寄存器 total_flow_t total_flow; // 累计总量 0x04、0x05、0x06寄存器 uint16_t gas_correct; // 气体修正系数 0x16寄存器 uint16_t response_time; // 响应时间 0x17寄存器 10、20、50、100、200、500、1000 毫秒 uint16_t auto_zero; // 自动教零 0x27寄存器 0xAA55 uint16_t lower_limit; // 下限报警 0x31寄存器 0-110 uint16_t upper_limit; // 上限报警 0x33寄存器 0-110 } flowmeter_calibrate_t; typedef enum { PROCESS_IDEL, // 空闲状态,等待初始化,执行一次初始化 PROCESS_WRITE_REGISTERS, // 写寄存器 PROCESS_READ_REGISTERS, // 读取寄存器 PROCESS_RECEIVE_REGISTERS_DATA, // 接收数据 PROCESS_DESERIALIZE_DATA, // 反序列化数据 PROCESS_WAIT, PROCESS_END, } flowmeter_process_status_e; typedef enum { FLOWMETER_PROCESS_NO_SLEEP, FLOWMETER_PROCESS_SLEEP_RECVTM, FLOWMETER_PROCESS_SLEEP_100ms, FLOWMETER_PROCESS_SLEEP_1s, FLOWMETER_PROCESS_SLEEP_3s, } flowmeter_process_sleep_e; typedef struct { uart_id_e id; uint8_t send_buf[FLOWMETER_MODBUS_SEND_LENGTH]; uint16_t send_len; } flowmeter_write_t; // 需要写寄存器的数据 typedef struct { bool idel_flag; // 通过这个标识位来判断是否需要初始化modbus uint8_t calibration_flag; uart_t *huart[FLOWMETER_MAX]; float32_t flow[FLOWMETER_MAX]; // 顺时流量 agile_modbus_rtu_t ctx_rtu; uint8_t ctx_send_buf[FLOWMETER_MODBUS_SEND_LENGTH]; uint8_t ctx_recv_buf[FLOWMETER_MODBUS_RECV_LENGTH]; // 公用一个接收缓冲区 send_data_cb_t send_data_cb; // 发送数据回调函数,外部传入 flowmeter_write_t flowmeter_write; // 需要写寄存器的数据 } flowmeter_t; extern void flowmeter_init(send_data_cb_t cb); extern void flowmeter_process(void); extern flowmeter_process_sleep_e flowmeter_process_need_sleep(void); extern float32 flowmeter_get_flow(uint8_t index); extern void flowmeter_calibrate_simulate(uint8_t index); extern void flowmeter_set_calibration_flag(uint8_t bits); #endif // __FLOWMETER_H