简介 FreeModbus 是一款开源的 Modbus 协议栈,但是只有从机开源,主机源码是需要收费的。同时网上也没有比较好的开源的 Modbus 主机协议栈,在这样的背景下,armink 大神开发了这款支持主机模式的 FreeModbus 协议栈。 本文的分为2篇推送,分别介绍如何在潘多拉开发板上运行 Modbus 主机与从机。首先介绍串口方式通信的 Modbus 主机和从机。然后介绍如何使用网络进行 Modbus 通信。 准备工作1、首先演示使用串口作为 Modbus 通信通道的方式,将潘多拉开发板的 uart2 通过 usb 转串口线连接到电脑上 2、使用 usb 线连接开发板的 st-link 接口到电脑上,打开电源开发,开发板上电。 3、查看设备管理器,可以看到两个串口设备,一个用来 shell 通信,一个用来 Modbus 通信。
" y7 K$ w7 m: P9 j6 J6 _& E% ]运行 Modbus 主机配置工程在 RT-Thread 源码目录下找到潘多拉的bsp rt-thread\bsp\stm32\stm32l475-atk-pandora ,在此目录下打开 ENV 工具。 配置 FreeModbus 软件包1、输入 menuconfig 命令打开配置工具 2.按照下面的路径进入 FreeModbus 软件包的配置菜单,并开启主机模式 - RT-Thread online packages --->9 E5 I) w9 r1 P0 k& N3 h1 j! h
- IoT - internet of things --->
. J# K- b% l# z& b i3 ~5 J/ l( f2 \ - [*] FreeModbus: Modbus master and slave stack --->
/ q# L* o1 ^: C - [*] Master mode --->
0 c, J. _2 @, E( k - [ ] Slave mode ----
+ C" k. s/ t* w0 C$ U - Version (latest) --->
复制代码3.配置主机模式选项 进入 Mastar mode 配置菜单,然后开启主机示例程序,如下图所示: 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:通信用的波特率 . U3 V _" d' m. Q
: h6 g. s% C0 S- m
( U* |3 q6 C8 N, ]' p! r+ j) \配置硬件 uart2% ?, Z: a% B8 |9 E9 a( Q* ? H: X% T
然后返回到主菜单,进入硬件配置的菜单里开启 uart2 。 - Hardware Drivers Config --->( ]1 h3 u ~7 @ f& |
- On-chip Peripheral Drivers --->
6 B% s) P+ U5 i - -*- Enable UART --->
2 \' ?2 u3 k9 |! a" [$ i. F9 |6 _# D - [*] Enable UART2
复制代码
- X2 `& w( F# V- Z8 B: s8 z退出 menuconfig 配置工具并保存。然后 pkgs --update 下载软件包,然后 scons --target=mdk5 生成工程。
* x/ k0 O+ R1 x) Y; p+ E j9 M- B; X$ {& `( X2 S
: ?% @7 i+ m/ ?$ b
运行示例程序打开工程,在 FreeModbus 分组里可以看到主机的示例代码 sample_mb_master.c 关键代码如下所示:
2 w$ P) l0 Q, s- #define MB_POLL_CYCLE_MS 500
6 M5 o- M/ K* A& m) b# f! r - 3 `3 c7 o& g. f4 h* `( q, J
- static void send_thread_entry(void *parameter)
9 w' v4 u5 Y D6 h: S8 D - {' F8 x# a( u% d) `
- eMBMasterReqErrCode error_code = MB_MRE_NO_ERR;
1 ^. r D+ w1 W) `1 t" p9 V - rt_uint16_t error_count = 0;- o( |! A- y6 J; N$ c
- USHORT data[2] = {0};7 f/ M, M+ ]1 p1 {0 b7 X" D- ?
- \6 m1 x) c4 j- i2 _4 m
- while (1)4 r1 I5 `' g4 c1 y
- {* S4 L3 V7 z# g9 _3 s% ]5 {
- /* 准备要写入的数据 */' o, h3 L- t% j8 i. S3 m
- data[0] = (USHORT)(rt_tick_get() / 10);! ^# G& ~: g) s8 e& `
- data[1] = (USHORT)(rt_tick_get() % 10);
' g/ V& R; j" ]4 o- a4 ~ - /* 向从机写多个保持寄存器 */& j8 P1 W8 X" M5 |! x4 T8 {
- error_code = eMBMasterReqWriteMultipleHoldingRegister(SLAVE_ADDR, /* salve address *// [3 {4 p) F4 Q
- MB_SEND_REG_START, /* register start address */
/ j" ^+ G- J. n* c - MB_SEND_REG_NUM, /* register total number */
6 ?- Y0 @- x9 U% _5 R' L: Z - data, /* data to be written */4 O6 u+ o/ \: I, o* }, u
- RT_WAITING_FOREVER); /* timeout */8 p1 {6 L, x$ Q" {
; {, S1 M6 x" N5 G% D) l- /* Record the number of errors */
3 Q% M) c; I ]' w* D - if (error_code != MB_MRE_NO_ERR), u& N) G9 y% m. t- o
- {
! n: O ^; S1 h9 ? - error_count++;' r1 q, a. [! w1 b! h
- }
6 L, V6 B( n* J* K1 ~$ n - }9 G9 m, o, R$ O6 N6 r
- }% A/ J6 b( e# h/ P6 }& t7 }& \
- % O- z" Y) f1 m- ]
- static void mb_master_poll(void *parameter)
4 [- A g( @6 l2 f - {
7 ~% w* X' S# U- K9 i6 {$ P5 x - /* Modbus 主机协议栈初始化,初始化为 RTU 模式 */
0 y5 ^) W! V& j# G5 C2 E9 l- y - eMBMasterInit(MB_RTU, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);
; o( ], C" F! V/ o8 c" h. A - eMBMasterEnable();
5 g+ b# b) Y( S# v" d \ - & Q% E' B7 z& a& a& d( ?+ R! w
- while (1)" l' K0 q, u0 e+ n0 e0 @
- {9 H, a# S& R: i8 N4 }7 K9 y
- /* 定时轮询 */
, y0 o, h" p! c - eMBMasterPoll();; u0 {7 B* n. \
- rt_thread_mdelay(MB_POLL_CYCLE_MS);* F: i7 b1 w- d; G
- }
4 s" q- m2 p" s' D7 R - }
复制代码 编译下载,程序开始运行。
输入 mb_master_samlpe 运行主机示例程序。
1 Y) W9 W, c) @/ f, G% A, f
) ^9 f4 Y& h4 D" r- _) Y |