#ifndef __MODBUS_RTU_H #define __MODBUS_RTU_H #include "apps_gather.h" /*--------------------------------- 宏定义 -----------------------------------*/ //功能码 #define ReadCoilState 0x01 //读取线圈状态 #define ReadDisInputState 0x02 //读取输入状态 #define ReadHoldReg 0x03 //读取保持寄存器 #define ReadInputReg 0x04 //读取输入寄存器 #define WriteSingleCoil 0x05 //强制写单线圈输出状态 #define WriteSingleReg 0x06 //预设(写)单寄存器 #define WriteMultiCoil 0x0F //强制写多线圈输出状态 #define WriteMultiReg 0x10 //预设(写)多寄存器 #define COIL_ADD_MIN 0x00 #define COIL_ADD_MAX 0x64 #define MAX_COIL_NUM ((COIL_ADD_MAX) - (COIL_ADD_MIN) + 1) #define DIS_ADD_MIN 0x00 #define DIS_ADD_MAX 0x64 #define MAX_DIS_NUM ((DIS_ADD_MAX) - (DIS_ADD_MIN) + 1) #define INPUT_REG_ADD_MIN 0x00 #define INPUT_REG_ADD_MAX 0x64 #define MAX_INPUT_REG_NUM ((INPUT_REG_ADD_MAX) - (INPUT_REG_ADD_MIN) + 1) #define HOLD_REG_ADD_MIN 0x00 #define HOLD_REG_ADD_MAX 0x64 #define MAX_HOLD_REG_NUM ((HOLD_REG_ADD_MAX) - (HOLD_REG_ADD_MIN) + 1) #define BROADCAST_ADDRESS 0x00 #define LOCAL_ADDRESS 0x01 #define MAKEWORD(a,b) ((uint16_t)(((uint8_t)(a)) | ((uint16_t)((uint8_t)(b))) << 8)) #define MAX_SIZE 255 typedef enum { MB_EX_NONE = 0x00, MB_EX_ILLEGAL_FUNCTION = 0x01, MB_EX_ILLEGAL_DATA_ADDRESS = 0x02, MB_EX_ILLEGAL_DATA_VALUE = 0x03, MB_EX_SLAVE_DEVICE_FAILURE = 0x04, MB_EX_ACKNOWLEDGE = 0x05, MB_EX_SLAVE_BUSY = 0x06, MB_EX_MEMORY_PARITY_ERROR = 0x08, MB_EX_GATEWAY_PATH_FAILED = 0x0A, MB_EX_GATEWAY_TGT_FAILED = 0x0B } eMBException; typedef union var_reg { uint16_t SamData [MAX_INPUT_REG_NUM]; // 采样数据 uint16_t InputReg[MAX_INPUT_REG_NUM]; // Reg 与 SamData }Var_Reg; extern uint8_t CoilState[(MAX_COIL_NUM + 7) / 8]; extern uint8_t DisState [(MAX_DIS_NUM + 7) / 8]; extern uint16_t InputReg[MAX_INPUT_REG_NUM]; extern uint16_t HoldReg[MAX_HOLD_REG_NUM]; extern Var_Reg SamVarReg; //MODBUS_RTU void modbus_analysis_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen); void modbus_process_rtu(void); void readcoilstate_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen); void readdisinputstate_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen); void readholdreg_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen); void readinputreg_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen); void writesinglereg_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen); void writemultireg_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen); void writesinglecoil_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen); void writemulticoil_rtu(uint8_t * upRxdbuf, uint16_t wRxdLen); void modbus_errfunction_rtu(uint8_t uCmdCode, uint8_t uErrorCode); //MODBUD uint16_t ModbusCRC16(uint8_t *ptr, uint16_t len); void GetOneCoilVal(uint16_t wCoilAddr, uint8_t *pCoilVal); void GetOneDisInputVal(uint16_t wDisInputAddr, uint8_t *pDisInputVal); uint16_t GetHoldRegData(uint16_t RegAdd); uint16_t GetInputRegData(uint16_t RegAdd); void WriteHoldRegData(uint16_t wRegAddr, uint16_t RegData); void WriteOneCoilData(uint16_t wRegAddr, uint16_t RegData); #endif