你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103移植FreeModbus主机协议实现modbus主机

[复制链接]
STMCU小助手 发布时间:2022-4-22 22:00
一、代码结构
首先复制FreeModbus官网的协议栈里后缀为.m的文件,复制到自己的工程中,如下图所示:

N~{0IG6V{LDXU_(YM(%7@16.png

二、代码修改
1.首先在主函数中调用初始化函数并且使能modbus:

  1.         eMBMasterInit(MB_RTU, 2, 115200,  MB_PAR_EVEN);
  2.         eMBMasterEnable();
复制代码

2.在一个大循环中调用eMBMasterPoll。
三、操作从机
  1.                 usModbusUserData[0] = (USHORT)(rt_tick_get()/10);
  2.                 usModbusUserData[1] = (USHORT)(rt_tick_get()%10);               
  3.                 errorCode = eMBMasterReqWriteHoldingRegister(1,3,usModbusUserData[0],200);
  4.                         
  5.         //        errorCode = eMBMasterReqReadHoldingRegister(1,3,1,RT_WAITING_FOREVER);
  6. //                errorCode = eMBMasterReqWriteCoil(1,8,0xFF00,RT_WAITING_FOREVER);
  7.                 if (errorCode != MB_MRE_NO_ERR)
  8.                 {
  9.                         errorCount++;
  10.                         rt_kprintf("error\n");
  11.                 }
  12.                 else
  13.                         rt_kprintf("no error\n");
复制代码

读取出来的数据在这几个数组中

  1. /*-----------------------Master mode use these variables----------------------*/
  2. #if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
  3. //Master mode:DiscreteInputs variables
  4. USHORT   usMDiscInStart                             = M_DISCRETE_INPUT_START;
  5. #if      M_DISCRETE_INPUT_NDISCRETES%8
  6. UCHAR    ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8+1];
  7. #else
  8. UCHAR    ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8];
  9. #endif
  10. //Master mode:Coils variables
  11. USHORT   usMCoilStart                               = M_COIL_START;
  12. #if      M_COIL_NCOILS%8
  13. UCHAR    ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8+1];
  14. #else
  15. UCHAR    ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8];
  16. #endif
  17. //Master mode:InputRegister variables
  18. USHORT   usMRegInStart                              = M_REG_INPUT_START;
  19. USHORT   usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS];
  20. //Master mode:HoldingRegister variables
  21. USHORT   usMRegHoldStart                            = M_REG_HOLDING_START;
  22. USHORT   usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS];
复制代码

四、注意点
1.只支持ID连续的从机。
2.下面的工程有问题:
a.读取从机的寄存器错误率比较高,是因为程序的问题。
b.操作从机的波特率比较讲究,除了115200,换其他的波特率程序会卡死。
c.下面的工程仅供参考,不可在实际项目中使用。
d.如果有大神解决了上面的问题,麻烦告诉一下,本人学习学习。



收藏 评论0 发布时间:2022-4-22 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版