FreeModbus学习——xFuncHandlers功能码处理

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轮询中

在处理帧数据时

要先找到功能码

然后执行功能码对应的处理函数
在这里插入图片描述

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值