LabVIEW

 找回密碼
 注冊

掃一掃,訪問微社區

查看: 213|回復: 0
打印 上一主題 下一主題

[共享貼] Modbus講解

[復制鏈接]
跳轉到指定樓層
1
發表于 2020-4-6 11:19:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
USB-6009數據采集卡首發
一、Modbus 協議簡介 7 J7 w$ w5 a+ t, a( h
Modbus 協議是應用于電子控制器上的一種通用語言。通過此協議,控制器相互之間、控制器經由網絡(例如以太網)和其它設備之間可以通信。它已經成為一通用工業標準。有了它,不同廠商生產的控制設備可以連成工業網絡,進行集中監控。
; z8 x1 Q6 I, _% T- k1 v1 O此協議定義了一個控制器能認識使用的消息結構,而不管它們是經過何種網絡進行通信的。它描述了一控制器請求訪問其它設備的過程,如果回應來自其它設備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內容的公共格式。 ! I' g4 }0 f' ^7 c- f' Z; r& Z1 k
當在一Modbus網絡上通信時,此協議決定了每個控制器須要知道它們的設備地址,識別按地址發來的消息,決定要產生何種行動。如果需要回應,控制器將生成反饋信息并用Modbus協議發出。在其它網絡上,包含了Modbus協議的消息轉換為在此網絡上使用的幀或包結構。這種轉換也擴展了根據具體的網絡解決節地址、路由路徑及錯誤檢測的方法。- V+ U/ p% T: `# S) \6 K; Z
modbus由MODICON公司于1979年開發,是一種工業現場總線協議標準。1996年施耐德公司推出基于以太網TCP/IP的modbus協議:modbusTCP。
0 s, V( e; W3 S, qModbus協議是一項應用層報文傳輸協議,包括ASCII、RTU、TCP三種報文類型。" L( O1 P; [. {
標準的Modbus協議物理層接口有RS232、RS422、RS485和以太網接口,采用master/slave方式通信。& T$ Z6 N3 w6 R$ f; f9 _
1.1)在Modbus網絡上轉輸
0 K: ~$ K4 b* I( P3 Z% Q  標準的Modbus口是使用一RS-232C兼容串行接口,它定義了連接口的針腳、電纜、信號位、傳輸波特率、奇偶校驗?刂破髂苤苯踊蚪浻蒑odem組網。 : ?$ N5 c, y% E$ \1 g9 w. |( x
控制器通信使用主—從技術,即僅一設備(主設備)能初始化傳輸(查詢)。其它設備(從設備)根據主設備查詢提供的數據作出相應反應。典型的主設備:主機和可編程儀表。典型的從設備:可編程控制器.
2 P( R5 ~4 d. U) c  p- A 主設備可單獨和從設備通信,也能以廣播方式和所有從設備通信。如果單獨通信,從設備返回一消息作為回應,如果是以廣播方式查詢的,則不作任何回應。Modbus協議建立了主設備查詢的格式:設備(或廣播)地址、功能代碼、所有要發送的數據、一錯誤檢測域。$ G2 d7 @  a8 u- V9 O4 z- S
從設備回應消息也由Modbus協議構成,包括確認要行動的域、任何要返回的數據、和一錯誤檢測域。如果在消息接收過程中發生一錯誤,或從設備不能執行其命令,從設備將建立一錯誤消息并把它作為回應發送出去。2 b* Y& h0 y7 I: {
(1.2)在其它類型網絡上轉輸
* r& P8 W4 i! r& v3 m在其它網絡上,控制器使用對等技術通信,故任何控制都能初始和其它控制器的通信。這樣在單獨的通信過程中,控制器既可作為主設備也可作為從設備。提供的多個內部通道可允許同時發生的傳輸進程。3 m7 I1 C9 U; ?5 ?# T! q
   在消息位,Modbus協議仍提供了主—從原則,盡管網絡通信方法是“對等”。如果一控制器發送一消息,它只是作為主設備,并期望從從設備得到回應。同樣,當控制器接收到一消息,它將建立一從設備回應格式并返回給發送的控制器。% x- U& N9 v* C& X* u
(1.3)查詢—回應周期
1 p% p; _. f, B: a. S
3 o* H( O; c0 \  ]8 p. e- B! E4 l3 Z% S  P* x! m
& G" X& ~' a) G- b
圖1
0 n# L2 r4 u. R- A2 h7 ~3 F- E
' j' l: n% X) g6 n7 x# C7 n(1.3.1)查詢, H8 \" V5 L- `6 P7 x% d
查詢消息中的功能代碼告之被選中的從設備要執行何種功能。數據段包含了從設備要執行功能的任何附加信息。例如功能代碼03是要求從設備讀保持寄存器并返回它們的內容。數據段必須包含要告之從設備的信息:從何寄存器開始讀及要讀的寄存器數量。錯誤檢測域為從設備提供了一種驗證消息內容是否正確的方法。
. \( M/ Z9 Z$ f) }# ]# K(1.3.2)回應4 ~/ x1 [. D7 B
如果從設備產生一正常的回應,在回應消息中的功能代碼是在查詢消息中的功能代碼的回應。數據段包括了從設備收集的數據:像寄存器值或狀態。如果有錯誤發生,功能代碼將被修改以用于指出回應消息是錯誤的,同時數據段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設備確認消息內容是否可用。
4 Z$ w8 i1 H. a二、兩種傳輸方式$ Y/ O; \( n& F/ p! y5 k0 `) Y  e
控制器能設置為兩種傳輸模式(ASCII或RTU)中的任何一種在標準的Modbus網絡通信。用戶選擇想要的模式,包括串口通信參數(波特率、校驗方式等),在配置每個控制器的時候,在一個Modbus網絡上的所有設備都必須選擇相同的傳輸模式和串口參數。
" z, _! ^( O( z: }ASCII模式
8 }1 |% U# F  O& W7 b7 k8 f. U4 T
# }% z/ K. [8 B% `' v( R9 K, w. Q5 z' }! e" Z! K* O

) u; J. @; V( l圖2
" e6 S- Y+ j. U$ ~9 `% W8 @* s# N
! @4 D% C) N/ O8 I1 RRTU模式) d1 X, F: j( h7 `1 s

% _* D5 L  X( B; M' {. C
3 X! j1 T+ [& s5 l: ]5 X8 H1 b

4 Z2 o3 ?5 L  L5 j1 l圖38 X( h) s5 J6 m7 T6 Z; S7 u+ V
  D0 z+ p3 P! W6 r
所選的ASCII或RTU方式僅適用于標準的Modbus網絡,它定義了在這些網絡上連續傳輸的消息段的每一位,以及決定怎樣將信息打包成消息域和如何解碼。在其它網絡上(像MAP和Modbus Plus)Modbus消息被轉成與串行傳輸無關的幀。
; m. W3 u# P- j* m- y. z* D+ [4 R(2.1)ASCII模式  A  e3 t2 ?# n, @2 H
當控制器設為在Modbus網絡上以ASCII(美國標準信息交換代碼)模式通信,在消息中的每個8Bit字節都作為兩個ASCII字符發送。這種方式的主要優點是字符發送的時間間隔可達到1秒而不產生錯誤。' r9 M1 \% R) P5 v( R
a.代碼系統- H1 O  v: A5 ~3 s
十六進制,ASCII字符0...9,A...F
& S8 {4 x5 y- ~9 q& ?; @% A& D  s2 X消息中的每個ASCII字符都是一個十六進制字符組成
/ u5 \) F7 s6 J7 j& M. H4 `b.每個字節的位
. t( b3 a" E- B: l5 K1 J1個起始位
, k) ~& _* e% O7個數據位,最小的有效位先發送
. X: J% Z0 H; M1個奇偶校驗位,無校驗則無
; N! q/ d8 {$ m% C. |5 [1個停止位(有校驗時),2個Bit(無校驗時)
5 r  v5 Q3 l4 n' N2 \* _1 f( `c.錯誤檢測域% J3 K7 s/ X7 h# {

0 U! N, [) O! k" A( D# RLRC(縱向冗長檢測)% C! l1 h: l! T
(2.2)RTU模式7 V. m: D# H) {
當控制器設為在Modbus網絡上以RTU(遠程終端單元)模式通信,在消息中的每個8Bit字節包含兩個4Bit的十六進制字符。這種方式的主要優點是:在同樣的波特率下,可比ASCII方式傳送更多的數據。6 n  C6 L/ D$ K1 I
a.代碼系統
6 g% n& V- t6 B% H3 G" Q4 ], |( g8位二進制,十六進制數0...9,A...F
/ `2 G+ p# i# A" }  @9 T消息中的每個8位域都是一個兩個十六進制字符組成
# ]  l" g, [, qb.每個字節的位+ U1 d' H; W1 Y$ `5 w2 _6 U
1個起始位
5 P$ @1 T0 a2 w- m+ ^3 e* b* H8個數據位,最小的有效位先發送" L) t) |! k9 [# i& Q. {
1個奇偶校驗位,無校驗則無
$ i7 g) F& T4 A, p6 @; _# F1個停止位(有校驗時),2個Bit(無校驗時)
  ~& V$ o, T* }- K+ n" }1 jc.錯誤檢測域
6 f) Q1 n1 |) NCRC(循環冗長檢測)$ ?$ A1 S) w, F( p( N$ R
三、Modbus消息幀
, ^0 e8 c( F- w; [- C+ A兩種傳輸模式中(ASCII或RTU),傳輸設備以將Modbus消息轉為有起點和終點的幀,這就允許接收的設備在消息起始處開始工作,讀地址分配信息,判斷哪一個設備被選中(廣播方式則傳給所有設備),判知何時信息已完成。部分的消息也能偵測到并且錯誤能設置為返回結果。  f1 h; E2 |4 u$ L. a, ?
(3.1)ASCII幀6 ?3 w1 h/ R: j# ?( i0 L1 \, t5 T
使用ASCII模式,消息以冒號(:)字符(ASCII碼 3AH)開始,以回車換行符結束(ASCII碼 0DH,0AH)。
- D" ]0 G4 T; E" L) r9 Z! l0 k0 J  其它域可以使用的傳輸字符是十六進制的0...9,A...F。網絡上的設備不斷偵測“:”字符,當有一個冒號接收到時,每個設備都解碼下個域(地址域)來判斷是否發給自己的。
7 u; W0 g7 O$ u7 ~3 r 消息中字符間發送的時間間隔最長不能超過1秒,否則接收的設備將認為傳輸錯誤。一個典型消息幀如下所示:4 J/ e* t; p/ }, m6 f  G
; }8 @( J% P2 r7 L, s, Z' k

( E. T3 c: Q6 B
# ^5 U, K% _) u0 `
圖4
. @# d9 M7 S* v% U, ~7 L8 m# \0 \* H$ B2 K) \8 J0 ^
(3.2)RTU幀5 ^7 |3 K! s7 I% H
使用RTU模式,消息發送至少要以3.5個字符時間的停頓間隔開始。在網絡波特率下多樣的字符時間,這是最容易實現的(如下圖的T1-T2-T3-T4所示)。傳輸的第一個域是設備地址?梢允褂玫膫鬏斪址鞘M制的0...9,A...F。網絡設備不斷偵測網絡總線,包括停頓間隔時間內。當第一個域(地址域)接收到,每個設備都進行解碼以判斷是否發往自己的。在最后一個傳輸字符之后,一個至少3.5個字符時間的停頓標定了消息的結束。一個新的消息可在此停頓后開始。
/ L% R: ^- [2 o- F& L) x  ^5 H整個消息幀必須作為一連續的流轉輸。如果在幀完成之前有超過1.5個字符時間的停頓時間,接收設備將刷新不完整的消息并假定下一字節是一個新消息的地址域。同樣地,如果一個新消息在小于3.5個字符時間內接著前個消息開始,接收的設備將認為它是前一消息的延續。這將導致一個錯誤,因為在最后的CRC域的值不可能是正確的。一典型的消息幀如下所示:
7 r" s% k, Q, _$ H5 Y# x3 t& }* t% ]; m( z. i
1 U, Z: Z$ ~( H8 g4 T( T5 d& P
$ Q( U" S) G) ^  D+ B  W5 d
圖56 C( Z. X  j/ v! j9 |# c

( {( A: {4 l. j/ s1 r8 t! {(3.3)地址域  K' f& V! x3 n' }/ L5 l/ `9 Z
消息幀的地址域包含兩個字符(ASCII)或8Bit(RTU)?赡艿膹脑O備地址是0...247 (十進制)。單個設備的地址范圍是1...247。主設備通過將要聯絡的從設備的地址放入消息中的地址域來選通從設備。當從設備發送回應消息時,它把自己的地址放入回應的地址域中,以便主設備知道是哪一個設備作出回應。
7 w5 a% p0 T6 s/ l5 w+ H: k    地址0是用作廣播地址,以使所有的從設備都能認識。當Modbus協議用于更高水準的網絡,廣播可能不允許或以其它方式代替。
! m9 K( \0 P0 {/ ?" q(3.4)如何處理功能域* x% z% G2 {+ {! D$ Y$ T
    消息幀中的功能代碼域包含了兩個字符(ASCII)或8Bits(RTU)?赡艿拇a范圍是十進制的1...255。當然,有些代碼是適用于所有控制器,有此是應用于某種控制器,還有些保留以備后用。
( C, Y3 |3 P+ T1 K; K# f    當消息從主設備發往從設備時,功能代碼域將告之從設備需要執行哪些行為。例如去讀取輸入的開關狀態,讀一組寄存器的數據內容,讀從設備的診斷狀態,允許調入、記錄、校驗在從設備中的程序等。
3 J) W( j% g4 p: d2 E% R* B+ F    當從設備回應時,它使用功能代碼域來指示是正;貞(無誤)還是有某種錯誤發生(稱作異議回應)。對正;貞,從設備僅回應相應的功能代碼。對異議回應,從設備返回一等同于正常代碼的代碼,但最重要的位置為邏輯1。
' u' L1 |) ~: v& j5 p) m    例如:一從主設備發往從設備的消息要求讀一組保持寄存器,將產生如下功能代碼:0 0 0 0 0 0 1 1 (十六進制03H). \/ l: K1 n& a# F+ M
    對正;貞,從設備僅回應同樣的功能代碼。對異議回應,它返回:1 0 0 0 0 0 1 1 (十六進制83H)0 |2 x  J2 C1 G9 Q
    除功能代碼因異議錯誤作了修改外,從設備將一獨特的代碼放到回應消息的數據域中,這能告訴主設備發生了什么錯誤。3 k' N# w4 h* N& Q) A9 S
    主設備應用程序得到異議的回應后,典型的處理過程是重發消息,或者診斷發給從設備的消息并報告給操作員。" Z* R+ a9 M2 ^5 m1 o) Z# l
6 Y! O4 P; F8 z
(3.5)數據域% d* T2 G" V( ^0 Z7 _1 `
     數據域是由兩個十六進制數集合構成的,范圍00...FF。根據網絡傳輸模式,這可以是由一對ASCII字符組成或由一RTU字符組成。
9 b$ X0 G, L; `% l; ^! _     從主設備發給從設備消息的數據域包含附加的信息:從設備必須用于進行執行由功能代碼所定義的所為。這包括了象不連續的寄存器地址,要處理項的數目,域中實際數據字節數。
: x7 v& ]% D8 |5 S5 L     例如,如果主設備需要從設備讀取一組保持寄存器(功能代碼03),數據域指定了起始寄存器以及要讀的寄存器數量。如果主設備寫一組從設備的寄存器(功能代碼10十六進制),數據域則指明了要寫的起始寄存器以及要寫的寄存器數量,數據域的數據字節數,要寫入寄存器的數據。
$ l6 G* p5 d" z$ `% m0 d" a: H     如果沒有錯誤發生,從從設備返回的數據域包含請求的數據。如果有錯誤發生,此域包含一異議代碼,主設備應用程序可以用來判斷采取下一步行動。
% T5 Y5 `0 i4 L* O, `: {9 f) a     在某種消息中數據域可以是不存在的(0長度)。例如,主設備要求從設備回應通信事件記錄(功能代碼0B十六進制),從設備不需任何附加的信息。
1 j4 W! p4 p& S8 E0 T$ N0 q' U% U/ g: O: j& }. V( P& K
(3.6)錯誤檢測域
: j: r$ a* D- D$ I    標準的Modbus網絡有兩種錯誤檢測方法。錯誤檢測域的內容視所選的檢測方法而定。
$ U0 S, j7 W& v- W7 G& RASCII
$ U% B4 {: i! V    當選用ASCII模式作字符幀,錯誤檢測域包含兩個ASCII字符。這是使用LRC(縱向冗長檢測)方法對消息內容計算得出的,不包括開始的冒號符及回車換行符。LRC字符附加在回車換行符前面。" K) i) ^$ d" c9 x
RTU
! Y- Q& D+ W  v    當選用RTU模式作字符幀,錯誤檢測域包含一16Bits值(用兩個8位的字符來實現)。錯誤檢測域的內容是通過對消息內容進行循環冗長檢測方法得出的。CRC域附加在消息的最后,添加時先是低字節然后是高字節。故CRC的高位字節是發送消息的最后一個字節。: ~  D& @$ X# G
(3.7)字符的連續傳輸9 z4 ~& o- m5 L% S
當消息在標準的Modbus系列網絡傳輸時,每個字符或字節以如下方式發送(從左到右):
& o& [, F+ R9 z' g# A5 a3 u最低有效位...最高有效位: d2 N7 G8 [" C( [) W$ N% M1 W
使用ASCII字符幀時,位的序列是:0 N5 d! X5 @3 F2 r+ D- m4 o
有奇偶校驗
  _' D4 {7 W% c) L2 r2 D$ I
/ R0 c5 {& z3 Y
- Y  z0 D. T1 j: M1 \, b; O4 t% g9 m

( W" U& B2 D1 D% P4 o! k3 M圖6- s, s: y0 p* d* t
, C8 x. Q. q7 S8 \6 }8 s) q3 q0 x
無奇偶校驗
- U1 \8 K7 X$ [6 ]1 e& Y& q" i
* R1 Y+ n5 o% |1 `& t: h! o% s# L' x1 L$ m+ x* z
! K9 c7 w& M- ?% @: J, D8 c
圖7
9 @# X. ^" D7 @9 j4 a
5 {6 [% w/ ^4 M' e! N! t 使用RTU字符幀時,位的序列是:
6 K, ?6 v0 p1 p有奇偶校驗  @  H' k# ]1 g

9 Z2 F. u: s" a0 E8 w- M5 r  L# A

$ R  o7 b% l! g圖8
0 u0 u' Z2 J: `# S9 [# j7 T
( o: X: k" S+ h1 S" G5 {無奇偶校驗  V  d8 @% `9 d: r4 D2 }6 f

- f( D9 O+ X/ o+ D" {& ]3 E+ J% _
+ A' W' j$ T# N8 {2 E
圖9
' y. |" s+ q$ Z8 N% B# p
8 D6 m( E  u* V+ M( B4 D四、錯誤檢測方法" Z  a5 ~& L! {" a9 E% j
標準的Modbus串行網絡采用兩種錯誤檢測方法。奇偶校驗對每個字符都可用,幀檢測(LRC或CRC)應用于整個消息。它們都是在消息發送前由主設備產生的,從設備在接收過程中檢測每個字符和整個消息幀。3 N* v4 ]/ k% C
用戶要給主設備配置一預先定義的超時時間間隔,這個時間間隔要足夠長,以使任何從設備都能作為正常反應。如果從設備測到一傳輸錯誤,消息將不會接收,也不會向主設備作出回應。這樣超時事件將觸發主設備來處理錯誤。發往不存在的從設備的地址也會產生超時。- N9 r5 ]; q( }+ A+ m$ C2 i7 c
(4.1)奇偶校驗
- H& t* ^, {; x! L  U' \ 用戶可以配置控制器是奇或偶校驗,或無校驗。這將決定了每個字符中的奇偶校驗位是如何設置的。
$ V7 V3 A5 E5 J. N% r  W 如果指定了奇或偶校驗,“1”的位數將算到每個字符的位數中(ASCII模式7個數據位,RTU中8個數據位)。例如RTU字符幀中包含以下8個數據位:1 1 0 0 0 1 0 16 _) {' Y' O  P( {
整個“1”的數目是4個。如果便用了偶校驗,幀的奇偶校驗位將是0,便得整個“1”的個數仍是4個。如果便用了奇校驗,幀的奇偶校驗位將是1,便得整個“1”的個數是5個。% o! Y9 D% t  o/ g7 E6 S
如果沒有指定奇偶校驗位,傳輸時就沒有校驗位,也不進行校驗檢測。代替一附加的停止位填充至要傳輸的字符幀中。/ U+ j9 d2 ?6 U4 f+ I4 M& R
(4.2)LRC檢測 % f8 ^3 i5 v5 T! m& w
使用ASCII模式,消息包括了一基于LRC方法的錯誤檢測域。LRC域檢測了消息域中除開始的冒號及結束的回車換行號外的內容。# ^* J/ K' N9 g, X+ j% t7 R; y
LRC域是一個包含一個8位二進制值的字節。LRC值由傳輸設備來計算并放到消息幀中,接收設備在接收消息的過程中計算LRC,并將它和接收到消息中LRC域中的值比較,如果兩值不等,說明有錯誤。
5 T3 v8 E6 X# i  Q6 p, FLRC方法是將消息中的8Bit的字節連續累加,丟棄了進位。
( b/ M; e0 E$ O! U, ](4.3)CRC檢測
  U3 v! t' N& O& ~9 C8 \2 b2 d$ z 使用RTU模式,消息包括了一基于CRC方法的錯誤檢測域。CRC域檢測了整個消息的內容。$ b* Z/ S" l+ |& M0 t+ U3 g
CRC域是兩個字節,包含一16位的二進制值。它由傳輸設備計算后加入到消息中。接收設備重新計算收到消息的CRC,并與接收到的CRC域中的值比較,如果兩值不同,則有誤。
# [7 Q$ Z  S3 G3 V* L CRC是先調入一值是全“1”的16位寄存器,然后調用一過程將消息中連續的8位字節各當前寄存器中的值進行處理。僅每個字符中的8Bit數據對CRC有效,起始位和停止位以及奇偶校驗位均無效。- q( Z9 O6 _2 T1 E
CRC產生過程中,每個8位字符都單獨和寄存器內容相或(OR),結果向最低有效位方向移動,最高有效位以0填充。LSB被提取出來檢測,如果LSB為1,寄存器單獨和預置的值或一下,如果LSB為0,則不進行。整個過程要重復8次。在最后一位(第8位)完成后,下一個8位字節又單獨和寄存器的當前值相或。最終寄存器中的值,是消息中所有的字節都執行之后的CRC值。
- E7 h* v& E+ A; v# V CRC添加到消息中時,低字節先加入,然后高字節。* o  L5 S, `3 M8 P7 P- P) u  P  E
6 g. B/ }+ E$ P/ P3 O. n" a
五、MODBUS RTU 通訊協議及編程6 [4 c  ~4 ?, ~
 ModBus通訊協議分為RTU協議和ASCII協議,目前多種儀表都采用ModBus RTU通訊協議,如:CH2000智能電力監測儀、CH2000M電力參數采集模塊、巡檢表、數顯表、光柱數顯表等。下面就ModBus RTU協議簡要介紹如下:
, v5 J' a# Q- ^3 m2 I* d5 g$ J# [% U(5.1)通訊協議- c; s: l  L& v4 t; T! P" ]
(5.1.1)通訊傳送方式# L  i5 ?, w. o* i) `7 T5 i# W
通訊傳送分為***的信息頭,和發送的編碼數據。以下的通訊傳送方式定義也與MODBUS RTU通訊規約相兼容:
" v& d/ v! O( y/ k
3 d: Z/ k4 E0 S5 ^
. L4 y& y; }7 a: B% s2 q

2 f1 ~/ G4 i; D5 E1 r- Z  |圖10
. V9 ~7 m# E  t' S4 e* x) |1 a. u  G2 H* q3 F; a2 z5 @, C
初始結構 = ≥4字節的時間 / p0 j/ n0 U# z
地址碼 = 1 字節
* U9 ~) w6 H' H2 u) l2 @功能碼 = 1 字節& j. L: a  o0 w( I1 l& ?. D4 v
數據區 = N 字節& ~7 r, e1 ^# o9 f1 r/ F
錯誤校檢 = 16位CRC碼
1 c7 N, l# I! K5 S! \0 Y' d結束結構 = ≥4字節的時間
7 f% m3 }9 Q. T1 o$ A地址碼:地址碼為通訊傳送的第一個字節。這個字節表明由用戶設定地址碼的從機將接收由主機發送來的信息。并且每個從機都有具有唯一的地址碼,并且響應回送均以各自的地址碼開始。主機發送的地址碼表明將發送到的從機地址,而從機發送的地址碼表明回送的從機地址。6 g3 I4 a% o& \3 p9 y0 R
功能碼:通訊傳送的第二個字節。ModBus通訊規約定義功能號為1到127。本儀表只利用其中的一部分功能碼。作為主機請求發送,通過功能碼告訴從機執行什么動作。作為從機響應,從機發送的功能碼與從主機發送來的功能碼一樣,并表明從機已響應主機進行操作。如果從機發送的功能碼的最高位為1(比如功能碼大與此同時127),則表明從機沒有響應操作或發送出錯。
: `% C; m* P6 q; o0 X+ g' d. _  }數據區:數據區是根據不同的功能碼而不同。數據區可以是實際數值、設置點、主機發送給從機或從機發送給主機的地址。1 ^7 U  }6 c# Q9 V
CRC碼:二字節的錯誤檢測碼。1 s3 e- _, `" t/ b
(5.1.2)通訊規約% P+ {. |" [9 E( ?+ c# q+ K
當通訊命令發送至儀器時,符合相應地址碼的設備接通訊命令,并除去地址碼,讀取信息,如果沒有出錯,則執行相應的任務;然后把執行結果返送給發送者。返送的信息中包括地址碼、執行動作的功能碼、執行動作后結果的數據以及錯誤校驗碼。如果出錯就不發送任何信息。, O% f" I$ Y# c7 }) k9 f  t, w
信息幀結構# @) e0 V) v5 s: |: r' _$ m# K

; E4 S8 \1 N0 M" J8 H
9 X5 _' G. z% A; i( s* i
9 s7 `8 x2 ~/ L3 ^* U. n" a
圖11/ v1 U1 ]; I1 y& Y1 c# @

" S- Z2 s0 I1 L4 `" [
/ ^( ^6 \% z$ z0 Q% L# X3 o7 _1 v% Q# ]7 c
- I$ v% e% |6 L$ o4 f3 `- X
圖12- }1 ]) x9 S' j& R8 A; c
+ P1 X1 N: @8 u) o" O* t2 t; g
地址碼:地址碼是信息幀的第一字節(8位),從0到255。這個字節表明由用戶設置地址的從機將接收由主機發送來的信息。每個從機都必須有唯一的地址碼,并且只有符合地址碼的從機才能響應回送。當從機回送信息時,相當的地址碼表明該信息來自于何處。
. B7 K( Q( _- {* Y4 | 功能碼:主機發送的功能碼告訴從機執行什么任務。表1-1列出的功能碼都有具體的含義及操作。
1 ]# G; {  I# _  L, O; _, c, B數據區:數據區包含需要從機執行什么動作或由從機采集的返送信息。這些信息可以是數值、參考地址等等。例如,功能碼告訴從機讀取寄存器的值,則數據區必需包含要讀取寄存器的起始地址及讀取長度。對于不同的從機,地址和數據信息都不相同。
) g" k: t4 D; |6 X/ t錯誤校驗碼:主機或從機可用校驗碼進行判別接收信息是否出錯。有時,由于電子噪聲或其它一些干擾,信息在傳輸過程中會發生細微的變化,錯誤校驗碼保證了主機或從機對在傳送過程中出錯的信息不起作用。這樣增加了系統的安全和效率。錯誤校驗采用CRC-16校驗方法。
4 N6 Z$ O9 Q, \5 I  Y0 k$ d注:信息幀的格式都基本相同:地址碼、功能碼、數據區和錯誤校驗碼。& x1 A; y6 Y+ e" a% D2 l8 f
錯誤校驗
6 v+ c4 v* m/ h! N% c冗余循環碼(CRC)包含2個字節,即16位二進制。CRC碼由發送設備計算,放置于發送信息的尾部。接收信息的設備再重新計算接收到信息的 CRC碼,比較計算得到的CRC碼是否與接收到的相符,如果兩者不相符,則表明出錯。
9 h% E6 [/ l- j+ D8 GCRC碼的計算方法是,先預置16位寄存器全為1。再逐步把每8位數據信息進行處理。在進行CRC碼計算時只用8位數據位,起始位及停止位,如有奇偶校驗位的話也包括奇偶校驗位,都不參與CRC碼計算。
+ J$ b" L4 z9 ]1 n3 F* q在計算CRC碼時,8位數據與寄存器的數據相異或,得到的結果向低位移一字節,用0填補最高位。再檢查最低位,如果最低位為1,把寄存器的內容與預置數相異或,如果最低位為0,不進行異或運算。
7 C3 A9 N9 x9 w4 M這個過程一直重復8次。第8次移位后,下一個8位再與現在寄存器的內容相相異或,這個過程與以上一樣重復8次。當所有的數據信息處理完后,最后寄存器的內容即為CRC碼值。CRC碼中的數據發送、接收時低字節在前。2 Y- t. I/ l. N* d
計算CRC碼的步驟為:
) P8 P( A2 u! l0 g; t0 F2 B1.預置16位寄存器為十六進制FFFF(即全為1)。稱此寄存器為CRC寄存器;
* ]/ _( {8 B' X7 E, g3 D$ E2.把第一個8位數據與16位CRC寄存器的低位相異或,把結果放于CRC寄存器;( N" y. w! _: ?# Y( |" z7 H) L
3.把寄存器的內容右移一位(朝低位),用0填補最高位,檢查最低位;
8 c/ f/ u5 b- m, ~2 ?; {1 P' a7 u( t4.如果最低位為0:重復第3步(再次移位); 如果最低位為1:CRC寄存器與多項式A001(1010 0000 0000 0001)進行異或;* u3 D& u  t( i: ^) q. a' i. A
5.重復步驟3和4,直到右移8次,這樣整個8位數據全部進行了處理;
. V5 O2 P" q( m8 b4 M& E! y+ U% x4 i1 K6.重復步驟2到步驟5,進行下一個8位數據的處理;/ r5 U; m1 |; Q  {
7.最后得到的CRC寄存器即為CRC碼。% k0 b0 Z7 A  Q, Q7 m; y; ?
功能碼03,讀取點和返回值+ o* {: m) M& E
儀表采用Modbus RTU通訊規約,利用通訊命令,可以進行讀取點(“保持寄存器”) 或返回值(“輸入寄存器” )的操作。保持和輸入寄存器都是16位(2字節)值,并且高位在前。這樣用于儀表的讀取點和返回值都是2字節。一次最多可讀取寄存器數是60。由于一些可編程控制器不用功能碼03,所以功能碼03被用作讀取點和返回值。從機響應的命令格式是從機地址、功能碼、數據區及CRC碼。數據區中的寄存器數據都是每兩個字節高字節在前。
0 Q: ?& D. a3 s功能碼06,單點保存  t7 `% h* [' G
主機利用這條命令把單點數據保存到儀表的存儲器。從機也用這個功能碼向主機返送信息。- [" j8 n) ]0 k+ h7 w0 M
六、ModbusTCP
) `( p% y/ k8 Y4 s  P5 _IANA(Internet Assigned Numbers Authority,互聯網編號分配管理機構)給Modbus協議賦予TCP端口號為502,這是目前在儀表與自動化行業中唯一分配到的端口號。5 A1 u4 F/ l! R9 j# u$ p
(6.1)ModbusTCP數據幀
6 W7 ]( d$ E; C6 w在TCP/IP以太網上傳輸,支持Ethernet II和802.3兩種幀格式。如圖所示,Modbus TCP數據幀包含報文頭、功能代碼和數據3部分
7 F. \) n* G' ]  v0 g4 I# w6 q# E. p

0 k7 E2 R6 ^6 ]0 b
& f5 v0 ~: |  X# j0 v
圖13: x$ S( c$ r. t4 q% k& v5 a

3 m7 v4 q3 U9 z( b) z2 X& C3 wMBAP報文頭(MBAP:Modbus Application Protocol、Modbus應用協議)分4個域,共7個字節,如圖:
) g* r5 k' R# a$ S+ }2 e; d9 w- ]) l; |; J+ i+ s: M: G

5 S9 {1 d7 M2 Z: m: I
' z1 z2 ^5 g- o/ C; ]  Y% y4 t0 r
圖14- L: ]; f, X/ `+ w" Q
( Z# W* V$ W7 L3 }7 ~! {. M" ~
事務處理標識/傳輸標志:modbus 請求/響應事務處理識別碼,一般每次通信之后就要加1以區別不同的通信數據報文。
4 q$ |& O9 N. @6 r' G協議標識符:00 00 表示ModbusTCP協議。! t) a4 M- p/ U0 T. }
長度:表示接下來的數據長度,單位為字節。
- ~/ ^; z3 f. W; r3 c+ t) D2 H單元標識符:設備地址,串行鏈路或其它總線上連接的遠程從站的識別碼。
" L! q  O+ Y2 X/ \/ z0 p9 Z: J(6.2)ModbusTCP通信過程
  i9 Y; K& Z6 I) s$ O8 C! N' X1.connect 建立TCP連接9 y* ^2 _9 J5 ?9 e' [( s* ^8 b
2.準備modbus報文, A2 I0 t2 p+ {
3.使用send命令發送報文* \6 N3 f8 @" l- q& B
4.在同一連接下等待應答
, m) \) K9 A# Y6 ?, a5.使用recv命令讀取報文,完成一次數據交換* o7 u* i! S6 D( _5 `, V
6.通信任務結束時,關閉TCP連接  E) S) S2 c9 I
(6.3)使用ModbusTCP原因
7 T: |+ \: Y; [$ O$ b2 {TCP/IP已成為信息行業的事實標準:世界上93%的網絡都使用TCP/IP,只要在應用層使用Modbus TCP,就可實現工業以太網數據交換;易于與各種系統互連:可用于管理網、實時監控網及現場設備通信;網絡實施價格低廉:可全部使用通用網絡部件;( t5 x# m; g, S6 M# @
用戶強烈要求:目前中國已把Modbus TCP作為工業網絡標準之一,用戶可免費獲得協議及樣板程序,可在Unix、Linux、Windows下運行,不需要專門驅動程序。在國外,Modbus TCP被國際半導體業SEMI定為網絡標準,國際水處理、電力系統也把它作為應用的事實標準,還有越來越多行業作為標準來用。. v' o3 ^9 {3 }4 R8 Y* U
高速的數據:用戶最關心的是所使用網絡的傳輸能力,100M以太網的傳輸結果為:每秒4000個Modbus TCP報文,而每個報文可傳輸125個字(16bit),故相當于4000×125=500000個模擬量數據(8000000開關量!);
: N0 k+ ]. i' n: h. M; o7 z廠家能提供完整解決方案:工業以太網的接線元件,包括工業集成器、工業交換機、工業收發器、工業連接電纜。工業以太網服務器,包括遠程、分布式I/O掃描功能,設備地址IP的設置功能,故障設備在線更換。功能,分組的信息發布與訂閱功能,網絡動態監視功能,還有支持瘦客戶機的Web服務。其他工控設備的支持:如工業用人機界面、變頻器、軟起動器、電動機控制中心、以太網I/O、各種現場總線的網橋、甚至帶TCP/IPModbus的傳感器,都為用戶使用提供了方便。2 G' ~2 W; E, m( B2 ?9 Z

. Q( A, c  `% n/ L' @9 `2 j$ y6 L4 C6 Y

) n# C% [! L9 [作者:輝仔_jian4 l" e7 w+ d" ^3 ?* I8 C9 s) V
鏈接:https://www.jianshu.com/p/a488a7b9796c2 C6 X) U# o3 g. ?$ S) L
來源:簡書
* z; U! H) e. X9 p著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
1 d1 ~! T0 W5 ~$ z
IDAQ-USB-6009數據采集卡
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

QQ|小黑屋|無圖瀏覽|手機版|網站地圖|虛擬儀器家園 ( 滬ICP備13044638號-3 )

GMT+8, 2020-7-14 12:37 , Processed in 0.031889 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表
腾讯分分彩历史走势图