在介紹Modbus RTU數(shù)據(jù)幀格式之前,首先讓我們先了解一下Modbus的通訊模式。
Modbus通訊模式
Modbus協(xié)議是典型的主-從通訊結(jié)構(gòu),鏈路中只能有一臺(tái)主設(shè)備,可以有多臺(tái)從設(shè)備。主設(shè)備向從設(shè)備發(fā)送請(qǐng)求指令,從設(shè)備對(duì)該指令進(jìn)行響應(yīng)。從設(shè)備不能主動(dòng)向主設(shè)備發(fā)送指令,并且從設(shè)備之間也不能進(jìn)行通信。
Modbus協(xié)議通過(guò)這些請(qǐng)求、響應(yīng)指令,實(shí)現(xiàn)了主設(shè)備對(duì)從設(shè)備中數(shù)字量或模擬量數(shù)據(jù)的訪問(wèn)和控制。通常,主設(shè)備是人機(jī)界面、監(jiān)控或數(shù)據(jù)采集系統(tǒng),從設(shè)備是傳感器、可編程自動(dòng)化控制器、智能儀器儀表等。
Modbus數(shù)據(jù)幀格式
知道了Modbus是典型的主-從式通訊方式后,我們?cè)賮?lái)看Modbus RTU數(shù)據(jù)幀格式。Modbus RTU數(shù)據(jù)幀由四部分組成,設(shè)備地址,功能碼,數(shù)據(jù)和校驗(yàn)。
設(shè)備地址占1個(gè)字節(jié),范圍是0~255之間。0是廣播地址,1~247是從站設(shè)備地址,248~255保留不用。
功能碼占1個(gè)字節(jié),由協(xié)議明確規(guī)定,表中列出了一些常用的功能碼。譬如03功能碼是讀保持寄存器,16功能碼是寫(xiě)多個(gè)寄存器。
數(shù)據(jù)部分0~252字節(jié),其長(zhǎng)度和內(nèi)容由功能碼決定。功能碼不同,數(shù)據(jù)部分的定義不盡相同。
校驗(yàn)2個(gè)字節(jié),由發(fā)送設(shè)備計(jì)算,將校驗(yàn)碼之前的數(shù)據(jù)按照CRC16算法進(jìn)行計(jì)算,生成2個(gè)字節(jié)的數(shù)據(jù),放置于發(fā)送信息的尾部。接受信息的設(shè)備再重新計(jì)算接收到的信息的CRC碼,比較計(jì)算得到的CRC碼是否與接收到的相符,如果不相符,則表明數(shù)據(jù)在傳輸過(guò)程中出錯(cuò)。通過(guò)數(shù)據(jù)校驗(yàn)增加了系統(tǒng)的安全與效率。
常用功能碼數(shù)據(jù)幀格式
1) 功能碼-0x04(讀輸入寄存器)
舉例:讀取2號(hào)站,30008~30009 2個(gè)輸入寄存器的數(shù)值。
Modbus RTU主站設(shè)備請(qǐng)求幀格式:
2號(hào)站設(shè)備響應(yīng)幀格式:
2) 功能碼-0x10(寫(xiě)多個(gè)寄存器)
舉例:向2號(hào)站,40002~40003 2個(gè)保持寄存器分別寫(xiě)入0x000A,0x0102數(shù)值
Modbus RTU主站設(shè)備請(qǐng)求幀格式:
2號(hào)站設(shè)備響應(yīng)幀格式:
3) 功能碼-0x02(讀離散量輸入)
舉例:讀取2號(hào)站,10197~10218 22個(gè)離散量的狀態(tài)。
Modbus RTU主站設(shè)備請(qǐng)求幀格式:
2號(hào)站設(shè)備響應(yīng)幀格式:
數(shù)據(jù)傳輸模式
通過(guò)前面的介紹,可以看到Modbus RTU協(xié)議數(shù)據(jù)幀是沒(méi)有起始符和結(jié)束符,所以兩個(gè)數(shù)據(jù)幀之間需要靠時(shí)間間隔來(lái)區(qū)分。協(xié)議中規(guī)定信息幀發(fā)送至少要有3.5個(gè)字符時(shí)間的停頓間隔。即在一個(gè)數(shù)據(jù)幀的最后一個(gè)字符傳輸完成之后,需要至少3.5個(gè)字符時(shí)間的停頓標(biāo)定數(shù)據(jù)幀的結(jié)束,一個(gè)新的數(shù)據(jù)幀可在此停頓之后開(kāi)始。如果一個(gè)新消息在小于3.5個(gè)字符時(shí)間內(nèi)接著前個(gè)消息開(kāi)始,接受的設(shè)備將認(rèn)為它是前一數(shù)據(jù)幀的延續(xù),這將導(dǎo)致CRC校驗(yàn)出錯(cuò)。同時(shí)整個(gè)數(shù)據(jù)幀必須作為一連續(xù)的流傳輸。如果在幀完成之前有超過(guò)1.5字符時(shí)間的停頓時(shí)間,接受設(shè)備將刷新不完整的數(shù)據(jù)幀從而認(rèn)為存在丟包現(xiàn)象。
那么一個(gè)字符是什么呢,他由1個(gè)bit起始位,8bit數(shù)據(jù)位,1個(gè)bit奇偶校驗(yàn)位,1個(gè)bit停止位組成,在發(fā)送時(shí)從起始位開(kāi)始。
謝謝您看到這里
您距離成為工業(yè)通信大神更近了一步~