Modbus通(tōng)訊協議(yì)原來(lái)是這(zhè)麽回事!看完秒懂(dǒng)了(le)
2020-5-21新聞
導語:
ModBus網絡是一個(gè)工業通(tōng)信系統,由帶智能終端的(de)可(kě)編程序控制器和(hé)計算(suàn)機通(tōng)過公用(yòng)線路或局部專用(yòng)線路連接而成。其系統結構既包括硬件、亦包括軟件。它可(kě)應用(yòng)于各種數據采集和(hé)過程監控。
ModBus網絡隻有一個(gè)主機,所有通(tōng)信都由他(tā)發出。網絡可(kě)支持247個(gè)之多(duō)的(de)遠(yuǎn)程從屬控制器,但實際所支持的(de)從機數要由所用(yòng)通(tōng)信設備決定。采用(yòng)這(zhè)個(gè)系統,各PC可(kě)以和(hé)中心主機交換信息而不影(yǐng)響各PC執行本身的(de)控制任務。
了(le)解Modbus通(tōng)訊協議(yì)是怎麽回事,在現場(chǎng)就可(kě)以用(yòng)各種第三方的(de)小軟件做(zuò)通(tōng)訊測試了(le)。
Modbus協議(yì)包括ASCII、RTU、TCP等,并沒有規定物(wù)理(lǐ)層。此協議(yì)定義了(le)控制器能夠認識和(hé)使用(yòng)的(de)消息結構,而不管它們是經過何種網絡進行通(tōng)信的(de)。标準的(de)Modicon控制器使用(yòng)RS232C實現串行的(de)Modbus。Modbus的(de)ASCII、RTU協議(yì)規定了(le)消息、數據的(de)結構、命令和(hé)就答(dá)的(de)方式,數據通(tōng)訊采用(yòng)Maser/Slave方式,Master端發出數據請求消息,Slave端接收到正确消息後就可(kě)以發送數據到Master端以響應請求;Master端也(yě)可(kě)以直接發消息修改Slave端的(de)數據,實現雙向讀寫。
Modbus協議(yì)需要對(duì)數據進行校驗,串行協議(yì)中除有奇偶校驗外,ASCII模式采用(yòng)LRC校驗,RTU模式采用(yòng)16位CRC校驗,但TCP模式沒有額外規定校驗,因爲TCP協議(yì)是一個(gè)面向連接的(de)可(kě)靠協議(yì)。另外,Modbus采用(yòng)主從方式定時(shí)收發數據,在實際使用(yòng)中如果某Slave站點斷開後(如故障或關機),Master端可(kě)以診斷出來(lái),而當故障修複後,網絡又可(kě)自動接通(tōng)。因此,Modbus協議(yì)的(de)可(kě)靠性較好。
對(duì)于Modbus的(de)ASCII、RTU和(hé)TCP協議(yì)來(lái)說,其中TCP和(hé)RTU協議(yì)非常類似,我們隻要把RTU協議(yì)的(de)兩個(gè)字節的(de)校驗碼去掉,然後在RTU協議(yì)的(de)開始加上5個(gè)0和(hé)一個(gè)6并通(tōng)過TCP/IP網絡協議(yì)發送出去即可(kě)。
1
通(tōng)訊傳送方式:
通(tōng)訊傳送分(fēn)爲獨立的(de)信息頭,和(hé)發送的(de)編碼數據。以下(xià)的(de)通(tōng)訊傳送方式定義也(yě)與ModBusRTU通(tōng)訊規約相兼容:
初始結構 = ≥4字節的(de)時(shí)間
地址碼 = 1 字節
功能碼 = 1 字節
數據區(qū) = N 字節
錯誤校檢 = 16位CRC碼
結束結構 = ≥4字節的(de)時(shí)間
地址碼:地址碼爲通(tōng)訊傳送的(de)第一個(gè)字節。這(zhè)個(gè)字節表明(míng)由用(yòng)戶設定地址碼的(de)從機将接收由主機發送來(lái)的(de)信息。并且每個(gè)從機都有具有唯一的(de)地址碼,并且響應回送均以各自的(de)地址碼開始。主機發送的(de)地址碼表明(míng)将發送到的(de)從機地址,而從機發送的(de)地址碼表明(míng)回送的(de)從機地址。
功能碼:通(tōng)訊傳送的(de)第二個(gè)字節。ModBus通(tōng)訊規約定義功能号爲1到127。本儀表隻利用(yòng)其中的(de)一部分(fēn)功能碼。作爲主機請求發送,通(tōng)過功能碼告訴從機執行什(shén)麽動作。作爲從機響應,從機發送的(de)功能碼與從主機發送來(lái)的(de)功能碼一樣,并表明(míng)從機已響應主機進行操作。如果從機發送的(de)功能碼的(de)最高(gāo)位爲1(比如功能碼大(dà)與此同時(shí)127),則表明(míng)從機沒有響應操作或發送出錯。
數據區(qū):數據區(qū)是根據不同的(de)功能碼而不同。數據區(qū)可(kě)以是實際數值、設置點、主機發送給從機或從機發送給主機的(de)地址。
CRC碼:二字節的(de)錯誤檢測碼。
2
通(tōng)訊規約:
當通(tōng)訊命令發送至儀器時(shí),符合相應地址碼的(de)設備接通(tōng)訊命令,并除去地址碼,讀取信息,如果沒有出錯,則執行相應的(de)任務;然後把執行結果返送給發送者。返送的(de)信息中包括地址碼、執行動作的(de)功能碼、執行動作後結果的(de)數據以及錯誤校驗碼。如果出錯就不發送任何信息。
1.信息幀結構
地址碼 功能碼 數據區(qū) 錯誤校驗碼
8位 8位 N × 8位 16位
地址碼:地址碼是信息幀的(de)第一字節(8位),從0到255。這(zhè)個(gè)字節表明(míng)由用(yòng)戶設置地址的(de)從機将接收由主機發送來(lái)的(de)信息。每個(gè)從機都必須有唯一的(de)地址碼,并且隻有符合地址碼的(de)從機才能響應回送。當從機回送信息時(shí),相當的(de)地址碼表明(míng)該信息來(lái)自于何處。
功能碼:主機發送的(de)功能碼告訴從機執行什(shén)麽任務。表1-1列出的(de)功能碼都有具體的(de)含義及操作。
數據區(qū):數據區(qū)包含需要從機執行什(shén)麽動作或由從機采集的(de)返送信息。這(zhè)些信息可(kě)以是數值、參考地址等等。例如,功能碼告訴從機讀取寄存器的(de)值,則數據區(qū)必需包含要讀取寄存器的(de)起始地址及讀取長(cháng)度。對(duì)于不同的(de)從機,地址和(hé)數據信息都不相同。
錯誤校驗碼:主機或從機可(kě)用(yòng)校驗碼進行判别接收信息是否出錯。有時(shí),由于電子噪聲或其它一些幹擾,信息在傳輸過程中會發生細微的(de)變化(huà),錯誤校驗碼保證了(le)主機或從機對(duì)在傳送過程中出錯的(de)信息不起作用(yòng)。這(zhè)樣增加了(le)系統的(de)安全和(hé)效率。錯誤校驗采用(yòng)CRC-16校驗方法。
注:信息幀的(de)格式都基本相同:地址碼、功能碼、數據區(qū)和(hé)錯誤校驗碼。
2.錯誤校驗
冗餘循環碼(CRC)包含2個(gè)字節,即16位二進制。CRC碼由發送設備計算(suàn),放置于發送信息的(de)尾部。接收信息的(de)設備再重新計算(suàn)接收到信息的(de) CRC碼,比較計算(suàn)得(de)到的(de)CRC碼是否與接收到的(de)相符,如果兩者不相符,則表明(míng)出錯。
3
Modbus支持的(de)功能碼:
功能碼 | 名稱 | 作用(yòng) |
1 | 讀取線圈狀态 | 取得(de)一組邏輯線圈的(de)當前狀态(ON/OFF) |
2 | 讀取輸入狀态 | 取得(de)一組開關輸入的(de)當前狀态(ON/OFF) |
3 | 讀取保持寄存器 | 在一個(gè)或多(duō)個(gè)保持寄存器中取得(de)當前的(de)二進制值 |
4 | 讀取輸入寄存器 | 在一個(gè)或多(duō)個(gè)輸入寄存器中取得(de)當前的(de)二進制值 |
5 | 強置單線圈 | 強置一個(gè)邏輯線圈的(de)通(tōng)斷狀态 |
6 | 預置單寄存器 | 把具體二進值裝入一個(gè)保持寄存器 |
7 | 讀取異常狀态 | 取得(de)8個(gè)内部線圈的(de)通(tōng)斷狀态,這(zhè)8個(gè)線圈的(de)地址由控制器決定 |
8 | 回送診斷校驗 | 把診斷校驗報文送從機,以對(duì)通(tōng)信處理(lǐ)進行評鑒 |
9 | 編程(隻用(yòng)于484) | 使主機模拟編程器作用(yòng),修改PC從機邏輯 |
10 | 控詢(隻用(yòng)于484) | 可(kě)使主機與一台正在執行長(cháng)程序任務從機通(tōng)信,探詢該從機是否已完成其操作任務,僅在含有功能碼9的(de)報文發送後,本功能碼才發送 |
11 | 讀取事件計數 | 可(kě)使主機發出單詢問,并随即判定操作是否成功,尤其是該命令或其他(tā)應答(dá)産生通(tōng)信錯誤時(shí) |
12 | 讀取通(tōng)信事件記錄 | 可(kě)是主機檢索每台從機的(de)ModBus事務處理(lǐ)通(tōng)信事件記錄。如果某項事務處理(lǐ)完成,記錄會給出有關錯誤 |
13 | 編程(184/384 484 584) | 可(kě)使主機模拟編程器功能修改PC從機邏輯 |
14 | 探詢(184/384 484 584) | 可(kě)使主機與正在執行任務的(de)從機通(tōng)信,定期控詢該從機是否已完成其程序操作,僅在含有功能13的(de)報文發送後,本功能碼才得(de)發送 |
15 | 強置多(duō)線圈 | 強置一串連續邏輯線圈的(de)通(tōng)斷 |
16 | 預置多(duō)寄存器 | 把具體的(de)二進制值裝入一串連續的(de)保持寄存器 |
17 | 報告從機标識 | 可(kě)使主機判斷編址從機的(de)類型及該從機運行指示燈的(de)狀态 |
18 | (884和(hé)MICRO 84) | 可(kě)使主機模拟編程功能,修改PC狀态邏輯 |
19 | 重置通(tōng)信鏈路 | 發生非可(kě)修改錯誤後,是從機複位于已知狀态,可(kě)重置順序字節 |
20 | 讀取通(tōng)用(yòng)參數(584L) | 顯示擴展存儲器文件中的(de)數據信息 |
21 | 寫入通(tōng)用(yòng)參數(584L) | 把通(tōng)用(yòng)參數寫入擴展存儲文件,或修改之 |
22~64 | 保留作擴展功能備用(yòng) | |
65~72 | 保留以備用(yòng)戶功能所用(yòng) | 留作用(yòng)戶功能的(de)擴展編碼 |
73~119 | 非法功能 | |
120~127 | 保留 | 留作内部作用(yòng) |
128~255 | 保留 | 用(yòng)于異常應答(dá) |
4
功能碼命令詳解:
在這(zhè)些功能碼中較長(cháng)使用(yòng)的(de)是1、2、3、4、5、6号功能碼,使用(yòng)它們即可(kě)實現對(duì)下(xià)位機的(de)數字量和(hé)模拟量的(de)讀寫操作。
1、01号命令,讀可(kě)讀寫數字量寄存器(線圈狀态):
計算(suàn)機發送命令:[設備地址] [命令号01] [起始寄存器地址高(gāo)8位] [低8位] [讀取的(de)寄存器數高(gāo)8位] [低8位] [CRC校驗的(de)低8位] [CRC校驗的(de)高(gāo)8位]
例:[11][01][00][13][00][25][CRC低][CRC高(gāo)]
意義如下(xià):
<1>設備地址:在一個(gè)485總線上可(kě)以挂接多(duō)個(gè)設備,此處的(de)設備地址表示想和(hé)哪一個(gè)設備通(tōng)訊。例子中爲想和(hé)17号(十進制的(de)17是十六進制的(de)11)通(tōng)訊。
<2>命令号01:讀取數字量的(de)命令号固定爲01。
<3>起始地址高(gāo)8位、低8位:表示想讀取的(de)開關量的(de)起始地址(起始地址爲0)。比如例子中的(de)起始地址爲19。
<4>寄存器數高(gāo)8位、低8位:表示從起始地址開始讀多(duō)少個(gè)開關量。例子中爲37個(gè)開關量。
<5>CRC校驗:是從開頭一直校驗到此之前。
設備響應:[設備地址] [命令号01] [返回的(de)字節個(gè)數][數據1][數據2]...[數據n] [CRC校驗的(de)高(gāo)8位] [CRC校驗的(de)低8位]
例:[11][01][05][CD][6B][B2][0E][1B] [CRC高(gāo)] [CRC低]
意義如下(xià):
<1>設備地址和(hé)命令号和(hé)上面的(de)相同。
<2>返回的(de)字節個(gè)數:表示數據的(de)字節個(gè)數,也(yě)就是數據1,2...n中的(de)n的(de)值。
<3>數據1...n:由于每一個(gè)數據是一個(gè)8位的(de)數,所以每一個(gè)數據表示8個(gè)開關量的(de)值,每一位爲0表示對(duì)應的(de)開關斷開,爲1表示閉合。比如例子中,表示20号(索引号爲19)開關閉合,21号斷開,22閉合,23閉合,24斷開,25斷開,26閉合,27閉合...如果詢問的(de)開關量不是8的(de)整倍數,那麽最後一個(gè)字節的(de)高(gāo)位部分(fēn)無意義,置爲0。
<4>CRC校驗同上。
2、05号命令,寫數字量(線圈狀态):
計算(suàn)機發送命令:[設備地址] [命令号05] [需下(xià)置的(de)寄存器地址高(gāo)8位] [低8位] [下(xià)置的(de)數據高(gāo)8位] [低8位] [CRC校驗的(de)低8位] [CRC校驗的(de)高(gāo)8位]
例:[11][05][00][AC][FF][00][CRC高(gāo)][CRC低]
意義如下(xià):
<1>設備地址和(hé)上面的(de)相同。
<2>命令号:寫數字量的(de)命令号固定爲05。
<3>需下(xià)置的(de)寄存器地址高(gāo)8位,低8位:表明(míng)了(le)需要下(xià)置的(de)開關的(de)地址。
<4>下(xià)置的(de)數據高(gāo)8位,低8位:表明(míng)需要下(xià)置的(de)開關量的(de)狀态。例子中爲把該開關閉合。注意,此處隻可(kě)以是[FF][00]表示閉合[00][00]表示斷開,其他(tā)數值非法。
<5>注意此命令一條隻能下(xià)置一個(gè)開關量的(de)狀态。
設備響應:如果成功把計算(suàn)機發送的(de)命令原樣返回,否則不響應。
3、03号命令,讀可(kě)讀寫模拟量寄存器(保持寄存器):
計算(suàn)機發送命令:[設備地址] [命令号03] [起始寄存器地址高(gāo)8位] [低8位] [讀取的(de)寄存器數高(gāo)8位] [低8位] [CRC校驗的(de)高(gāo)8位] [CRC校驗的(de)低8位]
例:[11][03][00][6B][00][03] [CRC高(gāo)][CRC低]
意義如下(xià):
<1>設備地址和(hé)上面的(de)相同。
<2>命令号:讀模拟量的(de)命令号固定爲03。
<3>起始地址高(gāo)8位、低8位:表示想讀取的(de)模拟量的(de)起始地址(起始地址爲0)。比如例子中的(de)起始地址爲107。
<4>寄存器數高(gāo)8位、低8位:表示從起始地址開始讀多(duō)少個(gè)模拟量。例子中爲3個(gè)模拟量。注意,在返回的(de)信息中一個(gè)模拟量需要返回兩個(gè)字節。
設備響應:[設備地址] [命令号03] [返回的(de)字節個(gè)數][數據1][數據2]...[數據n] [CRC校驗的(de)高(gāo)8位] [CRC校驗的(de)低8位]
例:[11][03][06][02][2B][00][00][00][64] [CRC高(gāo)] [CRC低]
意義如下(xià):
<1>設備地址和(hé)命令号和(hé)上面的(de)相同。
<2>返回的(de)字節個(gè)數:表示數據的(de)字節個(gè)數,也(yě)就是數據1,2...n中的(de)n的(de)值。例子中返回了(le)3個(gè)模拟量的(de)數據,因爲一個(gè)模拟量需要2個(gè)字節所以共6個(gè)字節。
<3>數據1...n:其中[數據1][數據2]分(fēn)别是第1個(gè)模拟量的(de)高(gāo)8位和(hé)低8位,[數據3][數據4]是第2個(gè)模拟量的(de)高(gāo)8位和(hé)低8位,以此類推。例子中返回的(de)值分(fēn)别是555,0,100。
<4>CRC校驗同上。
4、06号命令,寫單個(gè)模拟量寄存器(保持寄存器):
計算(suàn)機發送命令:[設備地址] [命令号06] [需下(xià)置的(de)寄存器地址高(gāo)8位] [低8位] [下(xià)置的(de)數據高(gāo)8位] [低8位] [CRC校驗的(de)高(gāo)8位] [CRC校驗的(de)低8位]
例:[11][06][00][01][00][03] [CRC高(gāo)] [CRC低]
意義如下(xià):
<1>設備地址和(hé)上面的(de)相同。
<2>命令号:寫模拟量的(de)命令号固定爲06。
<3>需下(xià)置的(de)寄存器地址高(gāo)8位,低8位:表明(míng)了(le)需要下(xià)置的(de)模拟量寄存器的(de)地址。
<4>下(xià)置的(de)數據高(gāo)8位,低8位:表明(míng)需要下(xià)置的(de)模拟量數據。比如例子中就把1号寄存器的(de)值設爲3。
<5>注意此命令一條隻能下(xià)置一個(gè)模拟量的(de)狀态。
設備響應:如果成功把計算(suàn)機發送的(de)命令原樣返回,否則不響應。
5、16号命令,寫多(duō)個(gè)模拟量寄存器(保持寄存器):
計算(suàn)機發送命令:[設備地址] [命令号16] [需下(xià)置的(de)寄存器地址高(gāo)8位] [低8位] [數據數量高(gāo)8位] [數據數量低8位] [下(xià)置的(de)數據高(gāo)8位] [低8位][……][……] [CRC校驗的(de)高(gāo)8位] [CRC校驗的(de)低8位]
例:[11][16][00][01][00][01][00][05] [CRC高(gāo)] [CRC低]
意義如下(xià):
<1>設備地址和(hé)上面的(de)相同。
<2>命令号:寫模拟量的(de)命令号固定爲16。
<3>需下(xià)置的(de)寄存器地址高(gāo)8位,低8位:表明(míng)了(le)需要下(xià)置的(de)模拟量寄存器的(de)地址。
<4>需下(xià)置的(de)數據數量高(gāo)8位,低8位:表明(míng)了(le)需要下(xià)置的(de)數據數量,這(zhè)裏爲1。
<5>下(xià)置的(de)數據高(gāo)8位,低8位:表明(míng)需要下(xià)置的(de)模拟量數據。比如例子中就把1号寄存器的(de)值設爲5。
設備響應:如果成功把計算(suàn)機返回的(de)如下(xià)命令,否則不響應。
設備響應:[設備地址] [命令号16] [需下(xià)置的(de)寄存器地址高(gāo)8位] [低8位] [數據數量高(gāo)8位] [數據數量低8位] [CRC校驗的(de)高(gāo)8位] [CRC校驗的(de)低8位],如上例返回:
[11][16][00][01][00][01] [CRC高(gāo)] [CRC低]