首頁 - 關于我們 - 新聞活動 - Modbus通(tōng)訊協議(yì)原來(lái)是這(zhè)麽回事!看完秒懂(dǒng)了(le)

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)。

image.png 

Modbus協議(yì)包括ASCIIRTUTCP等,并沒有規定物(wù)理(lǐ)層。此協議(yì)定義了(le)控制器能夠認識和(hé)使用(yòng)的(de)消息結構,而不管它們是經過何種網絡進行通(tōng)信的(de)。标準的(de)Modicon控制器使用(yòng)RS232C實現串行的(de)ModbusModbus的(de)ASCIIRTU協議(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)16CRC校驗,但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)ASCIIRTU和(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 字節

錯誤校檢 = 16CRC

結束結構 = ≥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)訊規約定義功能号爲1127。本儀表隻利用(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ū) 錯誤校驗碼

88N × 816

地址碼:地址碼是信息幀的(de)第一字節(8),從0255。這(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)參數寫入擴展存儲文件,或修改之

2264

保留作擴展功能備用(yòng)


6572

保留以備用(yòng)戶功能所用(yòng)

留作用(yòng)戶功能的(de)擴展編碼

73119

非法功能


120127

保留

留作内部作用(yòng)

128255

保留

用(yòng)于異常應答(dá)

 

4

功能碼命令詳解:

在這(zhè)些功能碼中較長(cháng)使用(yòng)的(de)是123456号功能碼,使用(yòng)它們即可(kě)實現對(duì)下(xià)位機的(de)數字量和(hé)模拟量的(de)讀寫操作。

101号命令,讀可(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ě)就是數據12...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校驗同上。

205号命令,寫數字量(線圈狀态):

計算(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)命令原樣返回,否則不響應。

303号命令,讀可(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ě)就是數據12...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)别是5550100

<4>CRC校驗同上。

406号命令,寫單個(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)命令原樣返回,否則不響應。

516号命令,寫多(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]