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

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

[复制链接]
STMCU小助手 发布时间:2022-4-22 22:00
一、代码结构
( \- P5 K8 y& O& z+ n首先复制FreeModbus官网的协议栈里后缀为.m的文件,复制到自己的工程中,如下图所示:0 a2 w1 @: _0 U6 p+ W' w

8 l) [* d+ B! X: }' V- R4 H N~{0IG6V{LDXU_(YM(%7@16.png + c1 Q) f2 e3 G* g% m

# ~& \* U' B, t# q二、代码修改
! e% w7 c' {, X# B1 i) J) [! q* @. {2 W1.首先在主函数中调用初始化函数并且使能modbus:
+ ^) c) ?' E8 p$ V/ f. [- _3 y% i  F, I
  1.         eMBMasterInit(MB_RTU, 2, 115200,  MB_PAR_EVEN);" u9 o* t- U! [. [
  2.         eMBMasterEnable();
复制代码
& v. L9 Q, P# s, [7 @" i+ y
2.在一个大循环中调用eMBMasterPoll。
* ]' T4 R" t. c6 Q, p三、操作从机
  1.                 usModbusUserData[0] = (USHORT)(rt_tick_get()/10);
    4 o, _* |2 S, I' [+ @4 _" @: t
  2.                 usModbusUserData[1] = (USHORT)(rt_tick_get()%10);               
    " D, S: L5 h3 s: L
  3.                 errorCode = eMBMasterReqWriteHoldingRegister(1,3,usModbusUserData[0],200);
    % X/ A% M* G7 l9 f' f( W1 @. i
  4.                         & V4 m- w9 y, J, |+ z1 U% t
  5.         //        errorCode = eMBMasterReqReadHoldingRegister(1,3,1,RT_WAITING_FOREVER);
    + A" n* _8 ]" O( D  n0 Q9 w3 B
  6. //                errorCode = eMBMasterReqWriteCoil(1,8,0xFF00,RT_WAITING_FOREVER);
    , n# I1 b1 w  A
  7.                 if (errorCode != MB_MRE_NO_ERR) 9 w6 |9 a, `, ~$ V$ I
  8.                 {; E2 k* h3 _+ Q' N
  9.                         errorCount++;
    $ ~0 [- \1 c' Q( a1 L- B
  10.                         rt_kprintf("error\n");2 @$ }7 o! T8 X: s& E5 {
  11.                 }
    " n$ \7 ?" g" Q3 n- }, c+ [
  12.                 else
    - \" R' f( C* [
  13.                         rt_kprintf("no error\n");
复制代码

) @( r9 ^( d+ t# p- b2 T读取出来的数据在这几个数组中& e1 }+ ]% b' b) q: O! `9 I

& Q  G+ E6 v1 N$ T4 K: p3 S
  1. /*-----------------------Master mode use these variables----------------------*/; r" u2 W: m6 f' b/ h
  2. #if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
    . s+ K) I7 s( M
  3. //Master mode:DiscreteInputs variables
      ^. u0 _3 ]' \3 `
  4. USHORT   usMDiscInStart                             = M_DISCRETE_INPUT_START;
    0 M& _. Q$ X1 l, E. M3 Z
  5. #if      M_DISCRETE_INPUT_NDISCRETES%89 J8 i' z1 h1 p' C0 m
  6. UCHAR    ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8+1];
    : j, v+ C9 G9 g7 Z
  7. #else; w! \. ^# J0 w8 p
  8. UCHAR    ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8];  {1 F0 n! C- Y+ f
  9. #endif
    + ~. v; T5 V$ F. F
  10. //Master mode:Coils variables
    ' x% Y* p" n2 Y1 A0 R2 _1 ?6 h
  11. USHORT   usMCoilStart                               = M_COIL_START;
    / L. L3 V; R/ A1 r. W+ b
  12. #if      M_COIL_NCOILS%8: M( z( Q8 e* G; X; U* W
  13. UCHAR    ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8+1];7 A3 y# N! L2 b$ B9 q" l* z
  14. #else
    9 B1 l0 [0 M. l' \7 E
  15. UCHAR    ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8];; e0 T, K, N. Y& y  {2 ]
  16. #endif
    8 r: W2 ^) {  h4 D, T) N! m6 x
  17. //Master mode:InputRegister variables
    # ?4 M+ e7 j8 N# y3 w3 H
  18. USHORT   usMRegInStart                              = M_REG_INPUT_START;1 v, e5 _* x1 _# H( N; R1 {# J
  19. USHORT   usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS];; D" O% b! R; G3 k9 F, g: _, G
  20. //Master mode:HoldingRegister variables  w  }' m: z1 g, ?' K4 M  b
  21. USHORT   usMRegHoldStart                            = M_REG_HOLDING_START;0 J- N  e5 O4 }1 i& _: D
  22. USHORT   usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS];/ S! X! }: h& O" r5 b5 n2 E6 x
复制代码
: H6 }9 K6 e$ b' M2 P
四、注意点
" y+ |3 K6 ^% }/ L. T  U% N; g4 Z* q1.只支持ID连续的从机。
. Q  v, k* h/ v5 }2.下面的工程有问题:
9 |; B6 B+ T8 v( }a.读取从机的寄存器错误率比较高,是因为程序的问题。( E9 |! R" v3 q9 j+ F7 l% h& Y
b.操作从机的波特率比较讲究,除了115200,换其他的波特率程序会卡死。
* T; j) h9 l, \, oc.下面的工程仅供参考,不可在实际项目中使用。
& |# e% ~2 G! k/ gd.如果有大神解决了上面的问题,麻烦告诉一下,本人学习学习。
  G. {9 f8 x1 m; z3 V# j! u
+ c* Q$ @9 W' `. w" H. S
) D& h3 d  S# o; f8 n7 q
5 _+ f7 t7 S7 b8 h! E5 g$ D
赞 收藏 评论0 发布时间:2022-4-22 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版