Modbus RTU

簡介

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 binaryCRC16
TCP網路/TCP8–bit binaryby 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)

功能碼名稱說明
01ILLEGAL不支援的功能
02ILLEGAL DATA ADDRESS不合法的地址
03ILLEGAL DATA VALUE不合法的數值
04SLAVE DEVICE FAILURESalve 設備失效
05ACKNOWLEDGE確認(命令執行中)
06SLAVE DEVICE BUSYSlave 設備忙錄

參考文件及網站