ModBus網(wǎng)絡是一種工業(yè)通信系統(tǒng),由可編程控制器與智能終端和計算機通過公用線路或本地專線連接而成。其系統(tǒng)結構包括硬件和軟件??蓱糜诟鞣N數(shù)據(jù)采集和過程監(jiān)控。
ModBus 網(wǎng)絡只有一個主機,所有通信都來自該主機。網(wǎng)絡最多可支持 247 個遠程從控制器,但實際支持的從控制器數(shù)量取決于所使用的通信設備。使用該系統(tǒng),每臺 PC 都可以與中央主機交換信息,而不會影響每臺 PC 執(zhí)行自己的控制任務。
了解Modbus通訊協(xié)議是怎么回事,現(xiàn)場可以使用各種第三方小軟件做通訊測試。
Modbus協(xié)議包括ASCII、RTU、TCP等,不指定物理層。該協(xié)議定義了控制器可以識別和使用的消息結構,無論它們通過何種網(wǎng)絡進行通信。標準 Modicon 控制器使用 RS232C 實現(xiàn)串行 Modbus。 Modbus 的 ASCII 和 RTU 協(xié)議規(guī)定了消息、數(shù)據(jù)、命令和響應方法的結構。數(shù)據(jù)通訊采用Master/Slave方式。 Master發(fā)送數(shù)據(jù)請求消息,Slave收到正確的消息后可以向Master發(fā)送數(shù)據(jù)。響應請求; Master也可以直接發(fā)送消息修改Slave上的數(shù)據(jù),實現(xiàn)雙向讀寫。
Modbus 協(xié)議需要校驗數(shù)據(jù)。串行協(xié)議中除了奇偶校驗外,ASCII 模式采用 LRC 校驗,RTU 模式采用 16 位 CRC 校驗,但 TCP 模式不需要額外的校驗,因為 TCP 協(xié)議是面向連接的可靠協(xié)議。另外,Modbus采用主從模式定期發(fā)送和接收數(shù)據(jù)。在實際使用中,如果從站斷開(如故障或停機),主站可以進行診斷,當故障修復后,可以自動連接網(wǎng)絡。因此,Modbus協(xié)議的可靠性更好。
對于Modb對于我們的ASCII、RTU和TCP協(xié)議,TCP和RTU協(xié)議非常相似。我們只需要把RTU協(xié)議的兩字節(jié)校驗碼去掉,然后在RTU協(xié)議的開頭加上5個0和一個6。它可以通過 TCP/IP 網(wǎng)絡協(xié)議發(fā)送出去。
通訊傳輸方式:
通信傳輸分為獨立的報頭和編碼數(shù)據(jù)發(fā)送。以下通信傳輸方式定義也兼容 ModBusRTU 通信協(xié)議:
初始結構 = ≥4 字節(jié)時間
地址碼 = 1 個字節(jié)
功能碼 = 1 個字節(jié)
\n數(shù)據(jù)區(qū)=N字節(jié)
錯誤檢查 = 16 位 CRC 碼
結束結構 = ≥4 字節(jié)時間
地址碼:地址碼是通訊傳輸?shù)牡谝粋€字節(jié)。該字節(jié)表示具有用戶設置的地址碼的從機將接收到主機發(fā)送的信息。并且每個從機都有一個唯一的地址碼,響應回顯以各自的地址碼開始。主機發(fā)送的地址碼表示要發(fā)送到的從機地址,從機發(fā)送的地址碼表示返回的從機地址。
功能碼:通訊傳輸?shù)牡诙€字節(jié)。 ModBus 通訊協(xié)議定義了從 1 到 127 的功能號。本儀器僅使用部分功能碼。它作為主機請求發(fā)送,功能碼告訴從機要執(zhí)行什么動作。作為從機的響應,從機發(fā)送的功能碼與主機發(fā)送的功能碼相同,表示從機已經響應主機進行操作。如果從機發(fā)送的功能碼最高位為1(例如功能碼較大同時為127),則表示從機不響應操作或發(fā)送錯誤。
數(shù)據(jù)區(qū):數(shù)據(jù)區(qū)根據(jù)功能碼的不同而不同。數(shù)據(jù)字段可以是從主站發(fā)送到從站或從站到主站的實際值、設定點、地址。
CRC 碼:兩字節(jié)錯誤檢測碼。
2.modbus通訊協(xié)議詳解通訊協(xié)議:
當向儀器發(fā)送通訊命令時,滿足相應地址碼的設備會收到通訊命令,去除地址碼,讀取信息,如果沒有錯誤,執(zhí)行相應的任務;然后將執(zhí)行結果返回給發(fā)送者.返回的信息包括地址碼、執(zhí)行動作的功能碼、執(zhí)行動作后的結果數(shù)據(jù)、錯誤校驗碼。如果出現(xiàn)錯誤,則不會發(fā)送任何信息。
1.modbus通訊協(xié)議詳解信息框架結構
地址碼 功能碼 數(shù)據(jù)區(qū)錯誤校驗碼
8 位 8 位 N × 8 位 16 位
地址碼:地址碼是信息幀的第一個字節(jié)(8位),從0到255。這個字節(jié)表示具有用戶設置的地址的從機將接收到主機發(fā)送的信息。每個從機必須有唯一的地址碼,只有匹配地址碼的從機才能響應回顯。當從機發(fā)回信息時,對應的地址碼表示信息的來源。
功能碼:主機發(fā)送的功能碼告訴從機要執(zhí)行什么任務。表 1-1 中列出的功能碼具有特定的含義和操作。
數(shù)據(jù)區(qū):數(shù)據(jù)區(qū)包含從機需要執(zhí)行什么動作或從機收集的返回信息。該信息可以是數(shù)值、參考地址等。例如,如果功能碼告訴從機讀取寄存器的值,則數(shù)據(jù)區(qū)必須包含要讀取的寄存器的起始地址和長度。對于不同的從機,地址和數(shù)據(jù)信息是不同的。
錯誤校驗碼:主機或從機可以使用校驗碼來判斷接收到的信息是否錯誤。有時,由于電子噪聲或其他一些干擾,信息在傳輸過程中會發(fā)生細微的變化,錯誤校驗碼確保主機或從機不會對傳輸過程中出錯的信息進行處理。這提高了系統(tǒng)的安全性和效率。錯誤校驗采用CRC-16校驗方式。
注:信息幀的格式基本相同:地址碼、功能碼、數(shù)據(jù)區(qū)和錯誤校驗碼。
2.錯誤檢查
冗余循環(huán)碼 (CRC) 由 2 個字節(jié)組成,即 16 位二進制。 CRC 碼由發(fā)送設備計算并放置在發(fā)送消息的末尾。接收到信息的設備重新計算接收到的信息的CRC碼,并比較計算出的CRC碼是否與接收到的相匹配。如果兩者不匹配,則表示錯誤。
Modbus支持的功能碼
modbus通訊協(xié)議詳解功能碼指令:
這些功能碼中使用的較長的是1和2、3、4、5、6功能碼,可以用來讀寫下位機的數(shù)字量和模擬量。
1號指令01,讀寫數(shù)字寄存器(線圈狀態(tài)):
電腦發(fā)送命令:【設備地址】【命令號01】【起始寄存器地址高8位】【低8位】【讀寄存器個數(shù)高8位】【低8位】【CRC校驗低8位】 【CRC校驗高8位】
示例:[11][01][00][13][00][25][CRC 低][CRC 高]
modbus通訊協(xié)議詳解含義如下:
<1>設備地址:在一個485總線上可以連接多個設備,這里的設備地址表示你想和哪個設備通信。在示例中,我想與數(shù)字 17 通信(十進制的 17 是十六進制的 11)。
<2>指令號01:讀取數(shù)字量的指令號固定為01。
<3>起始地址的高8位和低8位:表示要讀取的開關的起始地址(起始地址為0)。例如,示例中的起始地址為 19。
<4>寄存器號的高8位和低8位:表示從起始地址讀取了多少個開關。在示例中,有 37 個開關。
<5>CRC校驗:從頭到尾校驗。
設備響應:[設備地址] [命令號 01] [返回的字節(jié)數(shù)] [數(shù)據(jù) 1] [數(shù)據(jù) 2]...[數(shù)據(jù) n] [CRC 校驗的高 8 位] [CRC 校驗和的低 8 位]
.modbus通訊協(xié)議詳解示例:[11][01][05][CD][6B][B2][0E][1B] [CRC 高] [CRC 低]
含義如下:
<1>設備地址和命令號同上。
<2>返回字節(jié)數(shù):表示數(shù)據(jù)的字節(jié)數(shù),即數(shù)據(jù)1、2...n中n的值。
<3>數(shù)據(jù)1...n:由于每個數(shù)據(jù)是一個8位的數(shù)字,每個數(shù)據(jù)代表8個開關的值,每個位為0表示對應的開關為關閉,為1表示關閉。例如在示例中,表示20號(索引號為19)的開關閉合,21號打開,22關閉,23關閉,24打開,25打開,26關閉,27關閉。 . 如果查詢到的開關量不是 8 的整數(shù)倍,則最后一個字節(jié)的高位部分無意義,設置為 0。
<4>CRC校驗同上。
2號和05號指令,寫入數(shù)字量(線圈狀態(tài)):
電腦發(fā)送命令:【設備地址】【命令號05】【要放置的寄存器地址高8位】【低8位】【數(shù)據(jù)低8位】【低8位】【CRC校驗低8位】【 CRC校驗高8位]
示例:[ 11][05][00][AC][FF][00][CRC 高][CRC 低]
含義如下:
<1>設備地址同上。
<2>命令號:寫入數(shù)字量的命令號固定為05。
<3>需要向下放置的寄存器地址的高8位和低8位:表示需要向下放置的開關地址。
<4>低位數(shù)據(jù)的高8位和低8位:表示需要低位的開關狀態(tài)。在示例中,開關是閉合的。注意只有[FF][00]表示關閉[00][00]表示打開,其他值是非法的。
<5>注意,該命令只能設置一種開關狀態(tài)。
設備響應:如果計算機發(fā)送的命令按原樣返回,否則不響應。
命令 3 和 03,讀寫模擬寄存器(保持寄存器):
電腦發(fā)送命令:【設備地址】【命令號03】【起始寄存器地址高8位】【低8位】【讀寄存器個數(shù)的高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 個類似物。請注意,模擬需要在返回的信息中返回兩個字節(jié)。
設備響應:[設備地址] [命令號 03] [返回的字節(jié)數(shù)] [數(shù)據(jù) 1] [數(shù)據(jù) 2]...[數(shù)據(jù) n] [CRC 校驗和的高 8 位] [CRC 檢查低 8 位]
示例:[11][03][06][02][2B][00][00][00][64] [CRC 高] [CRC 低]
modbus通訊協(xié)議詳解含義如下:
<1>設備地址和命令號同上。
<2>返回字節(jié)數(shù):表示數(shù)據(jù)的字節(jié)數(shù),即數(shù)據(jù)1、2...n中n的值。示例中返回了 3 個模擬量的數(shù)據(jù),因為 1 個模擬量需要 2 個字節(jié),所以總共有 6 個字節(jié)。
<3>Data 1...n:[Data 1][Data 2]分別是第一個模擬量的高8位和低8位,[Data 3][Data 4]是第二個高8位位和模擬量的低 8 位,依此類推。示例中返回的值分別為 555、0 和 100。
<4>CRC校驗同上。
4號和06號命令,寫入單個模擬寄存器(保持寄存器):
電腦發(fā)送命令:【設備地址】【命令號06】【要放置的寄存器地址高8位】【低8位】【數(shù)據(jù)低8位】【低8位】【CRC校驗高8位】【 CRC校驗的低8位]
modbus通訊協(xié)議詳解示例:[11][06][00][01][00][03] [CRC 高] [CRC 低]
含義如下:
<1>設備地址同上。
<2>指令號:寫入模擬量的指令號固定為06。
<3>要設置的寄存器地址的高8位和低8位:表示需要設置的模擬量寄存器的地址。
<4>低位數(shù)據(jù)的高8位和低8位:表示需要低位的模擬數(shù)據(jù)。例如,在示例中,寄存器 1 的值設置為 3。
<5>注意該指令只能設置一個模擬量的狀態(tài)。
設備響應:如果計算機發(fā)送的命令按原樣返回,否則不響應。
命令 5 和 16,寫入多個模擬寄存器(保持寄存器):
電腦發(fā)送指令:【設備地址】【指令號16】【要放置的寄存器地址高8位】【低8位】【數(shù)據(jù)號高8位】【數(shù)據(jù)號低8位】【低位數(shù)據(jù)高8位】 [低 8 位] […][…] [CRC 校驗高 8 位] [CRC 校驗和的低 8 位]
示例:[11][16][00][01][00][01][00][05] [CRC 高] [CRC 低]
modbus通訊協(xié)議詳解含義如下:
<1>設備地址同上。
<2>命令號:寫入模擬量的命令號固定為16。
<3>要放置的寄存器地址的高8位和低8位:表示需要放置的模擬寄存器的地址。
<4>要向下設置的數(shù)據(jù)個數(shù)的高8位和低8位:表示要向下設置的數(shù)據(jù)量,這里為1。
<5>低位數(shù)據(jù)的高8位和低8位:表示需要低位的模擬數(shù)據(jù)。例如,在示例中,寄存器 1 的值設置為 5。
設備響應:如果計算機成功返回以下命令,否則不響應。
設備響應:【設備地址】【命令號16】【要放置的寄存器地址高8位】【低8位】【數(shù)據(jù)高8位】【數(shù)據(jù)低8位】【CRC校驗高8位】 [CRC校驗的低8位],如上例返回:
[11][16][00][01][00][01] [CRC 高] [CRC 低]