modbus?關於modbus RTU的使用說明II

1、關於

近期陸續有些朋友在問關於Modbus使用上的一些問題,我才發現先前的那篇說明可能沒那麼容易理解,也因先前的那篇說明比較是針對Function code 0x03, 0x06, 0x10的說明,並未對Modbus RTU的一些定義加以撰述,故我想用我的理解再重新解釋一次Modbus RTU的入門概念,希望可以幫助第一次接觸Modbus的人可以更容易明白。

2、Modbus RTU的常見問題

很多人第一次遇到Modbus的時候會弄不清楚一些基本的概念,我整理了幾個問題大致如下:

Q1:Modbus設備的Client/Server或Slave/Master關係

Modbus最早應用於PLC,目前大多建立在RS485的通訊上,由RS485的通訊架構來看,是所有設備共享一個通訊BUS,故會有碰撞的情形產生,也就是有可能會發設備間互搶通道的概念,當發生這種情況的時候,就會產生通訊異常的情況。
故一般再使用RS485通訊的時候,通常僅會有一個Master設備,可能是伺服器、可能是PC、可能是某個資料蒐集器,換言之,所有Modbus設備就是slave端設備。
但是如果使用Client與Server的角度來看,Modbus端設備就好像Server一樣處於被動的狀態,當Client要求資料的時候Server端才回覆訊息。
modbus-1

 

所以所有的Modbus Command格式上第一個byte均為Slave Address,也就是說在這個通訊BUS上,僅能有唯一的一個站號存在。否則就會發生,類似班上有兩個人都叫王小明,老師在台上喊王小明,則會變成兩個人都會回應,而就搞不清楚是誰回應的情況。

Q2:眾多設備都說支援Modbus所以Modbus到底怎麼定義?

Modbus之所有能夠支援任何設備其原因在於他只有定義了一種暫存器的概念,而卻沒有強硬的規定這些暫存器的內容為何,所以當要控制某一個Modbus設備的時候,就必須要先取得該設備的Modbus暫存器Table,且在Table文件中應會有標示該暫存器之屬性,如是否可讀取/寫入,讀取的資料格式定義,功能作用等說明。

網路上我找了一些Modbus Table如下:

(Honeywell Modbus RTU)

modbus-2

 

(TOKO統固PM96 RS485通訊參數位址表)

modbus-3

 

( TJ-U62 Dual Channels Isolated Signal Converter)

modbus-4

 

由上面幾個範例看來,大家都不約而同的會有幾個共通的標示

a.暫存器位址

b.可操作的功能例如R/W,或者03H這類的標示

c.資料長度

d.資料功能定義

e.資料格式

有這些資訊的定義,才能夠成為一個完整的Modbus通訊Table,當然其中可能有一些些許的差異,這些應該都能夠從各設備的說明文件中取得相關可用的資訊。

Q3:Modbus的程式如何撰寫?

如果以Master/Slave的角度來討論怎麼寫的時候則:

Master通常可能是應用程式,如APP、資料蒐集器、操作畫面(HMI)等,所以所需要撰寫的就是如何與後端Modbus設備通訊的程式。也就是Requeset的程式。

Slave通常處於被動,所以平常狀態為監聽,直到發現Master發送了屬於自己Slave Address的命令時,才接收該命令並檢查是否符合正確格式,在依照其Modbus定義回覆Master端設備。

不管要撰寫Request或Response的程式都是需要先瞭解其命令格式,才能依照規定的格式發送或接收解碼。

Q4:Modbus可以應用於哪些平台?

Modbus其實可以應用於任何平台,並不設限,可以從8051到ARM到PC到任何軟體,iOS、Andriod、windows等,只要是可以進行通訊,不論RS485,TCP/IP,wifi,藍芽,RS232,只要是能夠進行通訊且能夠滿足Master/Slave的架構,就可以使用Modbus的定義進行通訊。

所以,再一次強調,Modbus只是提供了一種格式的定義,並未限制其運作平台,只要定義好Table就可以使用。

Q5:Modbus是否具有硬體模組?

我的理解上應該是沒有那種Modbus的硬體模組,因為每個設備的Table不一樣,所以也就不會有產生通用模組的可能。

Q6:Modbus是否支援多點通訊?

由第一個問題來看,其實Modbus本身就是支援多點通訊,由1個byte的Slave Address來看扣除0x00定義為(Broadcast)用以外,所以共有255個節點可以供使用,但通常單一時間內僅能和bus上的一個slave做通訊,因為bus是共享的。

Q7:Address到底指的是什麼?

Address在Modbus RTU的命令格式當中,有兩個地方都有Address名稱的定義

其一是Slave address,第二是Register address,如果從command來看就如0x06 function的格式為

Slave Address(1byte) + 06 + register address(1word) + write data(1word) + CRC16

Slave Address指的就是該Modbus設備的站號,也就是他的名字。

Register Address指的就是要操作的暫存器位址。

Q8:站號(Slave Address)怎麼知道多少?

通常站號的設定需要問原modbus設備廠商,大多機器上面會有實際的硬體可以設定,亦或者設備的說明文件中會提到,通常0x00為廣播用Address(但也有例外),當使用廣播位址通訊時,通常modbus設備端只會有對應動作,而不會回應,其原因為共享BUS下如果大家同時要回應,就會變成互搶通道。

 Q9:Modbus設備有辦法主動回應嗎?

其實Modbus設備基本上就是一種被動的模式,所以他不會有主動回應的時候。這我再接觸Modbus的時候有很多系統商問過我這個問題,但是Modbus就我知道並沒有主動回應的function code,且Modbus應用多在於RS485的環境底下,如果當有N個設備發生異常主動回應時,通訊也有很大的機會發生碰撞問題,所以在有主動回應的前提下,也必須考慮使用的通訊架構是否能夠支援。

7 thoughts on “modbus?關於modbus RTU的使用說明II

  1. 踩一下^^
    那slave有辦法主動發data出去嗎?
    例如slave發生alarm(或emg stop)時該怎麼立即跟hmi or master溝通?
    謝謝

  2. 沒辦法喔!這個問題已經很多系統商問過了,因為Modbus他是被動式的架構,並無法直接主動通訊,但這個情況侷限於類似RS485這樣的架構,但如果是用TCP/IP的通訊方式,是可以克服這個問題,可是相對的成本也會增加,且系統架構也會整個不一樣。

  3. 那如果我不照標準modbus走,在master也加入站號(例如"1")並在code裡也接受處理
    因該也是可以達到我的需求(先不討論這麼做所產生的後果)
    只是會產生資料碰撞或其他問題
    這樣理解是否可行
    謝謝

  4. 當然可以阿!沒有人說不行,只要規劃好,就可以。
    只是因為某些產品可能會與別人搭配,所以就必須遵循modbus的遊戲規則,但是如果是自己的封閉系統,你全部不用modbus也沒關係囉!

  5. 請問一下,假設我自行開發一顆asic,有辦法把modbus rtu的速度提升到120M嗎?這麼快的速度會出現什麼問題嗎?謝謝!

  6. Dear 學習生,

    1.Modbus是一種格式,實際上傳輸的方式還是依據物理層來決定,只要實際物理層可以支援到這麼快的速率,我想應該是不會有什麼問題。

    2.但是Modbus的通訊都是一種應答的行為,所以在高速率(高反應)的需求中,需要注意!通常必須一問一回的進行。

    小弟淺見!

發表迴響