Modbus 介紹

IoT很重要,未來會有數億個甚至數百億個連網設備的需求等等,這樣的聲音好幾年了,而實際上也確實慢慢看到了越來越多的應用,今天不介紹IoT,今天想介紹一個IoT領域中的協定-Modbus。

甚麼是Modbus?

首先來看看wiki上面怎麼說Modbus:

Modbus是一種串行通信協定,是Modicon公司(現在的施耐德電氣 Schneider Electric)於1979年為使用可程式化邏輯控制器(PLC)通信而發表。Modbus已經成為工業領域通信協定事實上的業界標準,並且現在是工業電子裝置之間常用的連接方式。

目前很多的設備廠商會把設備中設定Modbus作為溝通及操作的介面,因此我們對於modbus有所了解等於是打開了一扇通往IoT工程師的門。

Modbus允許多個 (大約240個) 裝置連接在同一個網路上進行通信,舉個例子,一個由測量溫度和濕度的裝置,並且將結果傳送給電腦。在資料採集與監視控制系統中,Modbus通常用來連接監視電腦和遠端終端控制系統。

由上也可看出是屬於單獨的區域網路內的設備控制的協定,若要往外連到Cloud,則需要另外設計溝通的方式。

Modbus ASCII Modbus RTU Modubs TCP

Modbus協定是一個master/slave架構的協定。有一個節點是master節點,其他使用Modbus協定參與通信的節點是slave節點。每一個slave裝置都有一個唯一的位址;目前,Modbus協議分爲三種模式:Modbus RTU,Modbus ASCII和後來開發的Modbus TCP,前兩個(Modbus RTU,Modbus ASCII)使用的物理硬件接口是串行通信端口(RS232,RS422,RS485)。而Modbus TCP則是使用乙太網路的TCP 通訊協定來溝通。

Modbus 格式

而說到通訊協定,最核心的就是資料格式的定義了,因此我們這邊就來講講Modbus RTU的data frame的定義(ASCII及TCP與RTU的定義稍有不同,但大致的邏輯是一樣的),Modbus的每個data frame叫做應用數據單元(Application Data Unit),每個ADU包含了位址、功能碼、數據(資料)、CRC校驗碼;位址是指打算執行的裝置的Modbus位址(可以想成slave裝置的編號)。所有裝置都會收到命令,但只有指定位置的裝置會執行及回應指令(位址0例外,指定位址0的指令是廣播指令,所有收到指令的裝置都會執行,不過不回應指令)。所有的Modbus命令包含了檢查碼(RTU是使用CRC校驗碼,共兩個bytes),以確定到達的命令沒有被破壞。基本的ModBus命令能指令一個RTU改變它的暫存器的某個值,控制或者讀取一個I/O埠,以及指揮裝置回送一個或者多個其暫存器中的資料。

下圖為Modbus RTU的典型data frame:

一個典型的Modbus RTU的命令如下:

16位元Hex格式  : 01 03 00 02 00 01 25 CA
byte格式       : 1 3 0 2 0 1 37 202

(以下以16位元格式說明) 其中第一個01表示Slave 設備的 Address/ID/編號 (看你習慣怎麼看待,但基本上就是給每個設備的ID),接著的03表示功能碼(Function Code、請看下面一段的完整Modbus 功能碼列表),告訴設備要做甚麼事,03表示讀取寄存器,接著的 00 02 00 01都是Data的範疇,前面的兩碼表示寄存器的位址(00 02),後面兩碼(00 01)則是告訴設備要讀取多少,1表示1word(= 1unit16= 2bytes= 4 Hex digits),最後的25 CA則是CRC校驗碼,讓機器比對確認前面傳輸的內容沒有跑掉。因此,上面的命令合起來就是告訴1號設備去讀取 位址2 的寄存器的內容,共讀取2 bytes的量。

Modbus 功能碼

上面說到功能碼,目前Modbus定義的功能碼有很多,每個功能碼後面接的Data也會不太一樣,例如讀取的功能需要告訴設備讀取哪個address的寄存器,而寫入功能的則需要告訴設備寫入哪個寄存器及寫入甚麼,下表示最主要看的到的功能碼列表,供參考囉。