FreeModbus版本:1.6
在mb.c文件中,有一个数组是static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX]
定义如下:
/* 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
};
那么它是干嘛的呢?
它用来存放功能码以及对应的处理函数
首先看这个数组的类型 :xMBFunctionHandler ,也就是说这个数组中的每一个元素都是xMBFunctionHandler 。
xMBFunctionHandler 它定义在mbproto.h文件中
如下:
typedef eMBException( *pxMBFunctionHandler ) ( UCHAR * pucFrame, USHORT * pusLength );
typedef struct
{
UCHAR ucFunctionCode;
pxMBFunctionHandler pxHandler;
} xMBFunctionHandler;
xMBFunctionHandler包含两个元素
一个是功能码ucFunctionCode
另一个是处理函数pxHandler
着重看第二个元素pxMBFunctionHandler pxHandler;
那么问题又来了
pxMBFunctionHandler 是啥?
同样在此文件中有定义
typedef eMBException( *pxMBFunctionHandler ) ( UCHAR * pucFrame, USHORT * pusLength );
pxMBFunctionHandler 是函数指针类型变量。
嗷 pxMBFunctionHandler pxHandler;这句话就是说,定义了一个变量,这个变量是pxMBFunctionHandler 函数指针类型。
也就是说可以把一个参数为( UCHAR * pucFrame, USHORT * pusLength ),返回值为eMBException 的 函数 赋值给pxHandler。
好了这下就懂了。
static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX]
这个数组中存放的就是 功能码 以及对应的处理函数。
以读输入寄存器为例(首先要在mbconfig.h文件中打开这个功能(默认打开))
MB_FUNC_READ_INPUT_REGISTER为功能码,04
eMBFuncReadInputRegister为读输入寄存器函数 (这个函数的作用是打包响应帧,并没有发送)
那么这个读输入寄存器函数在哪?
每个处理函数都在各自功能函数文件里
说了半天,这个数组xFuncHandlers到底用在哪了呢?
在eMBPoll轮询中
在处理帧数据时
要先找到功能码
然后执行功能码对应的处理函数