| 2. 关于mb.c文件的理解 u 宏定义与变量
 mb.c文件中定义了一系列的宏定义、函数指针及全局变量,并使用优先编译指令预编译一些程序代码。定义与优先编译部分如下:
 #if MB_RTU_ENABLED == 1
 #include "mbrtu.h"
 #endif
 #if MB_ASCII_ENABLED == 1
 #include "mbascii.h"
 #endif
 #if MB_TCP_ENABLED == 1
 #include "mbtcp.h"
 #endif
 #ifndef MB_PORT_HAS_CLOSE
 #define MB_PORT_HAS_CLOSE 0
 #endif
 /* ----------------------- Static variables ---------------------------------*/
 static UCHAR ucMBAddress;
 static eMBMode eMBCurrentMode;
 static enum
 {
 STATE_ENABLED,
 STATE_DISABLED,
 STATE_NOT_INITIALIZED
 } eMBState = STATE_NOT_INITIALIZED;
 /* Functions pointer which are initialized in eMBInit( ). Depending on the
 * mode (RTU or ASCII) the are set to the correct implementations.
 */
 static peMBFrameSend peMBFrameSendCur;
 static pvMBFrameStart pvMBFrameStartCur;
 static pvMBFrameStop pvMBFrameStopCur;
 static peMBFrameReceive peMBFrameReceiveCur;
 static pvMBFrameClose pvMBFrameCloseCur;
 /* Callback functions required by the porting layer. They are called when
 * an external event has happend which includes a timeout or the reception
 * or transmission of a character.
 */
 BOOL( *pxMBFrameCBByteReceived ) ( void );
 BOOL( *pxMBFrameCBTransmitterEmpty ) ( void );
 BOOL( *pxMBPortCBTimerExpired ) ( void );
 BOOL( *pxMBFrameCBReceiveFSMCur ) ( void );
 BOOL( *pxMBFrameCBTransmitFSMCur ) ( void );
 /* An array of Modbus functions handlers which associates Modbus function
 * codes with implementing functions.
 */
 static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX] = {
 #if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0
 {MB_FUNC_OTHER_REPORT_SLAVEID, eMBFuncReportSlaveID},
 #endif
 #if MB_FUNC_READ_INPUT_ENABLED > 0
 {MB_FUNC_READ_INPUT_REGISTER, eMBFuncReadInputRegister},
 #endif
 #if MB_FUNC_READ_HOLDING_ENABLED > 0
 {MB_FUNC_READ_HOLDING_REGISTER, eMBFuncReadHoldingRegister},
 #endif
 #if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0
 {MB_FUNC_WRITE_MULTIPLE_REGISTERS, eMBFuncWriteMultipleHoldingRegister},
 #endif
 #if MB_FUNC_WRITE_HOLDING_ENABLED > 0
 {MB_FUNC_WRITE_REGISTER, eMBFuncWriteHoldingRegister},
 #endif
 #if MB_FUNC_READWRITE_HOLDING_ENABLED > 0
 {MB_FUNC_READWRITE_MULTIPLE_REGISTERS, eMBFuncReadWriteMultipleHoldingRegister},
 #endif
 #if MB_FUNC_READ_COILS_ENABLED > 0
 {MB_FUNC_READ_COILS, eMBFuncReadCoils},
 #endif
 #if MB_FUNC_WRITE_COIL_ENABLED > 0
 {MB_FUNC_WRITE_SINGLE_COIL, eMBFuncWriteCoil},
 #endif
 #if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0
 {MB_FUNC_WRITE_MULTIPLE_COILS, eMBFuncWriteMultipleCoils},
 #endif
 #if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0
 {MB_FUNC_READ_DISCRETE_INPUTS, eMBFuncReadDiscreteInputs},
 #endif
 };
 |