There are different flavours of Modbus Protocol

  • Modbus TCP
  • Modbus RTU
  • Modbus ASCII
  • Modbus Plus
  • Modbus Daniels
  • Modbus Tek-Air
  • Modbus Omniflow

最受歡迎的為Modbus RTU,Modbus TCP/IP

Modbus RTU

傳輸主要為1個Master對多個Slave,此時就用slave (通常是終端 Device)

的ID做識別,如果Master傳輸的ID對應到該Slave的ID,如果格式正確該Slave就會回應

因此在Modbus傳輸中,每個Slave都是被動的,不斷的在監聽是否有收到請求。

首先先講傳輸格式

Master發出 Query封包

Slave ID Fuction Register Addr Request byte CRC
01 03 00 00 00 02 C4 0B

Slave ID 通常Device上或Datasheet中都會寫,有一些要自己設定

Fuction功能碼列幾個常用的

01: 讀取當前 digital out status

02: 讀取當前 digital input status

03: 讀取當前 analog out status

04: 讀取當前 analog input status

05: 寫入單個 digital input value

06: 寫入單個 analog input value

15: 寫入多個 digital input value

16: 寫入多個 analog input value

不過實際上要怎麼用,還是要以 Datasheet 上規範的為主

Register Addr 站存器位置 這部分也是要參照Datasheet 上規範的位置來做存曲

每個區間存的數值都代表不同的意義

Request byte 要求的資料量: 這邊的1byte對應到Slave端回應的 1 word

例如 Master下 00 02 = 向Slave要求 2個word = request 4byte data

Slave端回應的封包

Slave ID Fuction Data byte data CRC
01 03 04 00 00 00 01 3B F3

前兩Byte都是Echo Master端的訊息

Data byte : 此範例 Master要求 2 words的資料,因此Slave回 4byes

在舉一個例子 如果是 寫入 非讀取 Command Slave端則會 Echo完整的封包內容

Master:

Slave ID Fuction Register Addr Request byte CRC
01 06 00 00 00 1 C2

Slave:

Slave ID Fuction Register Addr Request byte CRC
01 06 00 00 00 1E 09 C2

最後如果是Master要求的封包是有問題的,Slave則會回應錯誤封包格式 佔5byte

例如:

Master:

Slave ID Fuction Register Addr Request byte CRC
11 03 00 6B 00 03 76 87

如果要求的位置不合法 Slave則會回應如下

Slave ID Fuction Error Code CRC
11 83 02 C1 34

如果反還是錯誤的封包,Fuction為 83

Error則對應下表,來得知是哪種類型的錯誤

Error Code meaning
01 不支援的功能
02 不合法的地址
03 不合法的數值
04 Slave 設備失效
05 命令執行中
06 Slave忙碌中

results matching ""

    No results matching ""