本文為modbus通訊協議詳解。ModBus網絡是一種工業通信系統,由可編程控制器與智能終端和計算機通過公用線路或本地專線連接而成。其系統結構包括硬件和軟件。可應用于各種數據采集和過程監控。
ModBus 網絡只有一個主機,所有通信都來自該主機。網絡最多可支持 247 個遠程從控制器,但實際支持的從控制器數量取決于所使用的通信設備。使用該系統,每臺 PC 都可以與中央主機交換信息,而不會影響每臺 PC 執行自己的控制任務。
了解Modbus通訊協議是怎么回事,現場可以使用各種第三方小軟件做通訊測試。

Modbus協議包括ASCII、RTU、TCP等,不指定物理層。該協議定義了控制器可以識別和使用的消息結構,無論它們通過何種網絡進行通信。標準 Modicon 控制器使用 RS232C 實現串行 Modbus。 Modbus 的 ASCII 和 RTU 協議規定了消息、數據、命令和響應方法的結構。數據通訊采用Master/Slave方式。 Master發送數據請求消息,Slave收到正確的消息后可以向Master發送數據。響應請求; Master也可以直接發送消息修改Slave上的數據,實現雙向讀寫。
Modbus 協議需要校驗數據。串行協議中除了奇偶校驗外,ASCII 模式采用 LRC 校驗,RTU 模式采用 16 位 CRC 校驗,但 TCP 模式不需要額外的校驗,因為 TCP 協議是面向連接的可靠協議。另外,Modbus采用主從模式定期發送和接收數據。在實際使用中,如果從站斷開(如故障或停機),主站可以進行診斷,當故障修復后,可以自動連接網絡。因此,Modbus協議的可靠性更好。
對于Modb對于我們的ASCII、RTU和TCP協議,TCP和RTU協議非常相似。我們只需要把RTU協議的兩字節校驗碼去掉,然后在RTU協議的開頭加上5個0和一個6。它可以通過 TCP/IP 網絡協議發送出去。
通訊傳輸方式:
通信傳輸分為獨立的報頭和編碼數據發送。以下通信傳輸方式定義也兼容 ModBusRTU 通信協議:
初始結構 = ≥4 字節時間
地址碼 = 1 個字節
功能碼 = 1 個字節
\n數據區=N字節
錯誤檢查 = 16 位 CRC 碼
結束結構 = ≥4 字節時間
地址碼:地址碼是通訊傳輸的第一個字節。該字節表示具有用戶設置的地址碼的從機將接收到主機發送的信息。并且每個從機都有一個唯一的地址碼,響應回顯以各自的地址碼開始。主機發送的地址碼表示要發送到的從機地址,從機發送的地址碼表示返回的從機地址。
功能碼:通訊傳輸的第二個字節。 ModBus 通訊協議定義了從 1 到 127 的功能號。本儀器僅使用部分功能碼。它作為主機請求發送,功能碼告訴從機要執行什么動作。作為從機的響應,從機發送的功能碼與主機發送的功能碼相同,表示從機已經響應主機進行操作。如果從機發送的功能碼最高位為1(例如功能碼較大同時為127),則表示從機不響應操作或發送錯誤。
數據區:數據區根據功能碼的不同而不同。數據字段可以是從主站發送到從站或從站到主站的實際值、設定點、地址。
CRC 碼:兩字節錯誤檢測碼。
2.modbus通訊協議詳解通訊協議:
當向儀器發送通訊命令時,滿足相應地址碼的設備會收到通訊命令,去除地址碼,讀取信息,如果沒有錯誤,執行相應的任務;然后將執行結果返回給發送者.返回的信息包括地址碼、執行動作的功能碼、執行動作后的結果數據、錯誤校驗碼。如果出現錯誤,則不會發送任何信息。
1.modbus通訊協議詳解信息框架結構
地址碼 功能碼 數據區錯誤校驗碼
8 位 8 位 N × 8 位 16 位
地址碼:地址碼是信息幀的第一個字節(8位),從0到255。這個字節表示具有用戶設置的地址的從機將接收到主機發送的信息。每個從機必須有唯一的地址碼,只有匹配地址碼的從機才能響應回顯。當從機發回信息時,對應的地址碼表示信息的來源。
功能碼:主機發送的功能碼告訴從機要執行什么任務。表 1-1 中列出的功能碼具有特定的含義和操作。
數據區:數據區包含從機需要執行什么動作或從機收集的返回信息。該信息可以是數值、參考地址等。例如,如果功能碼告訴從機讀取寄存器的值,則數據區必須包含要讀取的寄存器的起始地址和長度。對于不同的從機,地址和數據信息是不同的。
錯誤校驗碼:主機或從機可以使用校驗碼來判斷接收到的信息是否錯誤。有時,由于電子噪聲或其他一些干擾,信息在傳輸過程中會發生細微的變化,錯誤校驗碼確保主機或從機不會對傳輸過程中出錯的信息進行處理。這提高了系統的安全性和效率。錯誤校驗采用CRC-16校驗方式。
注:信息幀的格式基本相同:地址碼、功能碼、數據區和錯誤校驗碼。
2.錯誤檢查
冗余循環碼 (CRC) 由 2 個字節組成,即 16 位二進制。 CRC 碼由發送設備計算并放置在發送消息的末尾。接收到信息的設備重新計算接收到的信息的CRC碼,并比較計算出的CRC碼是否與接收到的相匹配。如果兩者不匹配,則表示錯誤。
Modbus支持的功能碼


modbus通訊協議詳解功能碼指令:
這些功能碼中使用的較長的是1和2、3、4、5、6功能碼,可以用來讀寫下位機的數字量和模擬量。
1號指令01,讀寫數字寄存器(線圈狀態):
電腦發送命令:【設備地址】【命令號01】【起始寄存器地址高8位】【低8位】【讀寄存器個數高8位】【低8位】【CRC校驗低8位】 【CRC校驗高8位】

示例:[11][01][00][13][00][25][CRC 低][CRC 高]
modbus通訊協議詳解含義如下:
<1>設備地址:在一個485總線上可以連接多個設備,這里的設備地址表示你想和哪個設備通信。在示例中,我想與數字 17 通信(十進制的 17 是十六進制的 11)。
<2>指令號01:讀取數字量的指令號固定為01。
<3>起始地址的高8位和低8位:表示要讀取的開關的起始地址(起始地址為0)。例如,示例中的起始地址為 19。
<4>寄存器號的高8位和低8位:表示從起始地址讀取了多少個開關。在示例中,有 37 個開關。
<5>CRC校驗:從頭到尾校驗。
設備響應:[設備地址] [命令號 01] [返回的字節數] [數據 1] [數據 2]...[數據 n] [CRC 校驗的高 8 位] [CRC 校驗和的低 8 位]

.modbus通訊協議詳解示例:[11][01][05][CD][6B][B2][0E][1B] [CRC 高] [CRC 低]
含義如下:
<1>設備地址和命令號同上。
<2>返回字節數:表示數據的字節數,即數據1、2...n中n的值。
<3>數據1...n:由于每個數據是一個8位的數字,每個數據代表8個開關的值,每個位為0表示對應的開關為關閉,為1表示關閉。例如在示例中,表示20號(索引號為19)的開關閉合,21號打開,22關閉,23關閉,24打開,25打開,26關閉,27關閉。 . 如果查詢到的開關量不是 8 的整數倍,則最后一個字節的高位部分無意義,設置為 0。
<4>CRC校驗同上。
2號和05號指令,寫入數字量(線圈狀態):
電腦發送命令:【設備地址】【命令號05】【要放置的寄存器地址高8位】【低8位】【數據低8位】【低8位】【CRC校驗低8位】【 CRC校驗高8位]

示例:[ 11][05][00][AC][FF][00][CRC 高][CRC 低]
含義如下:
<1>設備地址同上。
<2>命令號:寫入數字量的命令號固定為05。
<3>需要向下放置的寄存器地址的高8位和低8位:表示需要向下放置的開關地址。
<4>低位數據的高8位和低8位:表示需要低位的開關狀態。在示例中,開關是閉合的。注意只有[FF][00]表示關閉[00][00]表示打開,其他值是非法的。
<5>注意,該命令只能設置一種開關狀態。
設備響應:如果計算機發送的命令按原樣返回,否則不響應。
命令 3 和 03,讀寫模擬寄存器(保持寄存器):
電腦發送命令:【設備地址】【命令號03】【起始寄存器地址高8位】【低8位】【讀寄存器個數的高8位】【低8位】【CRC校驗的高8位】 ] [CRC校驗低8位]

示例:[11][03][00][6B][00][03] [CRC 高][CRC 低]
含義如下:
<1>設備地址同上。
<2>命令號:讀取模擬量的命令號固定為03。
<3>起始地址高 8 位、低 8 位:表示要讀取的模擬量的起始地址(起始地址為 0)。例如,示例中的起始地址為 107。
<4>寄存器號的高8位和低8位:表示從起始地址讀取了多少模擬量。在示例中,有 3 個類似物。請注意,模擬需要在返回的信息中返回兩個字節。
設備響應:[設備地址] [命令號 03] [返回的字節數] [數據 1] [數據 2]...[數據 n] [CRC 校驗和的高 8 位] [CRC 檢查低 8 位]

示例:[11][03][06][02][2B][00][00][00][64] [CRC 高] [CRC 低]
modbus通訊協議詳解含義如下:
<1>設備地址和命令號同上。
<2>返回字節數:表示數據的字節數,即數據1、2...n中n的值。示例中返回了 3 個模擬量的數據,因為 1 個模擬量需要 2 個字節,所以總共有 6 個字節。
<3>Data 1...n:[Data 1][Data 2]分別是第一個模擬量的高8位和低8位,[Data 3][Data 4]是第二個高8位位和模擬量的低 8 位,依此類推。示例中返回的值分別為 555、0 和 100。
<4>CRC校驗同上。
4號和06號命令,寫入單個模擬寄存器(保持寄存器):
電腦發送命令:【設備地址】【命令號06】【要放置的寄存器地址高8位】【低8位】【數據低8位】【低8位】【CRC校驗高8位】【 CRC校驗的低8位]

modbus通訊協議詳解示例:[11][06][00][01][00][03] [CRC 高] [CRC 低]
含義如下:
<1>設備地址同上。
<2>指令號:寫入模擬量的指令號固定為06。
<3>要設置的寄存器地址的高8位和低8位:表示需要設置的模擬量寄存器的地址。
<4>低位數據的高8位和低8位:表示需要低位的模擬數據。例如,在示例中,寄存器 1 的值設置為 3。
<5>注意該指令只能設置一個模擬量的狀態。
設備響應:如果計算機發送的命令按原樣返回,否則不響應。
命令 5 和 16,寫入多個模擬寄存器(保持寄存器):
電腦發送指令:【設備地址】【指令號16】【要放置的寄存器地址高8位】【低8位】【數據號高8位】【數據號低8位】【低位數據高8位】 [低 8 位] […][…] [CRC 校驗高 8 位] [CRC 校驗和的低 8 位]
示例:[11][16][00][01][00][01][00][05] [CRC 高] [CRC 低]
modbus通訊協議詳解含義如下:
<1>設備地址同上。
<2>命令號:寫入模擬量的命令號固定為16。
<3>要放置的寄存器地址的高8位和低8位:表示需要放置的模擬寄存器的地址。
<4>要向下設置的數據個數的高8位和低8位:表示要向下設置的數據量,這里為1。
<5>低位數據的高8位和低8位:表示需要低位的模擬數據。例如,在示例中,寄存器 1 的值設置為 5。
設備響應:如果計算機成功返回以下命令,否則不響應。
設備響應:【設備地址】【命令號16】【要放置的寄存器地址高8位】【低8位】【數據高8位】【數據低8位】【CRC校驗高8位】 [CRC校驗的低8位],如上例返回:
[11][16][00][01][00][01] [CRC 高] [CRC 低]