#ifndef _HIDO_MODBUS_H_ #define _HIDO_MODBUS_H_ #include "HIDO_TypeDef.h" #include "HIDO_FSM.h" #include "HIDO_VLQueue.h" #define MODBUS_RTU_MIN_SIZE ( 4 ) #define MODBUS_RTU_FUNC_CODE_OFFSET ( 1 ) #define MODBUS_RTU_ADDR_OFFSET ( 0 ) #define MODBUS_RTU_DATA_OFFSET ( 2 ) #define MODBUS_RTU_ADDR_SIZE ( 1 ) #define MODBUS_RTU_FUNC_CODE_SIZE ( 1 ) #define MODBUS_RTU_REGISTER_SIZE ( 2 ) #define MODBUS_RTU_REGISTER_COUNT_SIZE ( 2 ) #define MODBUS_RTU_COUNT_SIZE ( 1 ) #define MODBUS_RTU_CRC16_SIZE ( 2 ) #define MODBUS_RTU_READ_HOLDING_REGISTER_SIZE ( \ MODBUS_RTU_ADDR_SIZE \ + MODBUS_RTU_FUNC_CODE_SIZE \ + MODBUS_RTU_REGISTER_SIZE \ + MODBUS_RTU_REGISTER_COUNT_SIZE \ + MODBUS_RTU_CRC16_SIZE) #define MODBUS_RTU_WRITE_MULTIPLE_REGISTERS_SIZE(cnt) ( \ MODBUS_RTU_ADDR_SIZE \ + MODBUS_RTU_FUNC_CODE_SIZE \ + MODBUS_RTU_REGISTER_SIZE \ + MODBUS_RTU_COUNT_SIZE \ + MODBUS_RTU_REGISTER_COUNT_SIZE \ + (MODBUS_RTU_REGISTER_SIZE * (cnt)) \ + MODBUS_RTU_CRC16_SIZE) #define MODBUS_ADDRESS_BROADCAST ( 0 ) /*! Modbus broadcast address. */ #define MODBUS_ADDRESS_MIN ( 1 ) /*! Smallest possible slave address. */ #define MODBUS_ADDRESS_MAX ( 247 ) /*! Biggest possible slave address. */ #define MODBUS_FUNC_NONE ( 0 ) #define MODBUS_FUNC_READ_COILS ( 1 ) #define MODBUS_FUNC_READ_DISCRETE_INPUTS ( 2 ) #define MODBUS_FUNC_WRITE_SINGLE_COIL ( 5 ) #define MODBUS_FUNC_WRITE_MULTIPLE_COILS ( 15 ) #define MODBUS_FUNC_READ_HOLDING_REGISTER ( 3 ) #define MODBUS_FUNC_READ_INPUT_REGISTER ( 4 ) #define MODBUS_FUNC_WRITE_REGISTER ( 6 ) #define MODBUS_FUNC_WRITE_MULTIPLE_REGISTERS ( 16 ) #define MODBUS_FUNC_READWRITE_MULTIPLE_REGISTERS ( 23 ) #define MODBUS_FUNC_DIAG_READ_EXCEPTION ( 7 ) #define MODBUS_FUNC_DIAG_DIAGNOSTIC ( 8 ) #define MODBUS_FUNC_DIAG_GET_COM_EVENT_CNT ( 11 ) #define MODBUS_FUNC_DIAG_GET_COM_EVENT_LOG ( 12 ) #define MODBUS_FUNC_OTHER_REPORT_SLAVEID ( 17 ) #define MODBUS_FUNC_ERROR ( 128 ) typedef enum { HIDO_MODBUS_MODE_MASTER, HIDO_MODBUS_MODE_SLAVE, } HIDO_ModbusModeEnum; typedef enum { HIDO_MODBUS_RESULT_NONE, HIDO_MODBUS_RESULT_WAIT, HIDO_MODBUS_RESULT_RESPONSE, } HIDO_ModbusResultEnum; typedef struct { HIDO_VOID *m_pData; HIDO_UINT32 m_u32Len; HIDO_UINT32 m_u32SerialNumber; }HIDO_ModbusDataStruct; typedef struct HIDO_ModbusStruct HIDO_ModbusStruct; typedef HIDO_ModbusResultEnum (* HIDO_ModbusOnRecvFunc)(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8Addr, HIDO_UINT8 _u8FuncCode, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len, HIDO_UINT32 _u32SerialNumber); typedef HIDO_VOID (* HIDO_ModbusSerialEvent)(HIDO_ModbusStruct *_pstModbus); struct HIDO_ModbusStruct { HIDO_UINT32 m_u32TimerID; HIDO_UINT32 m_u32SerialTXOver; HIDO_UINT32 m_u32SerialRXOver; HIDO_UINT32 m_u32SerialRXReady; HIDO_FSMStruct m_stFSM; HIDO_UINT32 m_u32NextSerialNumber; HIDO_UINT32 m_u32CurrentSerialNumber; /* ÒÔÏÂÓû§ÊµÏÖ */ HIDO_UINT32 m_u32DelayUs; HIDO_VLQStruct m_stSendQueue; HIDO_UINT8 *m_pu8SendBuff; HIDO_UINT32 m_u32SendBuffSize; HIDO_UINT32 m_u32TransferIndex; HIDO_UINT32 m_u32TransferLen; HIDO_UINT8 *m_pu8TransferBuff; HIDO_UINT32 m_u32TransferBuffSize; HIDO_VOID (* m_fnTimerStart)(HIDO_ModbusStruct *_pstModbus, HIDO_UINT32 _u32Us); HIDO_VOID (* m_fnTimerStop)(HIDO_ModbusStruct *_pstModbus); HIDO_VOID (* m_fnSerialEnable)(HIDO_ModbusStruct* _pstModbus, HIDO_BOOL _bRxEnable, HIDO_BOOL _bTxEnable); HIDO_INT32 (* m_fnSerialPutByte)(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8Byte); HIDO_INT32 (* m_fnSerialGetByte)(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 *_pu8Byte); HIDO_VOID *m_pPrivateData; HIDO_ModbusOnRecvFunc m_fnOnRecv; HIDO_ModbusSerialEvent m_fnSerialTXOver; HIDO_ModbusSerialEvent m_fnSerialRXOver; }; HIDO_VOID HIDO_ModbusEnterCriticalSection(void); HIDO_VOID HIDO_ModbusExitCriticalSection(void); HIDO_INT32 HIDO_ModbusInit(HIDO_ModbusStruct *_pstModbus, HIDO_ModbusModeEnum _eMode); HIDO_INT32 HIDO_ModbusSetOnRecvCallback(HIDO_ModbusStruct *_pstModbus, HIDO_ModbusOnRecvFunc _fnOnRecv); HIDO_INT32 HIDO_ModbusSetSerialTXOverCallback(HIDO_ModbusStruct *_pstModbus, HIDO_ModbusSerialEvent _fnSerialEvent); HIDO_INT32 HIDO_ModbusSetSerialRXOverCallback(HIDO_ModbusStruct *_pstModbus, HIDO_ModbusSerialEvent _fnSerialEvent); HIDO_INT32 HIDO_ModbusFramePack(HIDO_UINT8 *_pu8FrameBuf, HIDO_UINT32 _u32FrameBufSize, HIDO_UINT8 _u8Addr, HIDO_UINT8 _u8FuncCode, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32DataLen, HIDO_UINT32 *_pu32FrameLen); #endif /* _HIDO_MODBUS_H_ */