簡介
Modbus是一種串行通信協定,是Modicon公司(現在的施耐德電氣 Schneider Electric)於1979年為使用可程式化邏輯控制器(PLC)通信而發表。Modbus已經成為工業領域通信協定事實上的業界標準,並且現在是工業電子裝置之間常用的連接方式。Modbus比其他通信協定使用的更廣泛的主要原因有: l公開發表並且無著作權要求 l易於部署和維護 l對供應商來說,修改移動原生的位元或位元組沒有很多限制 Modbus允許多個 (應該是:254個) 裝置連接在同一個網路上進行通信,舉個例子,一個由測量溫度和濕度的裝置,並且將結果傳送給電腦。在資料採集與監視控制系統(SCADA)中,Modbus通常用來連接監視電腦和遠端終端控制系統(RTU)。
Protocol(通訊協定)
Modbus協定目前存在用於序列埠、乙太網路以及其他支持網際網路協定的網路的版本。 大多數Modbus裝置通信通過序列埠EIA-485實體層進行。
Modbus 一般有三種通訊協定
通訊協定 | 通訊媒介 | 編碼系統 | 校驗碼 |
ASCII | 串列 | ASCII(0–9, A–F ) | LRC |
RTU | 串列 | 8–bit binary | CRC16 |
TCP | 網路/TCP | 8–bit binary | by TCP checksum |
字元格式:同一線路下,所以的週邊採用的字元格式定義需要相同,常見的是8N1
RTU 通訊
- 主從架構:一個主站(Master), 多個從站(Slave, 一個從站也可以)。以半雙工方式通訊。
- ADDR: 一個至多個從站,以站號(Byte, 0~255, 一般 0 跟 255 保留給特定用途)來區分,一個通訊裝置(從站)分配一個站號.(主站不需要站號!)
- Master 主宰的通訊秩序:只有Master 可以發出通訊要求, 對應站號的Slave回應通訊要求.
Timeout 機制 (逾時中止)
Timeout是MODBUS通訊中一定會用到的第一個概念。特別是在RTU傳送模式下,因為通訊碼裡面並沒有結束碼的設計。所以只能透過“經過多久時間沒有在送資料”來判斷它已經結束了。這個等待時間一般來說是5~10 個Bytes的時間間隔。拿9600bps的鮑率來看,1個Byte約需1mS。那麼適當的Timout時間就是5mS~10mS。
為什麼要這樣設定?
因為資料在傳送的過程,主控端有可能受到其它多工運作的影響。導致指令並不是連續送出來的,把Timeout設得太低。有可能當指令傳到一半時,裝置就開始分析指令了。這樣一來,指令分析一定會錯誤,裝置也就不會正確動作及回應了!!。
CMD 通訊功能碼

Master 中,功能碼為3的範例

原始文件的說明


Slave 的回傳


原始文件說明

Check Sum 計算
原廠文件內所附的程式碼(https://modbus.org/docs/PI_MBUS_300.pdf Page114),另可在網頁另行進行檢查 https://www.lammertbies.nl/comm/info/crc-calculation
Savle Error Code
當master傳送的request不符合格式、slave不支援此功能等問題時,代表slave不能正確解碼request內容,這時slave就會response一個error response。
- Slave ID=Original
- Error Code=Function code + 0x80
- Exception Code=01, 02, 03, 04, etc(依照發生錯誤的原因)
- CRC校正碼
Slave Response Error packge
Slave 地址 | 功能碼 | 異常碼 | CRC |
Original | Function code + 0x80 | Exception Code | CRC校正碼 |
異常代碼(Exception Codes)
功能碼 | 名稱 | 說明 |
01 | ILLEGAL | 不支援的功能 |
02 | ILLEGAL DATA ADDRESS | 不合法的地址 |
03 | ILLEGAL DATA VALUE | 不合法的數值 |
04 | SLAVE DEVICE FAILURE | Salve 設備失效 |
05 | ACKNOWLEDGE | 確認(命令執行中) |
06 | SLAVE DEVICE BUSY | Slave 設備忙錄 |
參考文件及網站