#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_ */
|