嵌入式技术论坛
直播中

李桂兰

7年用户 1474经验值
私信 关注
[问答]

请教freemodbus只支持从机地址连续怎么解读?

freemodbus官方文档中
目前协议栈只支持从机地址连续,并且起始地址从1开始。
这句话是什么意思呢?
1.jpg

回帖(5)

王斌

2023-5-17 14:34:44
是的,这个是 freeModbus 实现的时候把寄存器数组直接是用全局变量定义的,在文件 packages/freemodbus-v1.6.0/port/user_mb_app_m.c 中,如下:

/*-----------------------Master mode use these variables----------------------*/
#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
//Master mode:DiscreteInputs variables
USHORT   usMDiscInStart                             = M_DISCRETE_INPUT_START;
#if      M_DISCRETE_INPUT_NDISCRETES%8
UCHAR    ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8+1];
#else
UCHAR    ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8];
#endif
//Master mode:Coils variables
USHORT   usMCoilStart                               = M_COIL_START;
#if      M_COIL_NCOILS%8
UCHAR    ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8+1];
#else
UCHAR    ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8];
#endif
//Master mode:InputRegister variables
USHORT   usMRegInStart                              = M_REG_INPUT_START;
USHORT   usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS];
//Master mode:HoldingRegister variables
USHORT   usMRegHoldStart                            = M_REG_HOLDING_START;
USHORT   usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS];
以保持寄存器为例,在文件 packages/freemodbus-v1.6.0/port/user_mb_app_m.c 中处理保持寄存器的回调函数中获取保持寄存器数组时 pusRegHoldingBuf = usMRegHoldBuf[ucMBMasterGetDestAddress() - 1]; 就是使用的 从机地址 - 1 作为数组的索引,如果你设置的从0开始那么这位置的数组索引就会变成 -1,就出错了。

eMBErrorCode eMBMasterRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress,
        USHORT usNRegs, eMBRegisterMode eMode)
{
    eMBErrorCode    eStatus = MB_ENOERR;
    USHORT          iRegIndex;
    USHORT *        pusRegHoldingBuf;
    USHORT          REG_HOLDING_START;
    USHORT          REG_HOLDING_NREGS;
    USHORT          usRegHoldStart;
    pusRegHoldingBuf = usMRegHoldBuf[ucMBMasterGetDestAddress() - 1];
    ... ... // 其他代码
}
举报

王斌

2023-5-17 14:34:51
定义的数组的个数是 16,要是从机地址超过这个值了也会出问题
举报

李桂兰

2023-5-17 14:34:59
1.jpg
看代码中从机地址的最大个数不能超过16,然后地址也必须连续,那么就相当于只能是1~16了哦,或者比这个小。或者这儿修改从机最大数目为20,就能连接20个了,只是分配的内存会多。
举报

王斌

2023-5-17 14:35:06
是的,可以把这个地方改大一些,保证 RAM 够用就行,默认的是 16
举报

goodmbby

2023-5-17 14:35:49
从机地址 1 开始,
从机地址连续,如1~10 、1~100 这样的
这应该是freemodbus 主机实现时,从机地址 作为 数据数组索引造成的,从机地址为静态索引,如两个从机:1,100,则数组分配成 reg_data[100][1000],显然浪费很大的空间,这里100 为从机个数,1000为从机的寄存器。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分