完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
是的,这个是 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]; ... ... // 其他代码 } |
|
|
|
定义的数组的个数是 16,要是从机地址超过这个值了也会出问题
|
|
|
|
看代码中从机地址的最大个数不能超过16,然后地址也必须连续,那么就相当于只能是1~16了哦,或者比这个小。或者这儿修改从机最大数目为20,就能连接20个了,只是分配的内存会多。 |
|
|
|
是的,可以把这个地方改大一些,保证 RAM 够用就行,默认的是 16
|
|
|
|
从机地址 1 开始,
从机地址连续,如1~10 、1~100 这样的 这应该是freemodbus 主机实现时,从机地址 作为 数据数组索引造成的,从机地址为静态索引,如两个从机:1,100,则数组分配成 reg_data[100][1000],显然浪费很大的空间,这里100 为从机个数,1000为从机的寄存器。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1039 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
3425 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1465 浏览 0 评论
2146 浏览 0 评论
1640 浏览 0 评论
75345 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 16:38 , Processed in 0.586803 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号