帶你認識物聯網 Modbus 通訊協議(一)

2023/08/04閱讀時間約 8 分鐘
The Modbus Protocol

The Modbus Protocol

在上一篇文章裡,我們在聊智慧工廠的四個迷思的時候,有聊到了SCADA 這個數據搜集與監看系統,現代的工廠也因為有了 SCADA 這套系統加持所以可以很快把底層數據跟上層的資訊系統勾串在一起,瞬間把各種遠端的生產設備、感測器等數據訊息搜集到電子看板上。那麼 SCADA 系統究竟是怎麼做到同時跟這麼多不同類型的裝置通訊的呢?此時就不得不提 Modbus 通訊協議。

Modbus 是一種定義在通訊應用層的協議,會根據資料跑在不同的實體介面上而有不同的「版本」,例如:應用在 RS232/RS485 串列埠介面的就是 Modbus RTU/ASCII,應用在 TCP/IP 的就是 Modbus TCP 也 SCADA 的主要應用協議。我們從 Modbus 發展的時序來看的話, RTU/ASCII 版本是早於 TCP 版本的,接下來我們就來聊聊跟 Modbus 通訊協議的幾個相關主題,盡量用平易近人的方式來介紹這套通訊協議給大家,暫定需要兩到三篇,第一篇會先談三個部分,包含:

  1. 機器通訊的原理,簡單說明機器通訊是如何運用實體線路通訊的具體方式
  2. 機器語言會用到的資料表示方法,包含二進位跟十六進位表示法
  3. 介紹主從式 Master-Slave 的通訊架構

機器的通訊原理

在無線網路還沒被發明出來前,電腦們都是透過網路卡加網路線來交換資料的。網路卡就是通訊介面,網路線就是通訊線。現在工廠裡大部分的機器設備也都有類似網路孔的通訊介面。而最簡單的通訊架構,例如 I2C 就只要兩條電線就能進行通訊了。在通訊介面上會定義 RX/TX 兩個端口,R 就是 Receive 接收的意思,T 就是 Transmission 傳送的意思,所以接線的時候要把發送端 TX 與接收端 RX 互相連接起來,兩台裝置就可以互相通訊了。 換句話說,假設有 AB 兩台裝置,就把 A 裝置的 RX 接到 B 裝置的 TX,同時把 A 裝置的 TX 接到 B 裝置的 RX。

RX / TX 要對接才會通,圖片參考出處

RX / TX 要對接才會通,圖片參考出處

設備裝置是透過電子訊號來溝通的,就像我們的聲音是透過空氣振動傳播聲音一樣,實體線路是用來傳輸電子訊號的媒介,機器裝置透過控制訊號線上的電壓變化來通訊,例如 RS232 就是利用產生 5V 或 0V 的訊號變化來通訊,我們可以在訊號線的發送跟接收兩端掛一台示波器來監看,當訊號在傳輸的時候,我們就會看到一個由 5V 跟 0V 交替出現隨時間變化的方波訊號。只要是利用實體線路通訊的裝置,基本上都是利用不同的電壓差來通訊,方法類似。關於硬體的底層通訊原理你只要記得,裝置靠的就是控制電壓差的方式來通訊就可以了。

方波訊號示意圖,圖片參考出處

方波訊號示意圖,圖片參考出處

認識簡單的計算機結構

自從馮紐曼定義了計算機的架構就是 0 與 1 後,從此就規定計算機的未來不管怎麼發展,內部狀態永遠只有 0 跟 1。所以如果想要在計算機裡面的儲存資訊的話,不管內容簡單或複雜,最後都必須被編碼變成 1 跟 0 的排列組合,機器才會看得懂。由於機器們的自然語言就只能用 0 跟 1 兩個字母來表達,所以只用 0,1 表達的方式就叫做「二進位」表示法。

當裝置 A 要需要跟裝置 B 通訊的時候,A 就會把訊息編碼成類似 010010011101 的樣子再傳給 B, B 的回應也必須是二進位表示。由於能控制電壓的訊號變化通訊線只有一條,單位時間內就只能有 A 或 B 可以發送訊息。訊息由多個 0,1 組成,每次就只能傳送一個 bit 0 或 1,傳輸動作開始後會持續到所有內容全部傳輸完畢為止。為了區分好每一個 bit 是 0 或 1,電壓訊號發出後會持續一小段時間,每個 bit 間也需要固定的時間間隔。我們假設訊號發出的持續時間 2ms 與 bit 時間間隔 1ms,那麼要傳遞 1101 這 4 個 bit 的訊號就會是: 5V(2ms), 0V(1ms), 5V(2ms), 0V(1ms), 0V(2ms), 0V(1ms), 5V(2ms), 0V(1ms)。用二進位方式通訊的 Modbus 就叫做 Modbus RTU,RTU 是 Remote Terminal Unit 就是遠端端終端裝置。

二進位 Binary 轉十六進位的 ASCII

二進位表示法對機器來說是最有效的溝通方式。當然,使用二進位表示法的缺點也很明顯,就是對人來說很不友善。當我們想要一次傳很多資訊的時候,使用二進位表示法結果就是資訊長度爆表,要用人眼判讀非常困難,溝通效率就會變得很差。於是就有了把四個二進位 bit 合起來看的十六進位的表示的做法。

十六進位跟十進位很像,當記數到 16 的時候,就會往左進 1 位。採用十六進位記數除了沿用十進位的 0-9,還要加上 A-F 六個英文字母用來替代 10-15 這幾個數字。舉個例子:一個十進位的數字 58 用二進位表示是 111010 需要用 6 個 bit (8 bits = 1 byte),如果我們前面先補上兩個 0 變成 00111010 再每 4 個一組分成兩組 0011, 1010 就可以用十六進位改寫為 3A,是不是就精簡好讀很多呢?十六進位能夠用少的符號來表示更多的資訊。而用十六進位方式通訊的 Modbus 就叫做 Modbus ASCII,ASCII 是 American Standard Code for Information Interchange 也就是美國標準資訊交換碼。

Master-Slave,主從式架構

通訊的目的都是為了裝置間的資料交換,我們可以預設在一個通訊迴路上至少有兩台以上的裝置。一條跑 Modbus RTU/ASCII 的 RS485 的迴路按規定可以接 32 台裝置,迴路上的每一個裝置都會設定好 ID 做為識別,RTU/ASCII 走的是 Master-Slave 的通訊架構,什麼是 Master-Slave 架構呢?再次以 RS485 為例,不管通訊迴路上接了多少台裝置,一定要把其中一台設定為 Master,其餘的裝置設定為 Slave。只有 Master 裝置會主動發訊息,其餘的 Slave 裝置都不會主動發話,只會默默的等 Master 裝置來訪問它。

一個 Master-Slave 架構,圖片參考出處

一個 Master-Slave 架構,圖片參考出處

Master 跟 Slave 的對話模式是採取 request and response 也就是一問一答的形式,當通訊開始的時候 Master 裝置準備好要給某個 Slave 裝置的訊息,然後把訊息丟入迴路上開始傳遞,等對應 ID 的 Slave 接收到 Master 發來的訊息後,確認資料沒有問題後就會開始進行資料封包解析。Slave 完成任務後,會隨後再按照 Master 的指令內打包資料回傳給 Master。同理,等 Master 收到訊息確認無誤後,就完整了這一次的通訊。

一般來說,Master 會反覆從第一個 Slave 問到最後一個 Slave 不斷循環的問答過程就叫做輪詢。Master 用輪詢的方式會有個明顯的缺點,輪詢的時間會隨著 Slave 裝置增加而增加,比如說,在 RS485 的 32 個裝置全部接滿的狀況下,就有 31 個 Slave 裝置,假設每次問答一個 Slave 來回需要 200ms 的話,要完成一次輪詢最快也要 6.2 秒。只有一種情況會稍微好一點,就是所有的 Slave 都是相同類型的裝置,此時有實作廣播指令的 Master 裝置就可以一次發話給所有 Slave,來稍微減少一下通訊時間。

要照顧多個 Slaves 的 Master,圖片參考出處

要照顧多個 Slaves 的 Master,圖片參考出處

結語

看到這裡你可能會想,咦!這裡講了一堆硬知識,有電訊號如何傳輸、有計算機體底層,如何進制轉換跟接線架構是有什麼特別用途嗎?別急,說這些硬知識都是為了鋪「梗」,為了幫助我們先在腦中產生具體的畫面,接下來才能更好理解後面要講的通訊協議。相信我,只要有這些畫面很快你也能在生活中找到用來類比案例,這樣學習起來會更有效率。那我們就下一篇見。

9會員
58內容數
WarrenLo's 軟體設計武功祕笈
留言0
查看全部
發表第一個留言支持創作者!