Modbus協(xié)議概述
Modbus協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其他設(shè)備之間可以通信。它已經(jīng)成為一種通用工業(yè)標(biāo)準(zhǔn)。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中控制。
此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)并使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的,它描述了控制器請(qǐng)求訪問(wèn)其他設(shè)備的過(guò)程,如何回應(yīng)來(lái)自其他設(shè)備的請(qǐng)求以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定了消息的域和內(nèi)容的公共格式如圖1所示。
在Modbus網(wǎng)絡(luò)通信時(shí),協(xié)議決定了每個(gè)控制器需要知道它們的設(shè)備地址,識(shí)別按照地址發(fā)來(lái)的消息,并決定要產(chǎn)生何種行動(dòng)。如果需要響應(yīng),控制器將生成反饋信息并用Modbus協(xié)議發(fā)出。在其他網(wǎng)絡(luò)上通信時(shí),包含了Modbus協(xié)議的消息要轉(zhuǎn)換為此網(wǎng)絡(luò)上使用的幀或包結(jié)構(gòu)進(jìn)行傳輸。
Modbus協(xié)議工作傳輸機(jī)制
標(biāo)準(zhǔn)的Modbus接口是使用RS-232C兼容串行接口,它定義了連接口的針腳、電纜、信號(hào)位、傳輸波特率、奇偶校驗(yàn),控制器能直接或經(jīng)由Modem組網(wǎng)。
控制器之間通信使用主-從技術(shù),僅有主設(shè)備能初始化傳輸操作,其他設(shè)備(從設(shè)備)根據(jù)主設(shè)備查詢提供的數(shù)據(jù)作出相應(yīng)反應(yīng)。典型的主設(shè)備:主機(jī)和可編程儀表,典型的從設(shè)備:可編程控制器。
主-從技術(shù)原理框圖,如圖2所示。
查詢:查詢消息中的功能代碼告之被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí)行功能的全部附加信息,例如,功能代碼03是要求從設(shè)備讀取保持寄存器并返回它們的內(nèi)容,數(shù)據(jù)段必須包含如下信息:從哪個(gè)寄存器開始讀以及要讀的寄存器數(shù)量。錯(cuò)誤檢測(cè)域?yàn)閺脑O(shè)備提供了一種驗(yàn)證消息內(nèi)容是否正確的方法。
回應(yīng):如果從設(shè)備產(chǎn)生一個(gè)正常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢消息中的功能代碼的響應(yīng)。數(shù)據(jù)段包括了從設(shè)備收集的數(shù)據(jù),如寄存器值或狀態(tài)等。如果有錯(cuò)誤發(fā)生,功能代碼將修改為用于指出回應(yīng)消息是錯(cuò)誤的,同時(shí)數(shù)據(jù)段包含了描述此錯(cuò)誤信息的代碼。錯(cuò)誤檢測(cè)域允許主設(shè)備確認(rèn)消息內(nèi)容是否可用。
下面介紹Modbus在不同的網(wǎng)絡(luò)環(huán)境中主-從技術(shù)的應(yīng)用情況:
1、在單一Modbus網(wǎng)絡(luò)上傳輸 主設(shè)備可單獨(dú)和從設(shè)備通信,也能以廣播方式和所有從設(shè)備通訊。如果單獨(dú)通信,從設(shè)備返回一條消息作為回應(yīng);如果是以廣播方式查詢的,則不作任何回應(yīng)。Modbus協(xié)議建立了主設(shè)備查詢的格式:設(shè)備(或廣播)地址、功能代碼、所有要發(fā)送的數(shù)據(jù)、錯(cuò)誤檢測(cè)域。
從設(shè)備回應(yīng)消息也由Modbus協(xié)議構(gòu)成,包括確認(rèn)要行動(dòng)的域、任何要返回的數(shù)據(jù)和錯(cuò)誤檢測(cè)域。如果在消息接收過(guò)程中發(fā)生錯(cuò)誤,或從設(shè)備不能執(zhí)行其命令,從設(shè)備將建立錯(cuò)誤消息并把它作為回應(yīng)發(fā)送出去。
2、在其他網(wǎng)絡(luò)上傳輸 在其他網(wǎng)絡(luò)上,控制器之間使用對(duì)等技術(shù)通信,故任何控制器都能初始和其他控制器的通信。這樣在單獨(dú)的通信過(guò)程中,控制器既可作為主設(shè)備也可作為從設(shè)備。傳輸網(wǎng)絡(luò)提供的多個(gè)內(nèi)部通道可允許同時(shí)發(fā)生的多個(gè)傳輸進(jìn)程執(zhí)行。
在消息位,Modbus協(xié)議仍提供了主-從原則,盡管網(wǎng)絡(luò)通信方法是“對(duì)等”,如果一個(gè)控制器發(fā)送一條消息,它只是作為主設(shè)備,并期望從從設(shè)備得到回應(yīng)。同樣,當(dāng)控制器接收到一條消息,它將建立一個(gè)從設(shè)備回應(yīng)格式并返回給發(fā)送該消息的控制器。
Modbus兩種工作傳輸模式
在標(biāo)準(zhǔn)的Modbus網(wǎng)絡(luò)中,控制器可以設(shè)置為RTU和ASCII兩種通訊模式中的任何一種,在配置控制器的時(shí)候用戶一旦選定某種模式(包括對(duì)應(yīng)的串口通信參數(shù)),那么在同一Modbus網(wǎng)絡(luò)上的所有設(shè)備都必須選擇相同的傳輸模式和串口參數(shù)。
兩種不同的傳輸模式對(duì)應(yīng)的傳輸數(shù)據(jù)單元有不同的格式:
選定了的傳輸模式僅適用于標(biāo)準(zhǔn)的Modbus傳輸網(wǎng)絡(luò),它定義了在網(wǎng)絡(luò)上傳輸?shù)南⒌拿恳蛔止?jié)消息段的意義,以及怎樣將消息進(jìn)行打包和解析。
在其他網(wǎng)絡(luò)上,例如MAP或Modbus Plus,Modbus消息首先被轉(zhuǎn)換成與串行無(wú)關(guān)的消息幀,再進(jìn)行傳輸。
1、RTU傳輸模式 RTU通信模式,在Modbus網(wǎng)絡(luò)上傳輸?shù)南⒅忻總€(gè)8bit字節(jié)包含兩個(gè)4bit的十六進(jìn)制數(shù)。這種傳輸方式的優(yōu)點(diǎn)是:同樣的波特率下,比ASCII模式傳輸?shù)臄?shù)據(jù)更多。
代碼編碼:
(1)8bit二進(jìn)制數(shù)分為兩個(gè)4bit十六進(jìn)制數(shù)0~9,A~F。
(2)消息中每個(gè)8bit域都是由2個(gè)十六進(jìn)制字符組成。
在RTU傳輸模式下,消息至少要以3.5個(gè)字符時(shí)間的停頓間隔開始發(fā)送。在網(wǎng)絡(luò)波特率多樣的字符時(shí)間下,這是很容易實(shí)現(xiàn)的,如下面示例中的T1-T2-T3-T4所示。傳輸?shù)牡谝粋€(gè)域是設(shè)備地址,可使用的傳輸字符是十六進(jìn)制的0~9,A~F。網(wǎng)絡(luò)設(shè)備不斷偵測(cè)網(wǎng)絡(luò)總線,包括停頓間隔時(shí)間在內(nèi)。當(dāng)接收到第一個(gè)傳輸字符之后,一個(gè)至少3.5個(gè)字符時(shí)間的停頓標(biāo)定了消息的結(jié)束。新的消息發(fā)送可在此停頓后開始執(zhí)行。
RTU模式下,整個(gè)消息的傳輸必須作為一個(gè)連續(xù)的流進(jìn)行。如果在傳輸完成之前有超過(guò)1.5個(gè)字符時(shí)間的停頓時(shí)間,接收設(shè)備將刷新不完整的消息并假定下一字節(jié)是一個(gè)新消息的地址域。同樣地,如果一個(gè)新消息在小于3.5個(gè)字符時(shí)間內(nèi)接著前一個(gè)消息開始,接收的設(shè)備將認(rèn)為它是前一消息的延續(xù)。這都將導(dǎo)致錯(cuò)誤的產(chǎn)生,因?yàn)樵谧詈驝RC域的值不可能是正確的。
典型的RTU消息幀見表1
2、ASCII傳輸模式 ASCII通信模式,在Modbus網(wǎng)絡(luò)上傳輸?shù)南⒅忻總€(gè)8bit字節(jié)作為兩個(gè)ASCII字符發(fā)送。這種傳輸方式的優(yōu)點(diǎn)是字符發(fā)送的間隔可以達(dá)到1s而不產(chǎn)生錯(cuò)誤。
代碼編碼:
(1)8bit二進(jìn)制數(shù)表示為兩個(gè)ASCII字符,0~9,A~F。
(2)消息中每個(gè)ASCII字符都是一個(gè)十六進(jìn)制字符組成。
在ASCII傳輸模式下,消息以冒號(hào)(:)字符(ASCII碼3AH)開始,以回車換行符結(jié)束(ASCII碼0DH,0AH)。
其他域可使用的傳輸字符是十六進(jìn)制的0~9,A~F。網(wǎng)絡(luò)上的設(shè)備不斷偵測(cè)“:”字符,當(dāng)有一個(gè)冒號(hào)接收到時(shí),每個(gè)設(shè)備都解碼下個(gè)域(地址域)來(lái)判斷是否發(fā)給自己的。
消息中字符間發(fā)送的時(shí)間間隔最長(zhǎng)不能超過(guò)1s,否則接收的設(shè)備將認(rèn)為傳輸錯(cuò)誤。
一個(gè)典型ASCII消息幀見表2所示
Modbus消息內(nèi)各域解析
上述段落中,主要講述了Modbus的不同傳輸模式以及對(duì)應(yīng)傳輸模式的消息幀的典型構(gòu)成,從中可以發(fā)現(xiàn),兩種傳輸模式在消息的起始端具有不同的特性,消息內(nèi)各域的編碼方式不同之外,沒(méi)有其他的區(qū)別。下面將統(tǒng)一進(jìn)行消息內(nèi)各域的解析講解。
1、地址域 消息幀的地址包含兩個(gè)字符(ASCII)或8bits(RTU)。可能的從設(shè)備地址是0~247(十進(jìn)制)。單個(gè)設(shè)備的地址范圍是1~247.主設(shè)備把要聯(lián)系的從設(shè)備的地址放入消息中的地址域,發(fā)送出去,選通從設(shè)備。當(dāng)從設(shè)備發(fā)送回應(yīng)消息時(shí),它把自己的地址放入回應(yīng)的地址域中,以便主設(shè)備知道是哪一個(gè)從設(shè)備作出了回應(yīng)。
地址0是用作廣播地址,以使所有的從設(shè)備都能認(rèn)識(shí)。當(dāng)Modbus協(xié)議用于更高水準(zhǔn)的網(wǎng)絡(luò),可能是不允許廣播或以其他方式代替。
2、功能代碼域 消息幀中的功能代碼域包含了兩個(gè)字符(ASCII)或8bits(RTU)。可能的代碼范圍是十進(jìn)制的1~255.當(dāng)然,有些代碼是適用于所有控制器,有些是應(yīng)用于某種控制器,還有些保留以備后用。
當(dāng)消息從主設(shè)備發(fā)往從設(shè)備時(shí),功能代碼域?qū)⒏嬷畯脑O(shè)備需要執(zhí)行哪些行為。例如去讀取輸入的開關(guān)狀態(tài),讀一組寄存器的數(shù)據(jù)內(nèi)容,讀從設(shè)備的診斷狀態(tài),允許調(diào)入、記錄、校驗(yàn)在從設(shè)備中的程序等。
當(dāng)從設(shè)備回應(yīng)時(shí),它使用功能代碼域來(lái)指示是正常回應(yīng)(無(wú)誤)還是產(chǎn)生某種錯(cuò)誤(稱作異常回應(yīng))。對(duì)正常回應(yīng),從設(shè)備僅回應(yīng)相應(yīng)的功能代碼。對(duì)異議回應(yīng),從設(shè)備返回一等同于正常代碼的代碼,但最重要的位置為邏輯1.
例如:一由主設(shè)備發(fā)往從設(shè)備的消息要求讀一組保持寄存器,將產(chǎn)生如下功能代碼:
00000011(十六進(jìn)制 03H)
對(duì)正常回應(yīng),從設(shè)備僅回應(yīng)同樣的功能代碼。對(duì)異常回應(yīng),它返回:
10000011(十六進(jìn)制83H)
除功能代碼因異議錯(cuò)誤作了修改外,從設(shè)備將一獨(dú)特的代碼放到回應(yīng)消息的數(shù)據(jù)域中,以便告訴主設(shè)備發(fā)生了什么錯(cuò)誤。
主設(shè)備應(yīng)用程序得到異常的回應(yīng)后,典型的處理過(guò)程是重發(fā)消息,或者診斷發(fā)給從設(shè)備的消息并報(bào)告給操作員。
3、數(shù)據(jù)域 數(shù)據(jù)域是由兩個(gè)十六進(jìn)制數(shù)集合構(gòu)成的,取值范圍00~FF。根據(jù)網(wǎng)絡(luò)傳輸模式,這可以是由一對(duì)ASCII字符組成或由一RTU字符組成。
主設(shè)備發(fā)給從設(shè)備消息的數(shù)據(jù)域包含如下附加信息:從設(shè)備用于執(zhí)行由功能代碼所定義的功能所必需的參數(shù),包括了寄存器地址、處理項(xiàng)的數(shù)目、域中實(shí)際數(shù)據(jù)字節(jié)數(shù)等。
例如,如果主設(shè)備需要從設(shè)備讀取一組保持寄存器的數(shù)據(jù)(功能代碼03),數(shù)據(jù)域指定了起始寄存器以及要讀的寄存器數(shù)量。主設(shè)備要寫一組從設(shè)備的寄存器(功能代碼十六制10)數(shù)據(jù)域則指明了要寫的起始寄存器以及要寫的寄存器數(shù)量、數(shù)據(jù)域的數(shù)據(jù)字節(jié)數(shù)、要寫入寄存器的數(shù)據(jù)。
如果沒(méi)有錯(cuò)誤發(fā)生,從設(shè)備返回的數(shù)據(jù)域包含請(qǐng)求的數(shù)據(jù)。如果有錯(cuò)誤發(fā)生,此域包含了一個(gè)異常代碼,主設(shè)備應(yīng)用程序可以用來(lái)判斷以采取下一步行動(dòng)。
在某種消息中數(shù)據(jù)域可以是不存在的(0長(zhǎng)度)。例如,主設(shè)備要求從設(shè)備回應(yīng)通信事件記錄(功能代碼十六進(jìn)制0B),從設(shè)備不需任何附加的信息。
4、差錯(cuò)校驗(yàn)域 標(biāo)準(zhǔn)的Modbus串行網(wǎng)絡(luò)采用兩種錯(cuò)誤檢測(cè)方法。奇偶校驗(yàn)對(duì)每個(gè)字符都可用,幀檢測(cè)(LRC或CRC)應(yīng)用于整個(gè)消息。它們都是在消息發(fā)送前由主設(shè)備產(chǎn)生的,從設(shè)備在接收過(guò)程中檢測(cè)每個(gè)字符和整個(gè)消息幀。
用戶要給主設(shè)備配置預(yù)定義的超時(shí)時(shí)間間隔,這個(gè)時(shí)間間隔要足夠長(zhǎng),以使所有從設(shè)備都能作出正常反應(yīng)。如果從設(shè)備檢測(cè)到傳輸錯(cuò)誤,將不會(huì)接收消息,也不會(huì)向主設(shè)備作出回應(yīng)。這時(shí),超時(shí)事件將觸發(fā)主設(shè)備來(lái)處理錯(cuò)誤。發(fā)往不存在的從設(shè)備的地址也會(huì)產(chǎn)生超時(shí)。
責(zé)任編輯:tzh
評(píng)論
查看更多