#ifndef _MODBUS_485_H_ #define _MODBUS_485_H_ #include "apps_gather.h" //自定义线圈寄存器地址 #define COIL_ADDR_ON_OFF 0x00 #define COIL_ADDR_LIGHT 0x01 #define COIL_ADDR_CONFIG_SAVE 0x02 #define COIL_ADDR_CONFIG_RESET 0x03 #define COIL_ADDR_SCREEN_SWITCH 0x04 //自定义离散状态寄存器地址 //自定义保持寄存器地址 #define HOLD_ADDR_SET_WORK_MODE 0x00 #define HOLD_ADDR_MUX_PV_L 0x01 #define HOLD_ADDR_MUX_PV_H 0x02 #define HOLD_ADDR_PHY_UNIT 0x03 #define HOLD_ADDR_PHY_UP 0x04 #define HOLD_ADDR_PHY_LOW 0x05 #define HOLD_ADDR_SAMPLE_INTERVAL 0x06 #define HOLD_ADDR_PLOT_COUNTS 0x07 #define HOLD_ADDR_INPUT_COLOR 0x08 #define HOLD_ADDR_OUTPUT_COLOR 0x09 #define HOLD_ADDR_LANGUAGE 0x0A //自定义输入寄存器地址 #define INPUT_ADDR_BATTERY 0x00 #define INPUT_ADDR_RUNTIME_SECOND 0x01 #define INPUT_ADDR_RUNTIME_HOUR 0x02 #define INPUT_ADDR_MUX_SV_L 0x03 #define INPUT_ADDR_MUX_SV_H 0x04 typedef enum { TRANSPARENT_WAIT = 0, TRANSPARENT_RECIEVE_START, TRANSPARENT_RECIEVE_FINISHED, TRANSPARENT_TRANSMIT_END }TRANS_PROCESS; extern uint32_t tick_start; extern uint32_t tick_middle; extern uint32_t tick_end; //extern uint32_t trans_log_rx; extern uint32_t trans_log_tx; extern uint8_t sig2slave_step; extern TRANS_PROCESS st_flag; void parse_scom_485(st_scom *scom); //透传,DMA发送,与发送回调组合使用 void transparent_tim(void); void trans_hart2pc(void); void trans_pc2hart(void); void trans_ble2pc(void); void trans_pc2ble(void); void trans_modbus_pc2sig(void); //SIG作为主设备,向外发送数据之后,等待从机应答,持续一段时间(超时时间)无数据后停止接收,并对收到的数据进行解析 void trans_modbus_sig2slave(void); //DMA接收只有半满中断、空闲中断和完成(溢出)中断,因此用以下函数尝试进行捕获 //该函数放置于TIM2的中断内,1ms为周期,尝试捕获前3帧 void trans_start_capture(void); uint8_t trans_enable_check(st_scom *scom); //处理modbus寄存器值的更新与写入 void modbus_registers_update(void); //线圈寄存器,读写 void modbus_reg_update_coil(void); //离散输入寄存器,上位机只读 void modbus_reg_update_dis(void); //保持寄存器,读写 void modbus_reg_update_hold(void); //输入寄存器,上位机只读 void modbus_reg_update_input(void); //设置线圈寄存器,输入参数:地址、标志位 void set_coil_val(uint8_t addr, uint8_t bit_val); //获取线圈值,应对上位机修改线圈的情况 uint8_t get_coil_val(uint8_t addr); #endif