概述
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是一種單主站的主從通信模式职抡,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)取決于使用的功能代碼猬错,幀的最后傳送的是校驗窗看。
由發(fā)送設(shè)備將 Modbus 報文構(gòu)造為帶有已知起始和結(jié)束標(biāo)記的幀。這使設(shè)備可以在報文的開始接收新幀倦炒,并且知道何時報文結(jié)束显沈。不完整的報文必須能夠被檢測到而錯誤標(biāo)志必須作為結(jié)果被設(shè)置。 在 RTU 模式逢唤,報文幀由時長至少為3.5個字符時間的空閑間隔區(qū)分拉讯。在后續(xù)的部分,這個時間區(qū)間被稱作t3.5鳖藕。
整個報文幀必須以連續(xù)的字符流發(fā)送芒划。 如果兩個字符之間的空閑間隔大于 1.5 個字符時間阎姥,則報文幀被認(rèn)為不完整應(yīng)該被接收節(jié)點丟棄芦劣。
地址碼
地址碼為通訊傳送的第一個字節(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ù)沒有安全性捂贿。