作者:Ryan Hu
我又跳票了。Johnny Five clock 只進行到 part 1,後來的確有對 Johnny Five 繼續把玩了一番,REPL 是否會被綁架的實驗做完了,不過 STM32F7 才研究到一半,我想重新洗掉 default 的 OS (應該是 mbed),灌自己的 Linux版本,一邊了解整個 嵌入式作業系統的流程,一邊精進自已 Linux command 的能力,不過前些日子還沒完全破關,未能整理成完整的文章,接著就又必須向現實低頭,停止玩耍,賺點生活費。
估計又要一陣子才能繼續 Johnny Five 和 F7 的動作了,先讓我欠著,我一定會寫完文章!
這次到手邊的案子是客戶希望利用他們自家設計的硬體實作 Modbus 通訊,簡單來說,整個架構就如下圖:
基本上這張圖就完全是這次要實現的系統架構。(不要急,等等下面提到看起來很可怕的東西我都會再解釋。)
PC(master)透過 Modbus TCP 經由 Ethernet 給特定 IP 的 device(slave)訊息,這裡的 device 在我實現的過程中是利用 Arduino UNO + ENC28J60 Ethernet module。
而這個 Arduino UNO 又會被拿來當 Modbus RTU(remote terminal unit)的 master,而電子標籤就是在這整個架構下做為 Modbus RTU 的 slave。
兩段都是利用 RJ45 連接,只是第一段是真的 Ethernet,第二段則是利用 RJ45 來實現 RS485 通訊。之所以要用 RS485 是因為客戶希望可以連接多個電子標籤,畢竟我們都知道 RS485 相對 RS232 更穩定。
Modbus Protocol
Modbus協定(Protocol)事實上行之有年,早就不是新東西,以往被應用的場域就屬 PLC 最為廣泛,只是菜鳥如我當然是第一次使用這個東西,因此決定來研究研究。由於篇幅,這裡會省去所有歷史的部分,有興趣的同好朋友可以自行 Google。
首先,Modbus協定走的是最常見的 master / slave 通訊架構,值得注意的是,在 Modbus協定中 slave 是無法主動發起通訊 (requirement),也就是說,slave 一定要等到收到 master 的訊息才有機會送出資料。
接著開始解釋文章上方,在敘述這次要實現的系統架構時所提到的一些名詞,像是 Modbus TCP 和 Modbus RTU。簡單來說,Modbus 共有三個種類,分別為:
- Modbus ASCII
- Modbus RTU(remote terminal unit)
- Modbus TCP
** 題外話,如果想瞭解 RTU 和 PLC 差異的同好朋友可以參考此文章。

Modbus 共有三個類型,分別是Modbus ASCII、Modbus TCP與Modbus RTU(圖片來源:realpars)
顯然第一項並沒有提到過。Modbus ASCII 其實是 Modbus 剛被設計出來時,這個通訊協定傳輸資料使用的編碼方式(ASCII encoding),至今已經鮮少人使用,不特別介紹。
目前最常見,也最主流的則是使用 binary encoding,加上 CRC error checking 的 Modbus RTU,搭配的介面就是大家所熟悉的 RS232、RS485 或 RS422。當然,這其中最受歡迎的還是 RS485,畢竟他的表現備受肯定:理論上如果 baud rate 都相同,在沒有 repeater(就想像是一個中繼站即可)的情況下,最多能連貫 32 個 devices,而在有 repeater 的情形下更是可以連貫 247 個 devices,距離遠達 1200 meters。

RS232、RS422 與 RS485連結埠腳位定義(圖片來源)
由於 Modbus RTU 的主流,接下來所介紹的 Modbus 資料傳輸格式(format)以及內容(content)都是環繞在這個種類的 Modbus,即 Modbus RTU protocol。
最後一個 Modbus TCP,嚴格來說,它並不是 master / slave 的通訊架構,而是 client / server,雖然小弟我覺得根本沒有太大差別,而且的確網路上很多資源都顯示,可以將 client 比擬為 master,server 則比擬為 slave(直覺來想可能會覺得我打錯了,不過並沒有)。
Modbus TCP 和 Modbus RTU 最大的差別在於兩個部分。
第一,Modbus TCP 會在把 Modbus RTU 的一段 chunk of data 再封裝(encapsulate)一層,變成 TCP packet,作為傳輸的單位。
第二,Modbus TCP 所使用的 error checking(eg. checksum)是使用 TCP 的,不是使用 RTU 本身的(這也很直覺,畢竟都用 TCP packet 傳了)。
另外,Modbus TCP 是可以同時運行多個 client(master)和多個 server(slave)的。
由於篇幅,被迫先停在這裡不然會很奇怪,下篇開始會從 Modbus RTU protocol packet format 開始解釋。想先瞭解更多的朋友,Youtube 上有個頻道 RealPars,小弟我認為他講解的 Modbus 非常清楚,可以參考看看,以下為影片:
(責任編輯:楊子嫻)
- 【NB-IoT】菜鳥Maker輕鬆上手DSI2598開發板 - 2019/12/13
- 【Maker電子學】Modbus over TCP 實作(上) - 2019/11/28
- 【Maker電子學】Modbus RTU的傳輸資料格式 - 2019/09/18
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!