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

FreeModbus 应用笔记(1)——如何在潘多拉开发板上运行 Modb...

[复制链接]
rtthread 发布时间:2019-7-30 15:57
简介
FreeModbus 是一款开源的 Modbus 协议栈,但是只有从机开源,主机源码是需要收费的。同时网上也没有比较好的开源的 Modbus 主机协议栈,在这样的背景下,armink 大神开发了这款支持主机模式的 FreeModbus 协议栈。
本文的分为2篇推送,分别介绍如何在潘多拉开发板上运行 Modbus 主机与从机。首先介绍串口方式通信的 Modbus 主机和从机。然后介绍如何使用网络进行 Modbus 通信。
准备工作
1、首先演示使用串口作为 Modbus 通信通道的方式,将潘多拉开发板的 uart2 通过 usb 转串口线连接到电脑上
2、使用 usb 线连接开发板的 st-link 接口到电脑上,打开电源开发,开发板上电。
3、查看设备管理器,可以看到两个串口设备,一个用来 shell 通信,一个用来 Modbus 通信。
1.png
5 C5 H/ r4 d  P" v/ h  t" s9 l* j3 i
运行 Modbus 主机配置工程
在 RT-Thread 源码目录下找到潘多拉的bsp rt-thread\bsp\stm32\stm32l475-atk-pandora ,在此目录下打开 ENV 工具。
配置 FreeModbus 软件包
1、输入 menuconfig 命令打开配置工具
2.png
2.按照下面的路径进入 FreeModbus 软件包的配置菜单,并开启主机模式
  1. RT-Thread online packages  --->2 ]2 q' S9 o# W
  2.   IoT - internet of things  --->
    + C/ y5 m% \- _/ O* v1 J
  3.     [*] FreeModbus: Modbus master and slave stack  --->$ l) @  p) X8 K' G$ z2 }# m: J
  4.       [*]   Master mode  --->
      k* T, m3 y( j2 A' U5 c, J7 x
  5.       [ ]   Slave mode  ----) B, b! B/ q" g" R( W, i
  6.       Version (latest)  --->
复制代码
3.配置主机模式选项
进入 Mastar mode 配置菜单,然后开启主机示例程序,如下图所示:
3.png
  • advanced configuration:高级配置选项
  • Enable RTU master mode:开启 RTU 模式支持(主机暂只支持 RTU 模式)
  • Enable master sample:开启主机示例程序
  • Test slave device address:测试用的从机设备地址
  • uart number used by master sample, e.g. 2 means uart2:表示使用串口几进行通信,默认使用 uart2
  • uart baudrate used by master sample:通信用的波特率
    " W; u4 p8 R7 J

; O8 b$ l* _0 V8 I1 m7 [7 F4 h6 k8 q  n
# w% s+ P0 |6 L5 r$ H3 O
配置硬件 uart2
( z& f3 ]; b" E
然后返回到主菜单,进入硬件配置的菜单里开启 uart2 。
  1. Hardware Drivers Config  --->! \' |8 Y" G6 j8 n! A" ?' x( m
  2.   On-chip Peripheral Drivers  --->
    9 k9 j: |7 o1 ^) b2 r
  3.     -*- Enable UART  --->, v2 a% W) k, U+ T6 ]& E  U
  4.       [*]   Enable UART2
复制代码
4.png
( a- \6 y: |5 ], H) Q/ M% r3 [0 f
退出 menuconfig 配置工具并保存。然后 pkgs --update 下载软件包,然后 scons --target=mdk5 生成工程。

" @3 Q) r5 ~6 B: R3 B7 B. \- ^
5.png
) @3 u% V) ^) S. L
, F2 b. f3 W& q( g( |7 V$ b% ?
运行示例程序
打开工程,在 FreeModbus 分组里可以看到主机的示例代码 sample_mb_master.c 关键代码如下所示:

0 e% Q/ v/ q1 D& i# F# ^. [8 l
  1. #define MB_POLL_CYCLE_MS   5004 B" E$ S9 ?- q0 G+ E) l: N
  2. 8 @, p2 o  B( p) \+ N9 ?  u
  3. static void send_thread_entry(void *parameter)
    0 Y6 y$ ?1 e1 N# g) H
  4. {; J5 I8 H" w6 M& f7 y4 P9 x
  5.    eMBMasterReqErrCode error_code = MB_MRE_NO_ERR;
    7 k" o' u) Q! R0 L5 ?+ \
  6.     rt_uint16_t error_count = 0;& p: W  y8 a- S! G4 T# V/ ^, S
  7.     USHORT data[2] = {0};
    2 H$ r* B$ y; ^) P# Z$ F
  8. 0 \% A" R! M$ u1 J# h2 ~: }* h  X
  9.    while (1)7 `! x0 ~- ?2 u5 y
  10.     {
    8 ~  L7 [* `9 I# S
  11.         /* 准备要写入的数据 */
    6 m- {5 ?1 e3 ?) L( P3 X
  12.         data[0] = (USHORT)(rt_tick_get() / 10);; c9 ?: y, x: S
  13.         data[1] = (USHORT)(rt_tick_get() % 10);
    1 D* B- j5 G3 F) o* o
  14.         /* 向从机写多个保持寄存器 */
      p( f6 L& ~8 E: S+ g2 W
  15.         error_code = eMBMasterReqWriteMultipleHoldingRegister(SLAVE_ADDR,          /* salve address */
      z8 D$ A8 s) e7 b
  16.                                                               MB_SEND_REG_START,   /* register start address */" Y" Q# w% M: T" D' D9 D
  17.                                                               MB_SEND_REG_NUM,     /* register total number */
    4 x- V/ G0 f& o( S; x8 o
  18.                                                               data,                /* data to be written */
    - L5 U# [& C& {# }+ N
  19.                                                               RT_WAITING_FOREVER); /* timeout */$ D6 K( h7 Y, c) X& R4 S  W4 c

  20. 8 {# {2 E, M; \% w0 ], Q7 Y
  21.         /* Record the number of errors */: h0 z( f  }( k+ s0 l
  22.         if (error_code != MB_MRE_NO_ERR)
    3 x& `! n8 o2 c1 a3 Z5 g
  23.         {' e' l4 c/ K# U8 Z+ R
  24.             error_count++;
    3 C3 H7 y* J5 y
  25.         }
    : k5 N( Q7 M' T+ F& k+ |$ f1 u
  26.     }
    : E+ ]1 _! c/ `
  27. }
    % W" z0 _# @" m2 q' g
  28. ! e9 H: ]* e0 R! m5 o  I2 e$ V+ U4 s
  29. static void mb_master_poll(void *parameter)
    ! J. L! p) Q: T# P" C! r3 x
  30. {
    5 Z- ]. ^- \6 Q8 F% ^5 _# w7 O8 x
  31.     /* Modbus 主机协议栈初始化,初始化为 RTU 模式 */) S. {. |# z, w( n5 ~
  32.     eMBMasterInit(MB_RTU, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);
    1 \6 g3 B2 q& ]( i) }0 ^* B0 h
  33.     eMBMasterEnable();
    . U' [" w0 }1 s+ f5 d# n

  34. : v+ P) y7 a4 h$ G% Z) _
  35.     while (1)
    5 ~; U: Y. \' X0 C. J
  36.     {
    - A( D0 y9 _/ Y' o8 O
  37.         /* 定时轮询 */- M; s, p$ P8 a8 c) I
  38.         eMBMasterPoll();
    2 S$ f, [" v4 ]6 f7 Z. H
  39.         rt_thread_mdelay(MB_POLL_CYCLE_MS);' s  t( o  ?( E' X" S7 T5 N. Z+ f
  40.     }
    " M- N9 P# S% ~% T  ]) _! M
  41. }
复制代码
编译下载,程序开始运行。
6.png
输入 mb_master_samlpe 运行主机示例程序。

# W4 s5 p! j* _0 K# j" Q5 ?% |% N
0 Q2 q: I8 Q8 e4 Y  P$ s7 K
收藏 评论0 发布时间:2019-7-30 15:57

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版