|
简介 FreeModbus 是一款开源的 Modbus 协议栈,但是只有从机开源,主机源码是需要收费的。同时网上也没有比较好的开源的 Modbus 主机协议栈,在这样的背景下,armink 大神开发了这款支持主机模式的 FreeModbus 协议栈。 本文的分为2篇推送,分别介绍如何在潘多拉开发板上运行 Modbus 主机与从机。首先介绍串口方式通信的 Modbus 主机和从机。然后介绍如何使用网络进行 Modbus 通信。 准备工作1、首先演示使用串口作为 Modbus 通信通道的方式,将潘多拉开发板的 uart2 通过 usb 转串口线连接到电脑上 2、使用 usb 线连接开发板的 st-link 接口到电脑上,打开电源开发,开发板上电。 3、查看设备管理器,可以看到两个串口设备,一个用来 shell 通信,一个用来 Modbus 通信。
4 e, p" P8 U. d" h运行 Modbus 主机配置工程在 RT-Thread 源码目录下找到潘多拉的bsp rt-thread\bsp\stm32\stm32l475-atk-pandora ,在此目录下打开 ENV 工具。 配置 FreeModbus 软件包1、输入 menuconfig 命令打开配置工具 2.按照下面的路径进入 FreeModbus 软件包的配置菜单,并开启主机模式 - RT-Thread online packages --->3 _9 k) [5 r+ P4 t# n
- IoT - internet of things --->+ |7 o4 G7 W2 I3 h' s% W; q
- [*] FreeModbus: Modbus master and slave stack --->
0 R% j7 Y" z! {/ E - [*] Master mode ---> ( I0 I4 x5 K0 U' ^! U7 |+ U
- [ ] Slave mode ----
5 k7 v3 L7 y J9 a& ` - 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:通信用的波特率
& 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 。 - Hardware Drivers Config --->
! y/ S( d* v$ ~* U - On-chip Peripheral Drivers --->
! U% R3 O! h9 j - -*- Enable UART --->& |2 n |* D% A; S8 N, t, m+ Y
- [*] Enable UART2
复制代码 0 F8 {7 ?, B. e
退出 menuconfig 配置工具并保存。然后 pkgs --update 下载软件包,然后 scons --target=mdk5 生成工程。 7 D( l% N2 r- e% P* m
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
- #define MB_POLL_CYCLE_MS 500: j9 F3 [! `, S M
- ' A; {, {0 [0 t! |: q
- static void send_thread_entry(void *parameter)- |( W; A3 f' b; l0 A+ q/ i+ u2 C8 k
- {
' |9 e5 _, J) V" h2 j, v - eMBMasterReqErrCode error_code = MB_MRE_NO_ERR;% i8 Z# j& K1 @% A) c3 x6 x$ j
- rt_uint16_t error_count = 0;
, ^9 [) p4 j" F6 p7 v3 y& O5 b - USHORT data[2] = {0};
& j9 o) w) W# S/ Q - ( B1 g+ C0 I/ w8 P7 c9 I
- while (1); [% y# J% c/ V0 e
- {
8 ~: [3 L& y, q) d( L1 w4 l - /* 准备要写入的数据 */% ]6 a0 O0 r& S: T9 O* A
- data[0] = (USHORT)(rt_tick_get() / 10);
" t' H8 n# C+ J. n% O. q: z' ^* W - data[1] = (USHORT)(rt_tick_get() % 10);
' s4 l5 u: J& W8 V - /* 向从机写多个保持寄存器 */
' C+ z- J8 }- s$ S/ ?6 L - error_code = eMBMasterReqWriteMultipleHoldingRegister(SLAVE_ADDR, /* salve address */ I8 Y+ @2 b, n
- MB_SEND_REG_START, /* register start address *// |3 l; z- l0 f+ p5 B
- MB_SEND_REG_NUM, /* register total number */
, d4 Q/ J$ T7 r - data, /* data to be written */
# s& U/ L" _; _" }& @7 [ - RT_WAITING_FOREVER); /* timeout */
5 S. [4 o# o- A' }: X* o9 `/ z
8 J) z2 o' I# {! ]8 j2 v7 S- /* Record the number of errors */$ ^. s {7 o7 r9 H# q7 Y& D! f* ~
- if (error_code != MB_MRE_NO_ERR)
* E f! f0 z8 m. u. A" v+ L; d - {
- r7 W7 R' Y. C( u - error_count++;( T3 `% {2 k' w8 R, A& `* t
- }
( k! X, w0 z7 R* j0 |% p - }4 W8 G1 q8 G( O7 L! }
- }
1 V; C8 p9 D2 s v' W$ r M
% s9 o% `) ?$ Y5 i7 A- static void mb_master_poll(void *parameter)' c1 P! c2 Z7 V+ B" C1 e% P* C
- {8 `" `) q5 ?7 A1 e7 B" b2 ~$ J! p
- /* Modbus 主机协议栈初始化,初始化为 RTU 模式 */
" m$ }% k$ _5 K; ~) m - eMBMasterInit(MB_RTU, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);3 T0 Z- t2 X( X# H: j: a2 P8 u
- eMBMasterEnable();
" Z2 k) ?2 Z/ m* ^, Y, L
: e* f9 I$ @. X. i5 P8 h1 y* o7 _- while (1), k, o$ h4 I* L3 a
- {/ C3 R" {! S$ v+ S
- /* 定时轮询 *// A5 [2 C# A: x* v* ^3 m
- eMBMasterPoll();3 s) R% i$ s4 q. c
- rt_thread_mdelay(MB_POLL_CYCLE_MS);
, r, v: e' ]/ D9 J' K- }5 N - }
' O( @ |) |% _; _2 X5 `. a" X - }
复制代码 编译下载,程序开始运行。
输入 mb_master_samlpe 运行主机示例程序。 4 J& q8 y5 }! y
3 @0 M; J4 t' H |