019 Modbus【協(xié)議】

概述

Modbus協(xié)議最初由Modicon公司開發(fā)出來褥紫,在1979年末該公司成為施耐德自動化部門的一部分封救,現(xiàn)在Modbus已經(jīng)是工業(yè)領(lǐng)域全球最流行的協(xié)議材彪。協(xié)議支持傳統(tǒng)的RS-232酱畅、RS-422弄喘、RS-485和以太網(wǎng)設(shè)備。許多工業(yè)設(shè)備贡蓖,包括PLC祟剔,DCS,智能儀表等都在使用Modbus協(xié)議作為他們之間的通訊標(biāo)準(zhǔn)摩梧。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò)宣旱,進(jìn)行集中監(jiān)控仅父。

Modbus有ASCII、RTU和TCP三種,其中TCP和RTU協(xié)議非常類似笙纤,只要把RTU協(xié)議的兩個字節(jié)的校驗碼去掉耗溜,然后在RTU協(xié)議的開始加上5個0和一個6并通過TCP/IP網(wǎng)絡(luò)協(xié)議發(fā)送出去即可。所以僅介紹一下Modbus的ASCII和RTU協(xié)議省容。

ASCII模式:控制器設(shè)為在Modbus網(wǎng)絡(luò)上以ASCII(美國標(biāo)準(zhǔn)信息交換代碼)模式通信抖拴,在消息中的每字節(jié)都作為兩個ASCII字符傳輸。主要優(yōu)點是字符發(fā)送的時間間隔可達(dá)到1秒而不產(chǎn)生錯誤腥椒。

RTU模式:控制器設(shè)為在Modbus網(wǎng)絡(luò)上以RTU(遠(yuǎn)程終端單元)模式通信阿宅,在消息中的每字節(jié)按原值處理。主要優(yōu)點是相對于ASCII笼蛛,表達(dá)相同的信息需要較少的位數(shù)洒放,且在相同通訊速率下具有更大的數(shù)據(jù)流量。因此通常情況下滨砍,一般工業(yè)智能儀器都采用RTU模式往湿。

ASCII協(xié)議和RTU協(xié)議相比擁有開始和結(jié)束標(biāo)記,因此在進(jìn)行程序處理時能更加方便惋戏,而且由于傳輸?shù)亩际强梢姷腁SCII字符领追,所以進(jìn)行調(diào)試時就更加的直觀,另外它的LRC校驗也比較容易响逢。但是因為它傳輸?shù)亩际强梢姷腁SCII字符绒窑,RTU傳輸?shù)臄?shù)據(jù)每一個字節(jié)ASCII都要用兩個字節(jié)來傳輸,比如RTU傳輸一個十六進(jìn)制數(shù)0xF9,ASCII就需要傳輸’F’’9’的ASCII碼0x39和0x46兩個字節(jié)龄句,這樣它的傳輸?shù)男示捅容^低回论。所以一般來說,如果所需要傳輸?shù)臄?shù)據(jù)量較小可以考慮使用ASCII協(xié)議分歇,如果所需傳輸?shù)臄?shù)據(jù)量比較大傀蓉,最好能使用RTU協(xié)議。

Modbus事務(wù)處理(無差錯)
Modbus事務(wù)處理(異常響應(yīng))

Modbus是一種單主站的主從通信模式职抡,Modbus網(wǎng)絡(luò)上只能有一個主站存在葬燎,主站在Modbus網(wǎng)絡(luò)上沒有地址,每個從站必須有唯一的地址缚甩,從站的地址范圍為0 - 247谱净,其中0為廣播地址(Modbus 從站地址為 0 時會向所有從站發(fā)送廣播幀,從站均不響應(yīng))擅威,從站的實際地址范圍為1 - 247壕探。Modbus RTU 使用主/從站網(wǎng)絡(luò),其中整個通信僅由一個主站設(shè)備觸發(fā)郊丛,而從站只能響應(yīng)主站的請求李请。主站將請求發(fā)送到一個從站地址瞧筛,并且只有該地址上的從站做出響應(yīng)。

傳輸方式

目前导盅,Modbus可以通過下列三種通信方式實現(xiàn):

1.以太網(wǎng)方式:對應(yīng)的傳輸模式是MODBUS TCP较幌,通訊介質(zhì)包括5類/6類網(wǎng)線或光纖等;

2.異步串行口方式:對應(yīng)的傳輸模式是MODBUS RTU白翻、ASCII乍炉,各種通訊介質(zhì)包括有線的

RS-232/422/485、光纖滤馍、無線等岛琼;

3.高速令牌傳遞方式:對應(yīng)的傳輸模式是Modbus PLUS,通訊介質(zhì)包括雙絞線纪蜒、同軸電纜等衷恭。

幀介紹

數(shù)據(jù)傳送幀結(jié)構(gòu)順序是,主站和從站/從站和主站之間的數(shù)據(jù)通信從從站地址開始纯续,接下來是功能代碼随珠, 隨后傳輸數(shù)據(jù),數(shù)據(jù)字段的結(jié)構(gòu)取決于使用的功能代碼猬错,幀的最后傳送的是校驗窗看。

通用Modbus幀

由發(fā)送設(shè)備將 Modbus 報文構(gòu)造為帶有已知起始和結(jié)束標(biāo)記的幀。這使設(shè)備可以在報文的開始接收新幀倦炒,并且知道何時報文結(jié)束显沈。不完整的報文必須能夠被檢測到而錯誤標(biāo)志必須作為結(jié)果被設(shè)置。 在 RTU 模式逢唤,報文幀由時長至少為3.5個字符時間的空閑間隔區(qū)分拉讯。在后續(xù)的部分,這個時間區(qū)間被稱作t3.5鳖藕。

RTU幀

整個報文幀必須以連續(xù)的字符流發(fā)送芒划。 如果兩個字符之間的空閑間隔大于 1.5 個字符時間阎姥,則報文幀被認(rèn)為不完整應(yīng)該被接收節(jié)點丟棄芦劣。

ASCII幀

地址碼

地址碼為通訊傳送的第一個字節(jié)箫荡。這個字節(jié)表明由用戶設(shè)定地址碼的從機(jī)將接收由主機(jī)發(fā)送來的信息。并且每個從機(jī)都有具有唯一的地址碼喉誊,并且響應(yīng)回送均以各自的地址碼開始邀摆。主機(jī)發(fā)送的地址碼表明將發(fā)送到的從機(jī)地址,而從機(jī)發(fā)送的地址碼表明回送的從機(jī)地址伍茄。

功能碼

通訊傳送的第二個字節(jié)栋盹。ModBus通訊規(guī)約定義功能號為1到127(128-255 為 異常響應(yīng)保留)。只利用其中的一部分功能碼敷矫。作為主機(jī)請求發(fā)送贞盯,通過功能碼告訴從機(jī)執(zhí)行什么動作音念。作為從機(jī)響應(yīng),從機(jī)發(fā)送的功能碼與從主機(jī)發(fā)送來的功能碼一樣躏敢,并表明從機(jī)已響應(yīng)主機(jī)進(jìn)行操作。如果從機(jī)發(fā)送的功能碼的最高位為1(比如功能碼大與此同時127)整葡,則表明從機(jī)沒有響應(yīng)操作或發(fā)送出錯件余。

功能碼中較長使用的是1、2遭居、3啼器、4、5俱萍、6號功能碼端壳,使用它們即可實現(xiàn)對下位機(jī)的數(shù)字量和模擬量的讀寫操作。

01讀可讀寫數(shù)字量寄存器(線圈狀態(tài)):

發(fā)送命令:

[設(shè)備地址] [命令號01] [起始寄存器地址高8位] [低8位] [讀取的寄存器數(shù)高8位] [低8位] [CRC校驗的低8位] [CRC校驗的高8位]

例:[11][01][00][13][00][25][CRC低][CRC高]

意義如下:

<1>設(shè)備地址:在一個485總線上可以掛接多個設(shè)備枪蘑,此處的設(shè)備地址表示想和哪一個設(shè)備通訊损谦。例子中為想和17號(十進(jìn)制的17是十六進(jìn)制的11)通訊。

<2>命令號01:讀取數(shù)字量的命令號固定為01岳颇。

<3>起始地址高8位照捡、低8位:表示想讀取的開關(guān)量的起始地址(起始地址為0)。比如例子中的起始地址為19话侧。

<4>寄存器數(shù)高8位栗精、低8位:表示從起始地址開始讀多少個開關(guān)量。例子中為37個開關(guān)量瞻鹏。

<5>CRC校驗:是從開頭一直校驗到此之前悲立。在此協(xié)議的最后再作介紹。此處需要注意新博,CRC校驗在命令中的高低字節(jié)的順序和其他的相反薪夕。

設(shè)備響應(yīng):

[設(shè)備地址] [命令號01] [返回的字節(jié)個數(shù)][數(shù)據(jù)1][數(shù)據(jù)2]...[數(shù)據(jù)n][CRC校驗的低8位] [CRC校驗的高8位]

例:[11][01][05][CD][6B][B2][0E][1B][CRC低][CRC高]

意義如下:

<1>設(shè)備地址和命令號和上面的相同。

<2>返回的字節(jié)個數(shù):表示數(shù)據(jù)的字節(jié)個數(shù)叭披,也就是數(shù)據(jù)1寥殖,2...n中的n的值。

<3>數(shù)據(jù)1...n:由于每一個數(shù)據(jù)是一個8位的數(shù)涩蜘,所以每一個數(shù)據(jù)表示8個開關(guān)量的值嚼贡,每一位為0表示對應(yīng)的開關(guān)斷開,為1表示閉合同诫。比如例子中粤策,表示20號(索引號為19)開關(guān)閉合,21號斷開误窖,22閉合叮盘,23閉合秩贰,24斷開,25斷開柔吼,26閉合毒费,27閉合...如果詢問的開關(guān)量不是8的整倍數(shù),那么最后一個字節(jié)的高位部分無意義愈魏,置為0觅玻。

<4>CRC校驗同上。

02讀只可讀數(shù)字量寄存器(輸入狀態(tài)):

和讀取線圈狀態(tài)類似培漏,只是第二個字節(jié)的命令號不再是1而是2溪厘。

03讀可讀寫模擬量寄存器(保持寄存器):

發(fā)送命令:

[設(shè)備地址] [命令號03] [起始寄存器地址高8位] [低8位] [讀取的寄存器數(shù)高8位] [低8位] [CRC校驗的低8位] [CRC校驗的高8位]

例:[11][03][00][6B][00][03][CRC低][CRC高]

意義如下:

<1>設(shè)備地址和上面的相同。

<2>命令號:讀模擬量的命令號固定為03牌柄。

<3>起始地址高8位畸悬、低8位:表示想讀取的模擬量的起始地址(起始地址為0)。比如例子中的起始地址為107珊佣。

<4>寄存器數(shù)高8位蹋宦、低8位:表示從起始地址開始讀多少個模擬量。例子中為3個模擬量彩扔。注意妆档,在返回的信息中一個模擬量需要返回兩個字節(jié)。

設(shè)備響應(yīng):

[設(shè)備地址] [命令號03] [返回的字節(jié)個數(shù)][數(shù)據(jù)1][數(shù)據(jù)2]...[數(shù)據(jù)n][CRC校驗的低8位] [CRC校驗的高8位]

例:[11][03][06][02][2B][00][00][00][64][CRC低][CRC高]

意義如下:

<1>設(shè)備地址和命令號和上面的相同虫碉。

<2>返回的字節(jié)個數(shù):表示數(shù)據(jù)的字節(jié)個數(shù)贾惦,也就是數(shù)據(jù)1,2...n中的n的值敦捧。例子中返回了3個模擬量的數(shù)據(jù)须板,因為一個模擬量需要2個字節(jié)所以共6個字節(jié)。

<3>數(shù)據(jù)1...n:其中[數(shù)據(jù)1][數(shù)據(jù)2]分別是第1個模擬量的高8位和低8位兢卵,[數(shù)據(jù)3][數(shù)據(jù)4]是第2個模擬量的高8位和低8位习瑰,以此類推。例子中返回的值分別是555秽荤,0甜奄,100。

<4>CRC校驗同上窃款。

04讀只可讀模擬量寄存器(輸入寄存器):

和讀取保存寄存器類似课兄,只是第二個字節(jié)的命令號不再是3而是4。

05寫數(shù)字量(線圈狀態(tài)):

發(fā)送命令:

[設(shè)備地址] [命令號05] [需下置的寄存器地址高8位] [低8位] [下置的數(shù)據(jù)高8位] [低8位] [CRC校驗的低8位] [CRC校驗的高8位]

例:[11][05][00][AC][FF][00][CRC低][CRC高]

意義如下:

<1>設(shè)備地址和上面的相同晨继。

<2>命令號:寫數(shù)字量的命令號固定為05烟阐。

<3>需下置的寄存器地址高8位,低8位:表明了需要下置的開關(guān)的地址。

<4>下置的數(shù)據(jù)高8位蜒茄,低8位:表明需要下置的開關(guān)量的狀態(tài)唉擂。例子中為把該開關(guān)閉合。注意檀葛,此處只可以是[FF][00]表示閉合[00][00]表示斷開玩祟,其他數(shù)值非法。

<5>注意此命令一條只能下置一個開關(guān)量的狀態(tài)屿聋。

設(shè)備響應(yīng):

如果成功把計算機(jī)發(fā)送的命令原樣返回卵凑,否則不響應(yīng)。

06寫單個模擬量寄存器(保持寄存器):

發(fā)送命令:

[設(shè)備地址] [命令號06] [需下置的寄存器地址高8位] [低8位] [下置的數(shù)據(jù)高8位] [低8位] [CRC校驗的低8位] [CRC校驗的高8位]

例:[11][06][00][01][00][03][CRC低][CRC高]

意義如下:

<1>設(shè)備地址和上面的相同胜臊。

<2>命令號:寫模擬量的命令號固定為06。

<3>需下置的寄存器地址高8位伙判,低8位:表明了需要下置的模擬量寄存器的地址象对。

<4>下置的數(shù)據(jù)高8位,低8位:表明需要下置的模擬量數(shù)據(jù)宴抚。比如例子中就把1號寄存器的值設(shè)為3勒魔。

<5>注意此命令一條只能下置一個模擬量的狀態(tài)。

設(shè)備響應(yīng)

如果成功把計算機(jī)發(fā)送的命令原樣返回菇曲,否則不響應(yīng)冠绢。?


數(shù)據(jù)區(qū)

數(shù)據(jù)區(qū)是根據(jù)不同的功能碼而不同。數(shù)據(jù)區(qū)可以是實際數(shù)值常潮、設(shè)置點弟胀、主機(jī)發(fā)送給從機(jī)或從機(jī)發(fā)送給主機(jī)的地址。

LRC校驗

LRC域是一個包含一個8位二進(jìn)制值的字節(jié)喊式。LRC值由傳輸設(shè)備來計算并放到消息中孵户,接收設(shè)備在接收消息的過程中計算LRC,并將它和接收到消息中LRC域中的值比較岔留,如果兩值不等夏哭,說明有錯誤。

LRC校驗比較簡單献联,它在ASCII協(xié)議中使用竖配,檢測了消息域中除開始的冒號及結(jié)束的回車換行號外的內(nèi)容。它僅僅是把每一個需要傳輸?shù)臄?shù)據(jù)按字節(jié)疊加后取反加1即可里逆。

如:30 31 30 33 30 31 32 31

首先30H+31H+30H+33H+30H+31H+32H+31H=188H进胯,然后化為2進(jìn)制,得0001 1000 1000运悲,取反得1110 0111 0111龄减,最后加1得1110 0111 1000,化為16進(jìn)制班眯,得0E78希停。

其完整消息幀應(yīng)為:3A 30 31 30 33 30 31 32 31 0E 78 0D烁巫。

CRC校驗

CRC域是兩個字節(jié),包含一16位的二進(jìn)制值宠能。它由傳輸設(shè)備計算后加入到消息中亚隙。接收設(shè)備重新計算收到消息的CRC,并與接收到的CRC域中的值比較违崇,如果兩值不同阿弃,則有誤。

CRC是先調(diào)入一值是全“1”的16位寄存器羞延,然后調(diào)用一過程將消息中連續(xù)的8位字節(jié)各當(dāng)前寄存器中的值進(jìn)行處理渣淳。僅每個字符中的8Bit數(shù)據(jù)對CRC有效,起始位和停止位以及奇偶校驗位均無效伴箩。

CRC產(chǎn)生過程中入愧,每個8位字符都單獨和寄存器內(nèi)容相或(OR),結(jié)果向最低有效位方向移動嗤谚,最高有效位以0填充棺蛛。LSB被提取出來檢測,如果LSB為1巩步,寄存器單獨和預(yù)置的值或一下旁赊,如果LSB為0,則不進(jìn)行椅野。整個過程要重復(fù)8次终畅。在最后一位(第8位)完成后,下一個8位字節(jié)又單獨和寄存器的當(dāng)前值相或鳄橘。最終寄存器中的值声离,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。

計算CRC值:http://www.ip33.com/crc.html

優(yōu)勢

modbus通訊協(xié)議是一種工業(yè)自動化總線通信協(xié)議瘫怜,其標(biāo)準(zhǔn)术徊、開發(fā)和免費(fèi)等特點,支持?jǐn)?shù)千種工業(yè)智能儀器儀表廠家數(shù)據(jù)通信鲸湃,同時支持多種通信接口RS232赠涮、RS85、TTL暗挑、光纖和無線等方式笋除,協(xié)議公開、格式通俗易懂炸裆,廣泛應(yīng)用于多種工業(yè)自動化領(lǐng)域垃它,作為該領(lǐng)域的無線通信設(shè)備廠家——為那…通信的WCTU設(shè)備,不僅兼容Modbus通訊協(xié)議,并且可以實現(xiàn)多種自主加密方式.支持多種串口通信方式国拇,并集成多路模擬量采集AD接口和IO控制接口洛史,監(jiān)護(hù)前端PLC+DTU功能,實現(xiàn)一體化酱吝,節(jié)約成本也殖,靈活多用。

不足

Modbus是在1970年末為可編程邏輯控制器通信開發(fā)的务热,這些有限的數(shù)據(jù)類型在那個時代是可以被PLC理解的忆嗜,大型二進(jìn)制對象數(shù)據(jù)是不支持的。

對節(jié)點而言崎岂,沒有一個標(biāo)準(zhǔn)的方法找到數(shù)據(jù)對象的描述信息捆毫,舉個例子,確定一個寄存器數(shù)據(jù)是否表示一個介于30-175度之間的溫度冲甘。

由于Modbus是一個主/從協(xié)議冻璃,沒有辦法要求設(shè)備“報告異常”(構(gòu)建在以太網(wǎng)的TCP/IP協(xié)議之上损合,被稱為open-mbus除外)- 主節(jié)點必須循環(huán)的詢問每個節(jié)點設(shè)備,并查找數(shù)據(jù)中的變化娘纷。在帶寬可能比較寶貴的應(yīng)用中嫁审,這種方式在應(yīng)用中消耗帶寬和網(wǎng)絡(luò)時間,例如在低速率的無線鏈路上赖晶。

Modbus在一個數(shù)據(jù)鏈路上只能處理247個地址律适,這種情況限制了可以連接到主控站點的設(shè)備數(shù)量(以太網(wǎng)TCP/IP除外)

Modbus傳輸在遠(yuǎn)端通訊設(shè)備之間緩沖數(shù)據(jù)的方式進(jìn)行,有對通信一定是連續(xù)的限制遏插,避免了傳輸中的緩沖區(qū)漏洞的問題

Modbus協(xié)議自身提供針對未經(jīng)授權(quán)的命令或截取數(shù)據(jù)沒有安全性捂贿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胳嘲,隨后出現(xiàn)的幾起案子厂僧,更是在濱河造成了極大的恐慌,老刑警劉巖了牛,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颜屠,死亡現(xiàn)場離奇詭異,居然都是意外死亡鹰祸,警方通過查閱死者的電腦和手機(jī)甫窟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛙婴,“玉大人粗井,你說我怎么就攤上這事。” “怎么了浇衬?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵懒构,是天一觀的道長。 經(jīng)常有香客問我径玖,道長痴脾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任梳星,我火速辦了婚禮赞赖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冤灾。我一直安慰自己前域,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布韵吨。 她就那樣靜靜地躺著匿垄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪归粉。 梳的紋絲不亂的頭發(fā)上椿疗,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音糠悼,去河邊找鬼届榄。 笑死,一個胖子當(dāng)著我的面吹牛倔喂,可吹牛的內(nèi)容都是我干的铝条。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼席噩,長吁一口氣:“原來是場噩夢啊……” “哼班缰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悼枢,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤埠忘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后馒索,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體给梅,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年双揪,在試婚紗的時候發(fā)現(xiàn)自己被綠了动羽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡渔期,死狀恐怖运吓,靈堂內(nèi)的尸體忽然破棺而出渴邦,到底是詐尸還是另有隱情,我是刑警寧澤拘哨,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布谋梭,位于F島的核電站,受9級特大地震影響倦青,放射性物質(zhì)發(fā)生泄漏瓮床。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一产镐、第九天 我趴在偏房一處隱蔽的房頂上張望隘庄。 院中可真熱鬧,春花似錦癣亚、人聲如沸丑掺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽街州。三九已至,卻和暖如春玻孟,著一層夾襖步出監(jiān)牢的瞬間唆缴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工黍翎, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留琐谤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓玩敏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親质礼。 傳聞我的和親對象是個殘疾皇子旺聚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348