WXK
2024-03-05 c2802ee207528de2d06403061405f0faadffb922
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#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_ */