chen
2025-05-15 67ca69985af9109a0603a1cde71f21b940c059ff
keil/include/components/hido/Include/HIDO_Modbus.h
对比新文件
@@ -0,0 +1,128 @@
#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                         ( 255 ) /*! 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_ */