Modbus是一種串行通信協(xié)議,由于其協(xié)議簡單易用,且沒有版權(quán)要求,目前已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的實施標(biāo)準(zhǔn)。Modbus協(xié)議由Modicon公司在1979年提出,目標(biāo)是為使用可編程邏輯控制器(PLC)通信。Modicon后來被施耐德電氣Schneider Electric收購,Modbus 協(xié)議現(xiàn)在也成為 工業(yè)電子設(shè)備之間常用的連接方式。
即總線協(xié)議。比如串口協(xié)議、IIC協(xié)議、SPI都是通信協(xié)議。你接觸到這種協(xié)議,相信你所處的行業(yè)是工業(yè)方面或者你的產(chǎn)品用于工業(yè)。
總體來說,Modbus協(xié)議被工業(yè)領(lǐng)域接受主要的原因如下:
公開發(fā)表并且無版權(quán)要求
易于部署和維護
對供應(yīng)商來說,修改移動本地的比特或字節(jié)沒有很多限制。
簡單來說,免費+簡單+方便修改!
Modbus協(xié)議類型
Modbus協(xié)議屬于應(yīng)用層的報文傳輸協(xié)議,Modbus目前有兩個主要版本 Modbus串口,Modbus TCP/IP,Modbus 串口又有兩個變種:Modbus RTU是一種緊湊的,采用二進(jìn)制表示數(shù)據(jù)的方式,Modbus ASCII是一種人類可讀的,冗長的表示方式。三者的協(xié)議并不相同,但有類似的地方,所以說Modbus協(xié)議時,最好說這三種類型中的一種。
ModBus協(xié)議內(nèi)容介紹
設(shè)備必須要有RTU協(xié)議!這是Modbus協(xié)議上規(guī)定的,且默認(rèn)模式必須是RTU,ASCII作為選項。所有設(shè)備都有RTU協(xié)議,ASCII協(xié)議很少,Modbus協(xié)議,只需要了解RTU協(xié)議,ASCII作為學(xué)習(xí)的了解就足夠了。
ModBus協(xié)議最基本的通信單位是幀,整個ModBus幀又被稱之為應(yīng)用數(shù)據(jù)單元(ADU),ADU中又包含了協(xié)議數(shù)據(jù)單元(PDU)用于傳真正需要傳輸?shù)臄?shù)據(jù)。Modbus協(xié)議幀從上圖可以看出:
幀結(jié)構(gòu) = 地址域 + 功能碼 + 數(shù)據(jù) + 差錯校驗
地址域: 占用一個字節(jié),范圍0-255,其中有效范圍是1-247,其他有特殊用途,比如255是廣播地址(廣播地址就是應(yīng)答所有地址,正常地需要兩個設(shè)備的地址一樣才能進(jìn)行查詢和回復(fù))。每個終端設(shè)備的地址是唯一的,如果查詢某個終端設(shè)備,必須包含該設(shè)備的地址。終端回應(yīng)也會包含該地址,通過該地址,主機知道哪個終端在與自己進(jìn)行通信。
功能碼: 常用的功能碼有01、05、03、06、16。一般占用一個字節(jié),功能碼的意義就是,知道這個指令是干啥的,比如你可以查詢從機的數(shù)據(jù),也可以修改數(shù)據(jù),所以不同功能碼對應(yīng)不同功能。常用的功能碼是03和06。
數(shù)據(jù): 通信的主要內(nèi)容,可能是數(shù)值、參考地址或者極限值??赡苁墙K端執(zhí)行特定功能所需要的數(shù)據(jù)或者終端響應(yīng)查詢時采集到的數(shù)據(jù),根據(jù)功能碼不同,有不同結(jié)構(gòu)。
差錯校驗: 為了保證數(shù)據(jù)不錯誤,增加這個,然后把前面的數(shù)據(jù)進(jìn)行計算看數(shù)據(jù)是否一致,如果一致,就說明這個數(shù)據(jù)是正確的,我再回復(fù);如果不一樣,說明你這個數(shù)據(jù)在傳輸?shù)臅r候出了問題,數(shù)據(jù)不對的,所以就拋棄了。有時,由于電噪聲和其它干擾,一組數(shù)據(jù)在從一個設(shè)備傳輸?shù)搅硪粋€設(shè)備時在線路上可能會發(fā)生一些改變,出錯校驗?zāi)軌虮WC主機或者終端不去響應(yīng)那些傳輸過程中發(fā)生了改變的數(shù)據(jù),這就提高了系統(tǒng)的安全性和效率,出錯校驗使用了16位循環(huán)冗余的方法。
ModBus協(xié)議傳輸和應(yīng)答架構(gòu)
Modbus協(xié)議
Modbus協(xié)議是一個主/從架構(gòu)的協(xié)議。在同一個Modbus網(wǎng)絡(luò)中同一時刻只有一個節(jié)點是主(master)節(jié)點,其他使用Modbus協(xié)議參與通信的節(jié)點是從(slave)節(jié)點,從節(jié)點的最大編號為247。每一個slave設(shè)備都有一個唯一的地址。
在串行網(wǎng)絡(luò)中,通訊總是由主節(jié)點發(fā)起 ,子節(jié)點在沒有收到主節(jié)點請求時不會發(fā)送數(shù)據(jù)。各個子節(jié)點之間不會直接相互通信。
在以太網(wǎng),任何一個設(shè)備都能發(fā)送一個Modbus命令,通常啟動指令是某個主節(jié)點,子節(jié)點會進(jìn)行應(yīng)答、在同一個時刻,主節(jié)點只會發(fā)起一個Modbus事務(wù)處理。什么是事務(wù)處理呢?其實就是一次網(wǎng)絡(luò)上完整的應(yīng)答通訊。主要包含兩種形式,1 單播模式 , 2 廣播模式。
所謂單播模式就是主節(jié)點給某個指定的節(jié)點發(fā)送消息(通過ADU中的地址域指定),從節(jié)點收到并處理完請求后,從節(jié)點向主節(jié)點返回一個應(yīng)答報文,在這種模式下,一個Modbus事務(wù)包含兩個報文,一個來自主節(jié)點的請求,一個來自子節(jié)點的應(yīng)答。
Modbus協(xié)議單播模式
所謂廣播模式,是主節(jié)點向所有的子節(jié)點發(fā)送請求,當(dāng)主節(jié)點發(fā)送的請求報文的地址域值為0時,代表廣播請求,所有的從節(jié)點都需要接受處理,但不需要向主節(jié)點返回報文。
Modbus協(xié)議廣播模式
其實在物理層所有設(shè)備都會收到所有的請求,但地址域不為0時,從機判斷當(dāng)前為單播模式,只有地址域和自身地址號相同的從機才會響應(yīng)請求,當(dāng)?shù)刂酚驗?時,從機判斷為廣播消息,所有的從機都會執(zhí)行指令,所有收到指令的設(shè)備都會運行,只不過不回應(yīng)指令。