modbus是美國的modicon公司開發(fā)的一種報(bào)文傳輸協(xié)議,1979年該公司成為施耐德公司的一部分。modbus協(xié)議在工業(yè)控制中得到了廣泛的應(yīng)用,它已經(jīng)成為一種通用的工業(yè)標(biāo)準(zhǔn),該協(xié)議支持rs-232、rs-422、rs-485和以太網(wǎng)設(shè)備。不同廠商生產(chǎn)的控制設(shè)備通過modbus協(xié)議可以連成通信網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。許多工控產(chǎn)品,例如plc、變頻器、人機(jī)界面、dcs和自動(dòng)化儀表等,都在廣泛地使用modbus協(xié)議。
根據(jù)傳輸網(wǎng)絡(luò)類型的不同分為串行鏈路上的modbus和基于tcp/ip協(xié)議的modbus。
modbus串行鏈路協(xié)議是一個(gè)主-從協(xié)議,采用請求-響應(yīng)方式,主站發(fā)出帶有從站地址的請求報(bào)文,具有該地址的從站接收到后發(fā)出響應(yīng)報(bào)文進(jìn)行應(yīng)答。
modbus協(xié)議位于osi模型的第二層。串行總線中只有一個(gè)主站,可以有1~247個(gè)從站。modbus通信只能由主站發(fā)起,從站在沒有收到來自主站的請求時(shí),不會(huì)發(fā)送數(shù)據(jù),從站之間也不會(huì)互相通信。
2.modbus的報(bào)文傳輸模式
串行鏈路上的modbus協(xié)議有ascii和rtu(遠(yuǎn)程終端單元)這兩種報(bào)文傳輸模式,同一modbus網(wǎng)絡(luò)上所有的站都必須選擇相同的傳輸模式和串口參數(shù)。
(1)ascii模式
當(dāng)控制器設(shè)為在modbus網(wǎng)絡(luò)上以ascii(美國標(biāo)準(zhǔn)信息交換代碼)模式通信時(shí),報(bào)文幀中的每個(gè)8位字節(jié)都轉(zhuǎn)換為兩個(gè)ascii字符發(fā)送。下面是ascii模式的報(bào)文格式:
:地址 功能碼 數(shù)據(jù)字節(jié)數(shù) 數(shù)據(jù)1……數(shù)據(jù)n lrc高字節(jié) lrc低字節(jié) 回車 換行
報(bào)文中的每個(gè)ascii字符都由十六進(jìn)制字符組成,傳輸?shù)拿總€(gè)字符包含一個(gè)起始位、7個(gè)數(shù)據(jù)位、一個(gè)奇偶校驗(yàn)位和一個(gè)停止位;如果沒有校驗(yàn)位,則有兩個(gè)停止位。modbus協(xié)議需要對數(shù)據(jù)進(jìn)行校驗(yàn),串行協(xié)議中除了奇偶校驗(yàn)外,ascii模式采用縱向冗余校驗(yàn)(lrc),計(jì)算lrc時(shí)不包括開始的冒號符、lrc本身和回車換行符。
(2)rtu模式
modbus網(wǎng)絡(luò)上的rtu模式的報(bào)文以字節(jié)為單位進(jìn)行傳輸,一個(gè)字節(jié)由兩個(gè)十六進(jìn)制數(shù)組成。在同樣的波特率下,傳輸效率比ascii模式的高。
傳輸?shù)拿總€(gè)字節(jié)包含一個(gè)起始位,8個(gè)數(shù)據(jù)位(先發(fā)送最低的有效位),奇偶校驗(yàn)位、停止位與ascii模式的相同,報(bào)文最長為256字節(jié)。
modbus的rtu模式報(bào)文的最后兩個(gè)字節(jié)是循環(huán)冗余校驗(yàn)碼(crc)。其校驗(yàn)方式是將整個(gè)報(bào)文的所有字節(jié)(不包括最后兩個(gè)字節(jié))按規(guī)定的方式進(jìn)行位移并進(jìn)行xor(異或)計(jì)算。接收方在收到該字符串時(shí)按同樣的方式進(jìn)行計(jì)算,并將結(jié)果與收到的循環(huán)冗余校驗(yàn)碼進(jìn)行比較,如果一致則認(rèn)為通信正確,如果不一致,則認(rèn)為通信有誤,從站將發(fā)送crc錯(cuò)誤應(yīng)答。modbus中rtu采用crc-16的冗余校驗(yàn)方式。
下圖是modbus rtu通信幀的基本結(jié)構(gòu),從站地址為0~247,它和功能碼均占一個(gè)字節(jié),命令幀中plc地址區(qū)的起始地址和crc各占一個(gè)字,數(shù)據(jù)以字或字節(jié)為單位(與功能碼有關(guān)),以字為單位時(shí)高字節(jié)在前,低字節(jié)在后。但是crc的低字節(jié)在前,高字節(jié)在后。
地址 功能碼 數(shù)據(jù)1……數(shù)據(jù)n crc高字節(jié) crc低字節(jié)
modbus包括多種功能,每一功能都有相應(yīng)的功能代碼。最基本的功能主要包括ai/ao、di/do數(shù)據(jù)的傳送。
modbus除了定義通信功能碼外,同時(shí)還定義了出錯(cuò)碼,這有助于通信主站發(fā)現(xiàn)通信的錯(cuò)誤內(nèi)容和原因,并采取相應(yīng)措施,從而保證了通信的可靠進(jìn)行。
modbus定義的出錯(cuò)信息為:指定的地址錯(cuò)誤、指定的數(shù)據(jù)量出錯(cuò)、從站自身的錯(cuò)誤、無法應(yīng)答請求或執(zhí)行要求指令、從站無暇處理主站發(fā)送的通信請求指令等。錯(cuò)誤信息對應(yīng)錯(cuò)誤代碼。主站在接收到錯(cuò)誤碼后,根據(jù)錯(cuò)誤的原因采取相應(yīng)措施。例如改變數(shù)據(jù)地址、加大發(fā)送間隔和重發(fā)等。