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

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

4 e, p" P8 U. d" h
运行 Modbus 主机配置工程
在 RT-Thread 源码目录下找到潘多拉的bsp rt-thread\bsp\stm32\stm32l475-atk-pandora ,在此目录下打开 ENV 工具。
配置 FreeModbus 软件包
1、输入 menuconfig 命令打开配置工具
2.png
2.按照下面的路径进入 FreeModbus 软件包的配置菜单,并开启主机模式
  1. RT-Thread online packages  --->3 _9 k) [5 r+ P4 t# n
  2.   IoT - internet of things  --->+ |7 o4 G7 W2 I3 h' s% W; q
  3.     [*] FreeModbus: Modbus master and slave stack  --->
    0 R% j7 Y" z! {/ E
  4.       [*]   Master mode  ---> ( I0 I4 x5 K0 U' ^! U7 |+ U
  5.       [ ]   Slave mode  ----
    5 k7 v3 L7 y  J9 a& `
  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:通信用的波特率

    & g7 |& ^8 O5 E9 n, j5 x, X

7 [* H; v+ ?: y, Z' H& L

2 B+ Y, s( y! s2 ]配置硬件 uart2/ J- b1 j- ~5 {6 H% D
然后返回到主菜单,进入硬件配置的菜单里开启 uart2 。
  1. Hardware Drivers Config  --->
    ! y/ S( d* v$ ~* U
  2.   On-chip Peripheral Drivers  --->
    ! U% R3 O! h9 j
  3.     -*- Enable UART  --->& |2 n  |* D% A; S8 N, t, m+ Y
  4.       [*]   Enable UART2
复制代码
4.png
0 F8 {7 ?, B. e
退出 menuconfig 配置工具并保存。然后 pkgs --update 下载软件包,然后 scons --target=mdk5 生成工程。
7 D( l% N2 r- e% P* m
5.png

3 J2 F; _! N/ M! K) z+ z: ~( ]. u
( i0 _+ k; k2 B( q$ m, L运行示例程序
打开工程,在 FreeModbus 分组里可以看到主机的示例代码 sample_mb_master.c 关键代码如下所示:
6 s* A2 p' B, h' f& n
  1. #define MB_POLL_CYCLE_MS   500: j9 F3 [! `, S  M
  2. ' A; {, {0 [0 t! |: q
  3. static void send_thread_entry(void *parameter)- |( W; A3 f' b; l0 A+ q/ i+ u2 C8 k
  4. {
    ' |9 e5 _, J) V" h2 j, v
  5.    eMBMasterReqErrCode error_code = MB_MRE_NO_ERR;% i8 Z# j& K1 @% A) c3 x6 x$ j
  6.     rt_uint16_t error_count = 0;
    , ^9 [) p4 j" F6 p7 v3 y& O5 b
  7.     USHORT data[2] = {0};
    & j9 o) w) W# S/ Q
  8. ( B1 g+ C0 I/ w8 P7 c9 I
  9.    while (1); [% y# J% c/ V0 e
  10.     {
    8 ~: [3 L& y, q) d( L1 w4 l
  11.         /* 准备要写入的数据 */% ]6 a0 O0 r& S: T9 O* A
  12.         data[0] = (USHORT)(rt_tick_get() / 10);
    " t' H8 n# C+ J. n% O. q: z' ^* W
  13.         data[1] = (USHORT)(rt_tick_get() % 10);
    ' s4 l5 u: J& W8 V
  14.         /* 向从机写多个保持寄存器 */
    ' C+ z- J8 }- s$ S/ ?6 L
  15.         error_code = eMBMasterReqWriteMultipleHoldingRegister(SLAVE_ADDR,          /* salve address */  I8 Y+ @2 b, n
  16.                                                               MB_SEND_REG_START,   /* register start address *// |3 l; z- l0 f+ p5 B
  17.                                                               MB_SEND_REG_NUM,     /* register total number */
    , d4 Q/ J$ T7 r
  18.                                                               data,                /* data to be written */
    # s& U/ L" _; _" }& @7 [
  19.                                                               RT_WAITING_FOREVER); /* timeout */
    5 S. [4 o# o- A' }: X* o9 `/ z

  20. 8 J) z2 o' I# {! ]8 j2 v7 S
  21.         /* Record the number of errors */$ ^. s  {7 o7 r9 H# q7 Y& D! f* ~
  22.         if (error_code != MB_MRE_NO_ERR)
    * E  f! f0 z8 m. u. A" v+ L; d
  23.         {
    - r7 W7 R' Y. C( u
  24.             error_count++;( T3 `% {2 k' w8 R, A& `* t
  25.         }
    ( k! X, w0 z7 R* j0 |% p
  26.     }4 W8 G1 q8 G( O7 L! }
  27. }
    1 V; C8 p9 D2 s  v' W$ r  M

  28. % s9 o% `) ?$ Y5 i7 A
  29. static void mb_master_poll(void *parameter)' c1 P! c2 Z7 V+ B" C1 e% P* C
  30. {8 `" `) q5 ?7 A1 e7 B" b2 ~$ J! p
  31.     /* Modbus 主机协议栈初始化,初始化为 RTU 模式 */
    " m$ }% k$ _5 K; ~) m
  32.     eMBMasterInit(MB_RTU, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);3 T0 Z- t2 X( X# H: j: a2 P8 u
  33.     eMBMasterEnable();
    " Z2 k) ?2 Z/ m* ^, Y, L

  34. : e* f9 I$ @. X. i5 P8 h1 y* o7 _
  35.     while (1), k, o$ h4 I* L3 a
  36.     {/ C3 R" {! S$ v+ S
  37.         /* 定时轮询 *// A5 [2 C# A: x* v* ^3 m
  38.         eMBMasterPoll();3 s) R% i$ s4 q. c
  39.         rt_thread_mdelay(MB_POLL_CYCLE_MS);
    , r, v: e' ]/ D9 J' K- }5 N
  40.     }
    ' O( @  |) |% _; _2 X5 `. a" X
  41. }
复制代码
编译下载,程序开始运行。
6.png
输入 mb_master_samlpe 运行主机示例程序。
4 J& q8 y5 }! y

3 @0 M; J4 t' H
赞 收藏 评论0 发布时间:2019-7-30 15:57

举报

0个回答

所属标签

相似技术帖

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