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

【经验分享】STM32:Modbus-RTU通讯协议

[复制链接]
STMCU小助手 发布时间:2022-5-3 14:32
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
+ s" i' M  N- g+ _) u* O
8 V5 ^' O0 z$ O, D4 l9 g一、Modbus-RTU报文格式  f: H6 ^- I, G/ P! k

7 V# w; o% C; c/ R, Q BN}2Z}OL)U@E7G0TZ{JD.png
6 W& O$ s+ o, Y7 a8 Y3 z2 s: |) N. _2 ~% e0 a2 z) C
注:1 个字节由 8 位二进制组成,即 8 bits。; a+ h' s3 n; d: ?8 I$ D
; a' k* h9 d, c! k8 d- @
1. 设备地址
0 Z( X) P, n, F% m; @设备地址是每次通讯信息帧的第一个字节,从 0 到 255。这个字节表明由用户设置为该地址的设备将接收由主站发过来的此条信息,每个设备必须有一个唯一的地址,只有符合这个地址的设备才能响应主站回送信息。当从机回送信息时,回送数据的第一个字节也是这个设备的地址。; D1 Y* A) b7 u2 a3 g
主站发送的数据当中的设备地址表明将要发送到哪个设备,设备返回的数据当中的设备地址表明此数据来自何处。- [1 `1 b8 Z0 R1 U
# v. j8 Z, F5 x! q  H+ T( h
2. 功能码, u) f- V( \2 M+ {1 M, N) C
功能码是每次通讯的数据的第二个字节,MODBUS 通讯规约可以定义的功能码的范围为 1 到 127,我们仅采用了其中一部分功能码,具体如下:) `% u5 W4 b, @- z8 [

6 U( t7 @: N) Z' _2 M& E $NT03`MGL_JNR{706[JH)HN.png 3 b, B, u3 P7 @/ E  A  J) d

: T, q- h2 w, N! N# v* X4 x4 x3. 数据区

( Y* X8 [9 Z2 s. a% }数据区是主站要写给从站的数据和从站回复主站要读的数据。3 C) v. w* |7 M8 S/ B3 V$ m
数据区的内容以 Big Endian 形式储存,通讯时先发高位字节,后发低位字节。2 n9 b) J- F0 n1 @

9 s3 p: D* a: k9 Y" ]  @4. CRC校验
/ C5 @( F# J3 L( ]$ X4 f6 A/ M
CRC校验是16 位循环冗余校验码,主要用来校验传输数据的准确性。
- f2 ^" [7 R, f# H9 S& X& o/ S6 D0 s2 b" O. F' y
8 M: n3 u  F0 B
二、功能码详细说明. T. w# ]( @) s! G2 ~( k$ e6 }/ h) L
1. 功能码01:读开关9 z0 a$ E7 d( Y  Z1 p; t" ^
所有的开关都以二进制位进行编码,每个开关一位,一个字节可以容纳 8 个开关的状态,1 为合状态,0 为分状态。; }  ^6 a- \  t0 t' W; d
开关的地址为位编码的,可以理解为地址为 0 的开关在数据区第 1 个字节的 D0 位,地址为 1 的开关在 数据区的第 1 个字节的 D1 位,……地址为 7 的开关在数据区的第 1 个字节的 D7 位,地址为 8 的开关 在数据区的第 2 个字节的 D0 位,地址为 X 的开关,在数据区第 X/8+1 个字节的 D[X%8]位。
- @& y, {; |9 X" l& t) J* T主机发送报文格式:
4 [6 }+ t2 w! b  C( ]4 z- I. k( z& Q/ X* t* G

2 ?( |. x* f+ e: c1 {% ]. r5 A0 T/ z
从机返回数据报文格式:

# \: G$ Q5 L1 d& M' O8 \4 E* U5 N: U8 d: U) d8 v# A
1W}D58}ZFORG@@AOL(ANDL9.png
' X5 x' N* X9 V4 a. j' p. B8 I0 a+ ^
2. 功能码03:读寄存器
8 Z: }/ @- r- C" U9 D  D/ [每个寄存器都是两个字节 (16 位二进制数据),高位字节在前,低位字节在后。每个寄存器表示的数据 范围为-32768 到 32767,负数用补码 (two’s complement) 表示。6 u2 v9 m: @% A! p4 {
寄存器的地址编码,可以理解为地址为 0 的寄存器在数据区的第 1 个和第 2 个字节,地址为 1 的寄存 器在数据区的第 3 个和第 4 个字节,地址为 2 的寄存器在数据区的第 5 个和第 6 个字节……  j, R; ^& n: p+ ?- d
主机发送报文格式:
7 s. t2 O" W) l7 d+ T7 Y0 B, i0 ^$ f, T0 n4 j
9D5P)P6S4ALTW88PW8LGR22.png
0 h' m# c" M+ f& D- {6 }  V
. f! D' A' W! N. @5 }$ l从机返回数据报文格式:
  z$ W. V, L6 i5 q- n$ r7 h
/ t. H, g; p% _9 \ 8 l4 x& ~7 c( I

3 o. c7 X1 ^# Y% y+ @
* }2 ], N6 G& t+ t3. 功能码05:写单路开关
' j' w9 p8 \; Q. _+ b/ c$ @主机发送报文格式:
" U2 \9 Q8 W4 G- F0 ~" O: R9 ^5 w0 y% I
AZA$$S[FZQ1ZR%JNZ)DK.png 6 b, w; X. P8 q4 w: g
5 `+ L3 h9 h0 u- p& N
从机返回数据报文格式:1 M7 w2 D) D' K& w
从机返回的报文与主机发送的报文完全相同。% R1 Z3 \# G  Y* L( f5 X% K
从机返回这个报文,说明装置接受了遥控命令,开始执行命令,判断是否成功的执行完成了要以读开关的状态等于控制的目标值为准,即读出的开关状 态等于写入的开关状态,认为遥控执行成功的完成了。5 _4 W" R4 d7 K* K

0 E* P; u# A3 A8 g4. 功能码06:写单个寄存器
8 Q/ o- l% t8 F( i8 T2 `9 a主机发送报文格式:
( j  L8 i: a* l' b- u
/ [  I: Z4 U+ D3 x( y) F
XQK7NZ2K21$P)EGEH9`@[7B.png
' z# ?6 ?/ ?" A; G& C' K4 S* {7 w7 ]& I
从机返回数据报文格式:

! i1 H  p; k. a- O4 e: \; l从机返回的报文与主机发送的报文完全相同。. ]9 Q. V/ H" i( a5 L1 `& W5 j
从机返回这个报文,说明装置接受了写入寄存器的命令, 开始执行命令,判断是否成功的执行完成了写入数据,要以读寄存器的数据等于写入的值为准, 即读出的寄存器数据等于写入的寄存器数据,认为写入执行成功的完成了。6 B' `3 C* `  C# P& h: p. _- R

' x/ G4 A, D8 ^% X- \6 g; ~5. 功能码0F:写多路开关
+ D  k. s: r& p" \5 w) M* K主机发送报文格式:

) X8 x$ ~) P! `4 z  u) z4 j0 O/ u- C- f2 Y& g7 m) m; b" P
%5~0~~Y9XF(ZL3`1B]%QG{3.png
! X/ r  P. p( {! ?& s2 T7 ^% C8 e, W8 ?) b" B8 R4 ~
从机返回数据报文格式:
! X  Y& \8 s8 o- n
! r* x* b7 f1 W; a 0J{5RNOL_[FR4YL5T6SC4~8.png
) i$ h! h5 N6 U8 j/ K( T$ V
' k* T% p+ q7 H8 H* S1 D  P5 F从机返回这个报文,说明装置接受了遥控命令,开始执行命令,判断是否成功的执行完成了要以读开关 的状态 等于控制的目标值为准,即读出的开关状态等于写入的开关状态,认为遥控执行成功的 完成了。8 p# [3 J' D* i: ?( K) d

1 Z9 S) W1 d# \9 A6. 功能码10:写多个寄存器
: N' ^7 C. A& T  o1 ]; t/ y4 R$ [主机发送报文格式:
$ Y/ X7 t4 y( |8 q  j  r4 k. l  [+ {& w9 u" D
{2A`9Y88}$Q~9VHV_[SY{TF.png : N6 d: }+ ?! {$ C

* h" G9 r% j3 {! A" t) D" [& N8 G从机返回数据报文格式:
) g" C8 k* A7 M9 }& Q7 `; r! s# u  W) X" [7 F1 h' ]* k% ^
ZHDO7D`GBADVBKJRGY~%`3H.png
) ?0 [! H* I3 v/ _+ ]7 k4 N" `+ W
; t0 y5 o+ q/ ^* ^! K从机返回这个报文,说明从机接受了遥调命令,开始执行命令,判断是否成功的执行完成了要以读寄存 器的数据等于遥调的目标值为准,即读出的寄存器的数据等于写入寄存器的数据,认为遥调执 行成功的完成了。  g4 }( z/ }: L+ o0 _/ E! M2 m

+ g4 r- q: d: |& c2 z, M. K) V三、从机对主机命令的回应' a! C7 x4 _, l) D
1. 从机对主机的正确命令回应7 r8 _( E: x' }1 P$ n+ x5 ?

0 o. N9 H$ r1 O! y" P 9Z096OZ(S$Z9OW}U_HB_SOJ.png : e0 O9 |& S& d/ {, K' Q. Q; q
/ G0 U2 Q6 q( b/ A0 _! \
从机的功能码和主机下发的功能码相同。
* J# ^. ?4 J) L! O
. t1 y" o' P7 W* ?8 h2. 从机对主机的错误命令回应
" G/ c& ?9 s& Z# y$ S2 }
% r2 s2 g; r$ \" S/ p5 A( f% b _G}@ZXNXYSZBZK[O0QG6_HL.png ' m8 S) b, V! _
& r  M; s; z+ p2 n5 f3 J+ F
从机功能码=主机功能码|0x80。
1 ^  g) u  s$ C$ ?错误编码9 q  ^* Y4 t( }; c

: Q9 n  L9 k" Z- \ 7R}UKQ@E46XOB927JB9SK]L.png ' K2 D5 r# L) K" W" y
1 F& @: s, r. T
3. 错误命令回应报文示例
9 X! V/ ~: Y+ r$ @01 81 02 C1 91 收到的功能码为01的命令有错误(81),错误码为 02:地址无效或长度越界 。: I$ ~* ^" p$ V2 c0 E( C
01 83 02 C0 F1 收到的功能码为03的命令有错误(83),错误码为 02:地址无效或长度越界。
% B9 q4 _. d5 q5 P$ L$ I; R" p01 85 03 02 91 收到的功能码为05的命令有错误(85),错误码为 03:写入的数值无效。7 j4 F9 i0 f! W  F. T/ ?1 j1 l6 W
( p2 [( i' k; c
三、Modbus-RTU通讯协议报文示例  S# w1 H8 m: a- E3 S9 q
从机——设备地址为 8
% ?+ H' Y( S+ T3 H; w从机——开关状态:0----分,1----合。% \: ^$ l+ A4 k: @& b% S

" f9 Y4 Q+ x8 l, }; b T8O3KKZIUGIR6P)]@YQ8B%4.png 5 D" B: B: P* X3 N

2 I% Q. G( _6 I) F从机——寄存器数据  u! z3 \) g: A  K6 n/ _+ f( x1 G
' w" ~5 U! N! `
HZI0RF6RJ`}Z[(B8ZN]3WGV.png 1IP61~3N1`J)SYK8A}GK8[J.png
! U+ C+ l; y) E! b
1 c: `4 L) f4 [0 Y3 K5 a  U1. 功能码01:读开关
5 G5 ?% Z* _  F2 R& S5 N# @$ a查询地址从4到8的5个开关状态:
  D$ |9 N1 x: N' d0 |8 j, [主机发送数据(HEX):08 01 00 04 00 05 BD 51
% K  U! U9 C3 i2 E5 i  G1 c3 b! U* {: L! a5 c! X  f
SWO96{B@{7M0JGJ6_ROD66D.png
7 Z4 e* h( A0 Q5 F* S0 ^$ b* h# a: S$ i7 c# y
从机返回数据(HEX):08 01 01 03 12 15! A( _; c: v' z# H* ^# ^1 H, e
+ i8 T# X7 |" F6 H1 E. A6 B
7PX[P8VNI5GT%8`PFS1Q)YO.png
- S. W. A7 x. n" C; m. j, k. |, f0 ?! B. n7 V1 h; E3 T% O
2. 功能码03:读寄存器2 u( i$ H! k- K" J; s
查询地址从2到5的4个寄存器数据:
1 O; ^# T# e1 g$ o5 I* [主机发送数据(HEX):08 03 00 02 00 04 E5 500 H) v+ T; g! _+ ]
2 b% X. h5 a; F. |+ n, Z
MB6RXEIHW9{AU{C3V`94XG5.png
3 W3 `8 r+ O: \4 _: Y9 i# K: L
+ |+ U' ^7 _1 M5 W2 s& B. _) y% b从机返回数据(HEX):08 03 08 00 0A 07 D0 00 C8 00 14 50 DF" t5 r; N( j* M* V9 s0 M2 C

4 F0 G; v* V4 y* M 222~8L{_BFS2V%VR1TKRS85.png 4 V4 D  [6 s# A' r) W% I" L4 o; f

- O7 }% X& K* G6 G3. 功能码05:写单路开关
" h- k! _: Y+ Y, E对地址为6的开关进行合闸:
$ V/ @3 m2 I% ?4 a9 e
主机发送数据(HEX):08 05 00 06 FF 00 6C A2
- W( ~7 b$ H; ~从机返回数据(HEX):08 05 00 06 FF 00 6C A2
% r+ B# p: a  w  T, ~: T* T+ F* p. F0 Z
ZP8S_7JHCZZDW}AN8{X2)MV.png   B! s. E+ t3 x/ a
% e1 G# `9 R6 y) K2 S; M# ]
对地址为6的开关进行分闸:
! @+ L6 ^% h, g主机发送数据(HEX):08 05 00 06 00 00 2D 526 u; Z9 h4 N- H- m2 e3 a7 E
从机返回数据(HEX):08 05 00 06 00 00 2D 52
: R' m, d6 A* I: q: R: }2 T* K0 W7 |
)[~U6MB~F3QK0L}6C66V)QC.png ' e" L2 M/ `  W7 w7 Y# M) l
7 x# w8 e1 Y" [
4. 功能码06:写单个寄存器6 H7 k; T: r" J. ]
把数据-30写入地址为8的寄存器:
  @' _) K# O9 b7 ^7 u
主机发送数据(HEX):08 06 00 08 FF E2 C9 28
- W" F- ^& F* X. j从机返回数据(HEX):08 06 00 08 FF E2 C9 28% Q' ?. X0 Q! B

- M  |4 C. H0 p( _# T* } X`$`$UDABVBZP[~X{TQ%V4I.png
4 }8 [  w7 c: N
4 ^! p! t5 @; C* l0 c  E/ k5. 功能码0F:写多路开关
( u. y$ Z: v% ], P3 w- s4 e" Z
对地址为 6 的开关进行合闸置1、对地址为 7 的开关进行分闸置0、对地址为 8 的开关进行合闸置1:/ E( P" i0 m5 Q$ e/ X
主机发送数据(HEX):08 0F 00 06 00 03 01 05 07 3E! I4 h* c- f3 |- g; t7 ?
" `) T6 e# y5 P
0BETAU)TG4F180$PL4@$P$C.png 1 v2 h2 h" h7 X# }6 h  G9 J

* }" p+ Z* h) d6 \8 G从机返回数据(HEX):08 0F 00 06 00 03 F5 52) c! O3 x' t. ?7 ^. K

! u. c. V8 R1 |8 u0 w- u `AF%}`(_F{[TA%_GC3%_TO4.png ' p4 r5 u! h6 u# s* c. P

) `' R& }: b* x6. 功能码10:写多个寄存器
' h  S3 J+ q) h0 L) {  R; v  _把数据 -20 写入地址为 5 的寄存器,把-3000 写入地址为 6 的寄存器,把 -300 写入地址为 7 的寄存器:
; Z  w/ l! G# Q7 r7 j/ P  O主机发送数据(HEX):08 10 00 05 00 03 06 FF EC F4 48 FE D4 9C 9B$ h- W/ n) O: u/ a) Y
* {0 T0 S( b( I+ G
KYOL(HVLVBE$`EQ})RF9D.png
0 |/ O. N3 A5 W4 D4 ?7 l; h! p
: I$ D' f6 }" o$ \4 ~8 L从机返回数据(HEX):08 10 00 05 00 03 90 90
+ Y7 Z. p9 g" b3 c) c: y+ b' n* o  N
(1L]((2[HN1E)JYP554]8~7.png
* [- e; l9 `% x: I# p, ?5 `' g5 f5 X
2 x+ \* `: F( f1 J0 O( p/ ?
, `8 O1 d- F2 b/ z0 A

2 O' o5 I2 Y$ H5 h
赞 收藏 评论0 发布时间:2022-5-3 14:32

举报

0个回答

所属标签

相似技术帖

官网相关资源

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