第一章 Modbus協(xié)議簡介
Modbus協(xié)議是應(yīng)用于電子控制器上的一種通用語言。通過此協(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)行集中監(jiān)控。
此協(xié)議定義了一個控制器能認(rèn)識使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一控制器請求訪問其它設(shè)備的過程,如果回應(yīng)來自其它設(shè)備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。
當(dāng)在一Modbus網(wǎng)絡(luò)上通信時,此協(xié)議決定了每個控制器須要知道它們的設(shè)備地址,識別按地址發(fā)來的消息,決定要產(chǎn)生何種行動。如果需要回應(yīng),控制器將生成反饋信息并用Modbus協(xié)議發(fā)出。在其它網(wǎng)絡(luò)上,包含了Modbus協(xié)議的消息轉(zhuǎn)換為在此網(wǎng)絡(luò)上使用的幀或包結(jié)構(gòu)。這種轉(zhuǎn)換也擴(kuò)展了根據(jù)具體的網(wǎng)絡(luò)解決節(jié)地址、路由路徑及錯誤檢測的方法。
協(xié)議在一根通訊線上使用應(yīng)答式連接(半雙工),這意味著在一根單獨的通訊線上信號沿著相反的兩個方向傳輸。首先,主計算機(jī)的信號尋址到一臺唯一的終端設(shè)備(從機(jī)),然后,在相反的方向上終端設(shè)備發(fā)出的應(yīng)答信號傳輸給主機(jī)。 協(xié)議只允許在主計算機(jī)和終端設(shè)備之間,而不允許獨立的設(shè)備之間的數(shù)據(jù)交換,這就不會在使它們初始化時占據(jù)通訊線路,而僅限于響應(yīng)到達(dá)本機(jī)的查詢信號。
1. 1 傳輸方式
傳輸方式是一個信息幀內(nèi)一系列獨立的數(shù)據(jù)結(jié)構(gòu)以及用于傳輸數(shù)據(jù)的有限規(guī)則,以RTU模式在Modbus總線上進(jìn)行通訊時,信息中的每8位字節(jié)分成2個4位16進(jìn)制的字符,每個信息必須連續(xù)傳輸下面定義了與Modebus 協(xié)議– RTU方式相兼容的傳輸方式。
代碼系統(tǒng)
· 8位二進(jìn)制,十六進(jìn)制數(shù)0...9,A...F
· 消息中的每個8位域都是一個兩個十六進(jìn)制字符組成
每個字節(jié)的位
· 1個起始位
· 8個數(shù)據(jù)位,最小的有效位先發(fā)送
· 1個奇偶校驗位,無校驗則無
· 1個停止位(有校驗時),2個Bit(無校驗時)
錯誤檢測域
· CRC(循環(huán)冗長檢測)
1.2 協(xié)議
當(dāng)信息幀到達(dá)終端設(shè)備時,它通過一個簡單的“口”進(jìn)入尋址到的設(shè)備,該設(shè)備去掉數(shù)據(jù)幀的“信封”(數(shù)據(jù)頭),讀取數(shù)據(jù),如果沒有錯誤,就執(zhí)行數(shù)據(jù)所請求的任務(wù),然后,它將自己生成的數(shù)據(jù)加入到取得的“信封”中,把數(shù)據(jù)幀返回給發(fā)送者。返回的響應(yīng)數(shù)據(jù)中包含了以下內(nèi)容:終端從機(jī)地址(Address)、被執(zhí)行了的命令(Function)、執(zhí)行命令生成的被請求數(shù)據(jù)(Data)和一個校驗碼(Check)。發(fā)生任何錯誤都不會有成功的響應(yīng)。
1.2.1 信息幀
Address
Function
Data
Check
8-Bits
8-Bits
N x 8-Bits
16-Bits
圖 1 – 1 . 信息幀格式
特注:Modbus信息幀所允許的最大長度為256個字節(jié),即N的范圍是大于等于零且小于等于252(N{0,252})。
即,所有的數(shù)據(jù)一共256個,數(shù)據(jù)剩下253個。
1.2.2 地址(Address)域
信息幀地址域(信息地址)在幀的開始部分,由8位組成,有效的從機(jī)設(shè)備地址范圍0-247(十進(jìn)制),各從機(jī)設(shè)備的尋址范圍為1-247。主機(jī)把從機(jī)地址放入信息幀的地址區(qū),并向從機(jī)尋址。從機(jī)響應(yīng)時,把自己的地址放入響應(yīng)信息的地址區(qū),讓主機(jī)識別已作出響應(yīng)的從機(jī)地址。
地址0為廣播地址,所有從機(jī)均能識別。當(dāng)Modbus協(xié)議用于高級網(wǎng)絡(luò)時,則不允許廣播或其它方式替代。
1.2.3 功能(Function)域
信息幀功能域代碼告訴了被尋址到的終端執(zhí)行何種功能。有效碼范圍1-225(十進(jìn)制) ,有些代碼是適用于所有控制器,有些適應(yīng)于某種控制器,還有些保留以備后用。有關(guān)功能代替碼的全部內(nèi)容見附錄A。
當(dāng)主機(jī)向從句發(fā)送信息時,功能代碼向從機(jī)說明應(yīng)執(zhí)行的動作。如讀一組離散式線圈或輸入信號的ON/OFF狀態(tài),讀一組寄存器的數(shù)據(jù),讀從機(jī)的診斷狀態(tài),寫線圈(或寄存器),允許下截、記錄、確認(rèn)從機(jī)內(nèi)的程序等。當(dāng)從機(jī)響應(yīng)主機(jī)時,功能代碼可說明從機(jī)正常響應(yīng)或出現(xiàn)錯誤(即不正常響應(yīng)),正常響應(yīng)時,從句簡單返回原始功能代碼;不正常響應(yīng)時,從機(jī)返回與原始代碼相等效的一個碼,并把最高有效位設(shè)定為“1”。
如,主機(jī)要求從機(jī)讀一組保持寄存器時,則發(fā)送信息的功能碼為:
0000 0011 (十六進(jìn)制03)
若從機(jī)正確接收請求的動作信息后,則返回相同的代碼值作為正常響應(yīng)。發(fā)現(xiàn)錯時,則返回一個不正常響信息:
1000 0011(十六進(jìn)制83)
從機(jī)對功能代碼作為了修改,此外,還把一個特殊碼放入響應(yīng)信息的數(shù)據(jù)區(qū)中,告訴主機(jī)出現(xiàn)的錯誤類型和不正常響應(yīng)的原因,不正常響應(yīng)見附錄B。主機(jī)設(shè)備的應(yīng)用程序負(fù)責(zé)處理不正常響應(yīng),典型處理過程是主機(jī)把對信息的測試和診斷送給從機(jī),并通知操作者。表 1 – 1列出了所有設(shè)備常用的功能碼、它們的意義及它們的初始功能。
表 1 – 1 常用功能碼
代碼
名稱
作用
01
讀取線圈狀態(tài)
取得一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF)
02
讀取輸入狀態(tài)
取得一組開關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF)
03
讀取保持寄存器
在一個或多個保持寄存器中取得當(dāng)前的二進(jìn)制值
04
讀取輸入寄存器
在一個或多個輸入寄存器中取得當(dāng)前的二進(jìn)制值
05
強(qiáng)置單線圈
強(qiáng)置一個邏輯線圈的通斷狀態(tài)
06
預(yù)置單寄存器
放置一個特定的二進(jìn)制值到一個單寄存器中
07
讀取異常狀態(tài)
取得8個內(nèi)部線圈的通斷狀態(tài)
15
強(qiáng)置多線圈
強(qiáng)置一串連續(xù)邏輯線圈的通斷
16
預(yù)置多寄存器
放置一系列特定的二進(jìn)制值到一系列多寄存器中
17
報告從機(jī)標(biāo)識
可使主機(jī)判斷編址從機(jī)的類型及該從機(jī)運行指示燈的狀態(tài)
1.2.4 數(shù)據(jù)域
數(shù)據(jù)域包含了終端執(zhí)行特定功能所需要的數(shù)據(jù)或者終端響應(yīng)查詢時采集到的數(shù)據(jù)。這些數(shù)據(jù)的內(nèi)容可能是數(shù)值、參考地址或者極限值。他由數(shù)據(jù)區(qū)有2個16進(jìn)制的數(shù)據(jù)位(2的8次方256),數(shù)據(jù)范圍為00-FF(16進(jìn)制)。例如:功能域碼告訴終端讀取一個寄存器,數(shù)據(jù)域則需要指明從哪個寄存器開始及讀取多少個數(shù)據(jù),內(nèi)嵌的地址和數(shù)據(jù)依照類型和從機(jī)之間的不同能力而有所不同。若無錯誤出現(xiàn),從機(jī)向主機(jī)的響應(yīng)信息中包含了請求數(shù)據(jù),若有錯誤出現(xiàn),則數(shù)據(jù)中有一個不正常代碼,使主機(jī)能判斷并作出下一步的動作。數(shù)據(jù)區(qū)的長度可為“零”以表示某類信息。
1.2.5 錯誤校驗域
該域允許主機(jī)和終端檢查傳輸過程中的錯誤。有時,由于電噪聲和其它干擾,一組數(shù)據(jù)在從一個設(shè)備傳輸?shù)搅硪粋€設(shè)備時在線路上可能會發(fā)生一些改變,出錯校驗?zāi)軌虮WC主機(jī)或者終端不去響應(yīng)那些傳輸過程中發(fā)生了改變的數(shù)據(jù),這就提高了系統(tǒng)的安全性和效率,出錯校驗使用了16位循環(huán)冗余的方法,即CRC校驗。
錯誤檢測域包含一16Bits值(用兩個8位的字符來實現(xiàn))。錯誤檢測域的內(nèi)容是通過對消息內(nèi)容進(jìn)行循環(huán)冗長檢測方法得出的。CRC域附加在消息的最后,添加時先是低字節(jié)然后是高字節(jié)。故CRC的高位字節(jié)是發(fā)送消息的最后一個字節(jié)。
1.2.6 字符的連續(xù)傳輸
當(dāng)消息在標(biāo)準(zhǔn)的Modbus系列網(wǎng)絡(luò)傳輸時,每個字符或字節(jié)按由左到右的次序方式發(fā)送:
最低有效位(LSB)...最高有效位(MSB)。
位的序列是:
有奇偶校驗
啟始位
1
2
3
4
5
6
7
8
奇偶位
停止位
無奇偶校驗
啟始位
1
2
3
4
5
6
7
8
停止位
停止位
圖 1 –2 . 位順序(RTU)
1.3 錯誤檢測
1、奇偶校驗
用戶可以配置控制器是奇或偶校驗,或無校驗。這將決定了每個字符中的奇偶校驗位是如何設(shè)置的。
如果指定了奇或偶校驗,“1”的位數(shù)將算到每個字符的位數(shù)中(ASCII模式7個數(shù)據(jù)位,RTU中8個數(shù)據(jù)位)。例如RTU字符幀中包含以下8個數(shù)據(jù)位:1 1 0 0 0 1 0 1
整個“1”的數(shù)目是4個。如果便用了偶校驗,幀的奇偶校驗位將是0,便得整個“1”的個數(shù)仍是4個。如果便用了奇校驗,幀的奇偶校驗位將是1,便得整個“1”的個數(shù)是5個。
如果沒有指定奇偶校驗位,傳輸時就沒有校驗位,也不進(jìn)行校驗檢測。代替一附加的停止位填充至要傳輸?shù)淖址麕小?div style="height:15px;">
2、CRC檢測
RTU方式時,采用CRC方法計算錯誤校驗碼,CRC校驗傳送的全部數(shù)據(jù)。它忽略信息中單個字符數(shù)據(jù)的奇偶校驗方法。
循環(huán)冗余校驗(CRC)域占用兩個字節(jié),包含了一個16位的二進(jìn)制值。CRC值由傳送設(shè)備計算出來,然后附加到數(shù)據(jù)幀上,接收設(shè)備在接收數(shù)據(jù)時重新計算CRC值,然后與接收到的CRC域中的值進(jìn)行比較,如果這兩個值不相等,就發(fā)生了錯誤。
CRC開始時先把寄存器的16位全部置成“1”,然后把相鄰2個8位字節(jié)的數(shù)據(jù)放入當(dāng)前寄存器中,只有每個字符的8位數(shù)據(jù)用作產(chǎn)生CRC,起始位,停止位和奇偶校驗位不加到CRC中。
在生成CRC時,每個8位字節(jié)與寄存器中的內(nèi)容進(jìn)行異或,然后將結(jié)果向低位移位,高位則用“0”補(bǔ)充,最低位(LSB)移出并檢測,如果是1,該寄存器就與一個預(yù)設(shè)的固定值進(jìn)行一次異或運算,如果最低位為0,不作任何處理。
上述處理重復(fù)進(jìn)行,知道執(zhí)行完了8次移位操作,當(dāng)最后一位(第8位)移完以后,下一個8位字節(jié)與寄存器材的當(dāng)前值進(jìn)行異或運算,同樣進(jìn)行上述的另一個8次移位異或操作,當(dāng)數(shù)據(jù)幀中的所有字節(jié)都作了處理,生成的最終值就是CRC值。
生成一個CRC的流程為:
1、 預(yù)置一個16位寄存器為0FFFFH(全1),稱之為CRC寄存器。
2、 把數(shù)據(jù)幀中的第一個8位字節(jié)與CRC寄存器中的低字節(jié)進(jìn)行異或運算,結(jié)果存回CRC寄存器。
3、 將CRC寄存器向右移一位,最高位填以0,最低位移出并檢測。
4、 如果最低位為0:重復(fù)第3步(下一次移位)。
如果最低位為1:將CRC寄存器與一個預(yù)設(shè)的固定值(0A001H)進(jìn)行異或運算。
5、 重復(fù)第3步和第4步直到8次移位。這樣處理完了一個完整的八位。
6、 重復(fù)第2步到第5步來處理下一個八位,直到所有的字節(jié)處理結(jié)束。
7、 最終CRC寄存器得值就是CRC的值。
CRC值附加到信息時,低位在先,高位在后。查閱附錄C中的一個實例,它詳細(xì)說明了CRC的校驗。
第二章 Modbus數(shù)據(jù)和控制功能詳解
Modbus信息中的所有數(shù)據(jù)地址以零作為基準(zhǔn),各項數(shù)據(jù)的第一個數(shù)據(jù)地址的編號為0。若無特殊說明在此節(jié)文中用+進(jìn)制值表示,圖中的數(shù)據(jù)區(qū)則用十六進(jìn)制表示。
圖2--1為一個例子,說明了Modbus的查詢信息,圖2--2為正常響應(yīng)的例子,這兩例子中的數(shù)據(jù)均是16進(jìn)制的,也表示了以RTU方式構(gòu)成數(shù)據(jù)幀的方法。
主機(jī)查詢是讀保持寄存器,被請求的從機(jī)地址是06,讀取的數(shù)據(jù)來自地址40108保持寄有器。注意,該信息規(guī)定了寄存器的起始地址為0107 (006BH)。
從機(jī)響應(yīng)返回該功能代碼,說明是正常響應(yīng),字節(jié)數(shù)“Byle count”中說明有多少個8位字節(jié)被返回。它表明了附在數(shù)據(jù)區(qū)中8位字節(jié)的數(shù)量,當(dāng)在緩沖區(qū)組織響應(yīng)信息時,“字節(jié)數(shù)”區(qū)域中的值應(yīng)與該信息中數(shù)據(jù)區(qū)的字節(jié)數(shù)相等。如RTU方式時,63H 用一個字節(jié)(01100011)發(fā)送。8個位為一個單位計算“字節(jié)數(shù)”,它忽略了信息幀用組成的方法。
Addr
Fun
Data start reg hi
Data start reg lo
Data #of regs hi
Data #of regs lo
CRC16
hi
CRC16
lo
06H
03H
00H
6BH
00H
01H
XXH
XXH
圖 2 – 1 Modbus的查詢信息
Addr
Fun
Byte
count
Data1
hi
Data1
Lo
Data 2
hi
Data2
lo
Data3
hi
Data3
lo
CRC16
hi
CRC16
lo
06H
03H
06H
02H
2BH
00H
00H
00H
63H
XXH
XXH
圖 2 – 2 Modbus的響應(yīng)信息
2.1 讀取線圈狀態(tài)(功能碼01)
讀取從機(jī)離散量輸出口(DO,0X類型)的 ON/OFF 狀態(tài),不支持廣播。
查詢
查詢信息規(guī)定了要讀的起始線圈和線圈量,線圈的起始地址為0000H,1-16個線圈的尋址地址分為0000H –0015H(DO1=0000H,DO2=0001H,依此類推)。
圖 2 – 3 的例子是從地址為17的從機(jī)讀取DO1至DO6的狀態(tài)。
Addr
Fun
DO start reg hi
DO start reg lo
DO #of regs hi
DO #of regs lo
CRC16
hi
CRC16
lo
11H
01H
00H
00H
00H
06H
XXH
XXH
圖 2 – 3 讀取線圈狀態(tài)----查詢
響應(yīng)
響應(yīng)信息中的各線圈的狀態(tài)與數(shù)據(jù)區(qū)的每一位的值相對應(yīng),即每個DO占用一位(1 = ON, 0= OFF),第一個數(shù)據(jù)字節(jié)的LSB為查詢中的尋址地址,其他的線圈按順序在該字節(jié)中由低位向高位排列,直至8個為止,下一個字節(jié)也是從低位向高位排例。若返回的線圈數(shù)不是8的倍數(shù),則在最后的數(shù)據(jù)字節(jié)中的剩余位至字節(jié)的最高位全部填0,字節(jié)數(shù)區(qū)說明全部數(shù)據(jù)的字節(jié)數(shù)。
圖2 – 4所示為線圈的輸出狀態(tài)響應(yīng)的實例。
Addr
Fun
Byte count
Data
CRC16 hi
CRC16 lo
11H
01H
01H
2AH
XXH
XXH
數(shù)據(jù)
0
0
0
0
0
0
DO2
DO1
MSB
7
6
5
4
3
2
LSB
圖 2 – 4讀取線圈狀態(tài)----響應(yīng)
2.2 讀取輸入狀態(tài)(功能碼02)
讀取從機(jī)離散量輸入信號(DI,0X類型)的ON/OFF狀態(tài),不支持廣播。
查詢
查詢信息規(guī)定了要讀的輸入起始地址,以及輸入信號的數(shù)量。輸入的起始地址為0000H,1-16個輸入口的地址分別為0-15(DO1=0000H,DO2=0001H,依此類推)。
圖 2 – 5 的例子是從地址為17的從機(jī)讀取DI1到DI16的狀態(tài)。
Addr
Fun
DI start
addr hi
DI start
addr lo
DI num
hi
DI num
lo
CRC16
hi
CRC16
lo
11H
02H
00H
00H
00H
10H
XXH
XXH
圖 2 – 5讀取輸入狀態(tài)----查詢
響應(yīng)
響應(yīng)信息中的各輸入口的狀態(tài),分別對應(yīng)于數(shù)據(jù)區(qū)中的每一位值,1 = ON; 0 = OFF,第一個數(shù)據(jù)字節(jié)的LSB為查詢中的尋址地址,其他輸入口按順序在該字節(jié)中由低位向高位排列,直至8個位為止。下一個字節(jié)中的8個輸入位也是從低位到高位排列。若返回的輸入位數(shù)不是8的倍數(shù),則在最后的數(shù)據(jù)字節(jié)中的剩余位直至字節(jié)的最高位全部填零。字節(jié)數(shù)區(qū)說明了全部數(shù)據(jù)的字節(jié)數(shù)。
圖2 – 6 所示為讀數(shù)字輸出狀態(tài)響應(yīng)的實例。
Addr
Fun
Byte count
Data1
Data2
CRC16 hi
CRC16 lo
11H
02H
02H
33H
CCH
XXH
XXH
數(shù)據(jù) 1
DI8
DI7
DI6
DI5
DI4
DI3
DI2
DI1
MSB LSB
數(shù)據(jù) 2
DI16
DI15
DI14
DI13
DI12
DI11
DI10
DI9
MSB LSB
圖 2 – 6讀取輸入狀態(tài)----響應(yīng)
2.3 讀取保持寄存器(功能碼03)
讀取從機(jī)保持寄存器(4X類型)的二進(jìn)制數(shù)據(jù),不支持廣播。
查詢
查詢信息規(guī)定了要讀的保持寄存器起始地址及保持寄存器的數(shù)量,保持寄存器尋址起始地址為0000H,寄存器1-16所對應(yīng)的地址分別為0000H –0015H。
圖2 – 7 的例子是從17號從機(jī)讀3個采集到的基本數(shù)據(jù)U1、U2、U3,U1的地址為0000H, U2的地址為0001H,U3的地址為0002H。
Addr
Fun
Data start
addr hi
Data start
addr lo
Data #of
regs hi
Data #of
regs lo
CRC16
hi
CRC16
lo
11H
03H
00H
00H
00H
03H
XXH
XXH
圖 2 – 7讀取保持寄存器----查詢
響應(yīng)
響應(yīng)信息中的寄存器數(shù)據(jù)為二進(jìn)制數(shù)據(jù),每個寄存器分別對應(yīng)2個字節(jié),第一個字節(jié)為高位值數(shù)據(jù),第二個字節(jié)為低位數(shù)據(jù)。
圖 2 – 8的例子是讀取U1,U2,U3(U1=03E8H,U2=03E7H,U3=03E9H)的響應(yīng)。
Addr
Fun
Byte
count
Data1
hi
Data1
Lo
Data 2
hi
Data2
lo
Data3
hi
Data3
lo
CRC16
hi
CRC16
lo
11H
03H
06H
03H
E8H
03H
E7H
03H
E9H
XXH
XXH
圖 2 – 8讀取保持寄存器----響應(yīng)
2.4 讀取輸入寄存器(功能碼04)
讀取從機(jī)輸入寄存器(3X類型)中的二進(jìn)制數(shù)據(jù),不支持廣播。
查詢
查詢信息規(guī)定了要讀的寄存器的起始地址及寄存器的數(shù)量,尋止起始地址為0,寄存器1-16所對應(yīng)的地址分別為0000H –0015H。
圖 2 – 9的例子是請求17號從機(jī)的0009寄存器。
Addr
Fun
DO addr
hi
DO addr
lo
Data #of
regs hi
Data #of
regs lo
CRC16
hi
CRC16
lo
11H
04H
00H
08H
00H
01H
XXH
XXH
圖 2 – 9讀取輸入寄存器----查詢
響應(yīng)
響應(yīng)信息中的寄存器數(shù)據(jù)為每個寄存器分別對應(yīng)2個字節(jié),第一個字節(jié)為高位數(shù)據(jù),第二個字節(jié)為低位數(shù)據(jù)。
圖 2 – 10的例子寄存器30009中的數(shù)據(jù)用000AH 2個字節(jié)表示。
Addr
Fun
Byte
count
Data
hi
Data
Lo
CRC16
hi
CRC16
lo
11H
04H
02H
00H
0AH
XXH
XXH
圖 2 – 10讀取輸入寄存器----響應(yīng)
2.5 強(qiáng)置單線圈(功能碼05)
強(qiáng)制單個線圈(DO,0X類型)為ON或OFF狀態(tài),廣播時,該功能可強(qiáng)制所有從機(jī)中同一類型的線圈均為ON或OFF狀態(tài)。
該功能可越過控制器內(nèi)存的保護(hù)狀態(tài)和線圈的禁止?fàn)顟B(tài)。線圈強(qiáng)制狀態(tài)一直保持有效直至下一個控制邏輯作用于線圈為止??刂七壿嬛袩o線圈程序時,則線圈處于強(qiáng)制狀態(tài)。
查詢
查詢信息規(guī)定了需要強(qiáng)制一個單獨線圈的類型,線圈的起始地址為0000H,1-16個線圈的尋址地址分為0000H –0015H(DO1=0000H,DO2=0001H,依此類推)。
由查詢數(shù)據(jù)區(qū)中的一個常量,規(guī)定被請求線圈的ON/OFF狀態(tài), FF00H值請求線圈處于ON狀態(tài),0000H值請求線圈處于OFF狀態(tài),其它值對線圈無效,不起作用。
圖示 2-11的例子是請求17號從機(jī)開DO1的On狀態(tài)。
Addr
Fun
DO addr
hi
DO addr
lo
Value
hi
Value
lo
CRC16
hi
CRC16
lo
11H
05H
00H
00H
FFH
00H
XXH
XXH
圖示 2-11強(qiáng)制單線圈----查詢
響應(yīng)
圖2 – 12所示為對這個命令請求的正常響應(yīng)是在DO狀態(tài)改變以后傳送接收到的數(shù)據(jù)。
Addr
Fun
DO addr
hi
DO addr
lo
Value
hi
Value
lo
CRC16
hi
CRC16
lo
11H
05H
00H
00H
FFH
00H
XXH
XXH
圖示 2-12強(qiáng)制單線圈----響應(yīng)
2.6 預(yù)置單寄存器(功能碼06)
把一個值預(yù)置到一個保持寄存器(4X類型)中,廣播時,該功能把值預(yù)置到所有從機(jī)的相同類型的寄存器中。
該功能可越過控制器的內(nèi)存保護(hù)。使寄存器中的預(yù)置值保持有效。只能由控制器的下一個邏輯信號來處理該預(yù)置值。若控制邏輯中無寄存器程序時,則寄存器中的值保持不變。
查詢
查詢信息規(guī)定了要預(yù)置寄存器的類型,寄存器尋址起始地址為0000H,寄存器1所對應(yīng)的地址為0000H。
圖示 2-13的例子是請求17號從機(jī)0040H.的值為2717。
Addr
Fun
Data start
reg hi
Data start
reg lo
Value
hi
Value
lo
CRC
hi
CRC
lo
11H
06H
00H
40H
0AH
9DH
XXH
XXH
圖示 2-13預(yù)設(shè)單寄存器----查詢
響應(yīng)
圖2 – 14所示對于預(yù)置單寄存器請求的正常響應(yīng)是在寄存器值改變以后將接收到的數(shù)據(jù)傳送回去。
Addr
Fun
Data start
reg hi
Data start
reg lo
Value
hi
Value
lo
CRC
hi
CRC
lo
11H
06H
00H
40H
0AH
9DH
XXH
XXH
圖示 2-14預(yù)設(shè)單寄存器----響應(yīng)
2.7讀取異常狀態(tài)(功能碼7)
讀從中機(jī)中8個不正常狀態(tài)線圈的數(shù)據(jù),某些線圈號已在不同型號的控制器中預(yù)定義,而其它的線圈由用戶編程,作為有關(guān)控制器的狀態(tài)信息,如“machine ON/OFF”,“heads retraced”,(縮回標(biāo)題),“safeties satisfied”(安全性滿意),“errorconditions”(存在錯誤條件)或其它用戶定義的標(biāo)志等。該功能碼不支持廣播。
該功能代碼為存取該類信息提供了一種簡單的方法,不正常線圈的類型是已知的(在功能代碼中不需要線圈類型) 預(yù)定義的不正常線圈號如下:
控制器型號 線圈 設(shè)定
M84,184/384,584,984 1-8 用戶定義
484 257 電池狀態(tài)
258-264 用戶定義
884 761 電池狀態(tài)
762 內(nèi)存保護(hù)狀態(tài)
763 R10工況狀態(tài)
764-768 用戶預(yù)定義
查詢
圖示 2-15的例子是請求讀從機(jī)設(shè)備17中的不正常狀態(tài)。
Addr
Fun
CRC16 hi
CRC16 lo
11H
07H
XXH
XXH
圖示 2-15讀取異常狀態(tài)----查詢
響應(yīng)
正常響應(yīng)包含 8 個不正常的線圈狀態(tài),為一個數(shù)據(jù)字節(jié),每個線圈一位。LSB對應(yīng)為最低線圈類型的狀態(tài)。
圖2 – 16所示按查詢要求返回響應(yīng):
Addr
Fun
DO Data
CRC16 hi
CRC16 lo
11H
07H
6DH
XXH
XXH
圖示 2-16讀取異常狀態(tài)----響應(yīng)
該例子中,線圈數(shù)據(jù)為 6DH (二進(jìn)制0110 ,1101),從左到右 (最高位至最低位) 的線圈狀態(tài)分別為: OFF – ON – ON – OFF – ON –ON – OFF – ON。若控制器型號為 984,這些位表示線圈 8 至 1 的狀態(tài);若控制器型號為 484 則表示線圈 264 至 257 的狀態(tài)。
2.8 強(qiáng)置多線圈(功能碼15)
按線圈的順序把各線圈 (DO,0X 類型) 強(qiáng)制成 ON 或 OFF。廣播時,該功能代碼可對各從機(jī)中相同類型的線圈起強(qiáng)制作用。
該功能代碼可越過內(nèi)存保護(hù)和線圈的禁止?fàn)顟B(tài)線圈。保持強(qiáng)制狀態(tài)有效,并只能由控制器的下一個邏輯來處理。若無線圈控制邏輯程序時,線圈將保持強(qiáng)制狀態(tài)。
查詢
查詢信息規(guī)定了被強(qiáng)制線圈的類型,線圈的起始地址為0000H,1-16個線圈的尋址地址分為0000H –0015H(DO1=0000H,DO2=0001H,依此類推)。
查詢數(shù)據(jù)區(qū)規(guī)定了被請求線圈的 ON/OFF 狀態(tài),如數(shù)據(jù)區(qū)的某位值為“1”表示請求的相應(yīng)線圈狀態(tài)為ON,位值為“0”,則為OFF狀態(tài)。
圖示 2-17例子為請求從機(jī)設(shè)備 17 中一組 10 個線圈為強(qiáng)制狀態(tài),起始線圈為 20 (則尋址地址為 19 或 13H),查詢的數(shù)據(jù)為 2 個字節(jié),CD01H (二進(jìn)制 11001101 0000 0001) 相應(yīng)線圈的二進(jìn)制位排列如下:
Bit:
1
1
0
0
1
1
0
1
0
0
0
0
0
0
0
1
Coll:
27
26
25
24
23
22
21
20
-
-
-
-
-
-
29
28
傳送的第一個字節(jié) CDH 對應(yīng)線圈為 27-20, LSB 對應(yīng)線圈 20,傳送的第二個字節(jié)為 01H,對應(yīng)的線圈為 29-28, LSB 為繼圈 28,其余未使用的位均填“0”。
Addr
Fun
DO addr
hi
DO addr
lo
Data #of
reg hi
Data #of
reg lo
Byte
count
Value
hi
Value
lo
CRC
hi
CRC
lo
11H
0FH
00H
13H
00H
0AH
02H
CDH
01H
XXH
XXH
圖示 2-17強(qiáng)置多線圈----查詢
響應(yīng)
正常響應(yīng)返回從機(jī)地址,功能代碼,起始地址以及強(qiáng)制線圈數(shù)。
圖2 – 18對上述查詢返回的響應(yīng)。
Addr
Fun
DO addr
hi
DO addr
lo
Data #of
reg hi
Data #of
reg lo
CRC16
hi
CRC16
lo
11H
0FH
00H
13H
00H
0AH
XXH
XXH
圖示 2-18強(qiáng)置多線圈----響應(yīng)
2.9預(yù)置多寄存器(功能碼16)
把數(shù)據(jù)按順序預(yù)置到各 (4X類型) 寄存器中,廣播時該功能代碼可把數(shù)據(jù)預(yù)置到全部從機(jī)中的相同類型的寄存器中。
該功能代碼可越過控制器的內(nèi)存保護(hù),在寄存器中的預(yù)置值一直保持有效,只能由控制器的下一個邏輯來處理寄存器的內(nèi)容,控制邏輯中無該寄存器程序時,則寄存器中的值保持不變。
查詢
查詢信息規(guī)定了要預(yù)置寄存器的類型,寄存器尋址起始地址為0000H,寄存器1所對應(yīng)的地址為0000H。
圖示 2-19的例子是請求17號從機(jī)0040H.的值為178077833。
Addr
Fun
Data start
reg hi
Data start
reg lo
Data #of
reg hi
Data #of
reg lo
Byte
count
Value
hi
Value
lo
Value
hi
Value
lo
CRC
hi
CRC
lo
11H
10H
00H
40H
00H
02H
04H
40H
89H
0AH
9DH
XXH
XXH
圖示 2-19預(yù)設(shè)多寄存器----查詢
響應(yīng)
圖2 – 20所示對于預(yù)置單寄存器請求的正常響應(yīng)是在寄存器值改變以后將接收到的數(shù)據(jù)傳送回去。
Addr
Fun
Data start
reg hi
Data start
reg lo
Data #of
reg hi
Data #of
reg lo
CRC16
hi
CRC16
lo
11H
10H
00H
40H
00H
02H
XXH
XXH
圖示 2-20預(yù)設(shè)多寄存器----響應(yīng)
2.10報告從機(jī)標(biāo)識(功能碼17)
返回一個從機(jī)地址控制器的類型,從機(jī)的當(dāng)前狀態(tài),以及有關(guān)從機(jī)的其他說明,不支持廣播。
查詢
圖示 2-21的例子是請求報告從機(jī)設(shè)備 17 的 標(biāo)識ID 和狀態(tài)。
Addr
Fun
CRC16 hi
CRC16 lo
11H
11H
XXH
XXH
圖示 2-21報告從機(jī)標(biāo)識----查詢
響應(yīng)
圖2 – 22所示正常響應(yīng)格式,數(shù)據(jù)內(nèi)容對應(yīng)每臺控制器的類型。
Addr
Fun
Byte
Count
Slave ID
Run Indicator Status
Additfional
Data
CRC16
hi
CRC16
lo
11H
11H
XXH
XXH
XXH
XXH
XXH
XXH
圖示 2-22報告從機(jī)標(biāo)識----響應(yīng)
從機(jī) ID 總結(jié)
數(shù)據(jù)區(qū)第一個字節(jié)為 Modicon 控制器返回的從機(jī) ID
Slave ID Controller
0 Micro 84
1 484
2 184/384
3 584
8 884
9 984
特注:詳細(xì)信息見Modbus協(xié)議英文版或中文版。
第三章 附錄
附錄A:MODBUS全部功能碼
ModBus網(wǎng)絡(luò)是一個工業(yè)通信系統(tǒng),由帶智能終端的可編程序控制器和計算機(jī)通過公用線路或局部專用線路連接而成。其系統(tǒng)結(jié)構(gòu)既包括硬件、亦包括軟件。它可應(yīng)用于各種數(shù)據(jù)采集和過程監(jiān)控。下表3--1是ModBus的功能碼定義。
表3--1 ModBus功能碼
功能碼
名稱
作用
01
讀取線圈狀態(tài)
取得一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF)
02
讀取輸入狀態(tài)
取得一組開關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF)
03
讀取保持寄存器
在一個或多個保持寄存器中取得當(dāng)前的二進(jìn)制值
04
讀取輸入寄存器
在一個或多個輸入寄存器中取得當(dāng)前的二進(jìn)制值
05
強(qiáng)置單線圈
強(qiáng)置一個邏輯線圈的通斷狀態(tài)
06
預(yù)置單寄存器
把具體二進(jìn)值裝入一個保持寄存器
07
讀取異常狀態(tài)
取得8個內(nèi)部線圈的通斷狀態(tài),這8個線圈的地址由控制器決定,用戶邏輯可以將這些線圈定義,以說明從機(jī)狀態(tài),短報文適宜于迅速讀取狀態(tài)
08
回送診斷校驗
把診斷校驗報文送從機(jī),以對通信處理進(jìn)行評鑒
09
編程(只用于484)
使主機(jī)模擬編程器作用,修改PC從機(jī)邏輯
10
控詢(只用于484)
可使主機(jī)與一臺正在執(zhí)行長程序任務(wù)從機(jī)通信,探詢該從機(jī)是否已完成其操作任務(wù),僅在含有功能碼9的報文發(fā)送后,本功能碼才發(fā)送
11
讀取事件計數(shù)
可使主機(jī)發(fā)出單詢問,并隨即判定操作是否成功,尤其是該命令或其他應(yīng)答產(chǎn)生通信錯誤時
12
讀取通信事件記錄
可是主機(jī)檢索每臺從機(jī)的ModBus事務(wù)處理通信事件記錄。如果某項事務(wù)處理完成,記錄會給出有關(guān)錯誤
13
編程(184/384 484 584)
可使主機(jī)模擬編程器功能修改PC從機(jī)邏輯
14
探詢(184/384 484 584)
可使主機(jī)與正在執(zhí)行任務(wù)的從機(jī)通信,定期控詢該從機(jī)是否已完成其程序操作,僅在含有功能13的報文發(fā)送后,本功能碼才得發(fā)送
15
強(qiáng)置多線圈
強(qiáng)置一串連續(xù)邏輯線圈的通斷
16
預(yù)置多寄存器
把具體的二進(jìn)制值裝入一串連續(xù)的保持寄存器
17
報告從機(jī)標(biāo)識
可使主機(jī)判斷編址從機(jī)的類型及該從機(jī)運行指示燈的狀態(tài)
18
(884和MICRO 84)
可使主機(jī)模擬編程功能,修改PC狀態(tài)邏輯
19
重置通信鏈路
發(fā)生非可修改錯誤后,是從機(jī)復(fù)位于已知狀態(tài),可重置順序字節(jié)
20
讀取通用參數(shù)(584L)
顯示擴(kuò)展存儲器文件中的數(shù)據(jù)信息
21
寫入通用參數(shù)(584L)
把通用參數(shù)寫入擴(kuò)展存儲文件,或修改之
22~64
保留作擴(kuò)展功能備用
65~72
保留以備用戶功能所用
留作用戶功能的擴(kuò)展編碼
73~119
非法功能
120~127
保留
留作內(nèi)部作用
128~255
保留
用于異常應(yīng)答
ModBus網(wǎng)絡(luò)只是一個主機(jī),所有通信都由他發(fā)出。網(wǎng)絡(luò)可支持247個之多的遠(yuǎn)程從屬控制器,但實際所支持的從機(jī)數(shù)要由所用通信設(shè)備決定。采用這個系統(tǒng),各PC可以和中心主機(jī)交換信息而不影響各PC執(zhí)行本身的控制任務(wù)。表3--2是ModBus各功能碼對應(yīng)的數(shù)據(jù)類型。
表3--2 ModBus功能碼與數(shù)據(jù)類型對應(yīng)表
代碼
功能
數(shù)據(jù)類型
01
讀
位
02
讀
位
03
讀
整型、字符型、狀態(tài)字、浮點型
04
讀
整型、狀態(tài)字、浮點型
05
寫
位
06
寫
整型、字符型、狀態(tài)字、浮點型
08
N/A
重復(fù)“回路反饋”信息
15
寫
位
16
寫
整型、字符型、狀態(tài)字、浮點型
17
讀
字符型
附錄B:不正常響應(yīng)
不正常響應(yīng):
除廣播外,主機(jī)向從機(jī)設(shè)備發(fā)送查詢并希望有一個正常響應(yīng),主機(jī)查詢中有可能產(chǎn)生4種事件:
¨ 從機(jī)接收查詢,通訊錯誤正常處理信息,則返回一個正常響應(yīng)事件。
¨ 由于通訊出錯,從機(jī)不能接收查詢數(shù)據(jù),因而不返回響應(yīng)。此時,主機(jī)依靠處理程序給出查詢超時事件。
¨ 若從機(jī)接收查詢,發(fā)現(xiàn)有 (LRC或CRC) 通訊錯誤,并返回響應(yīng),此時,依靠主機(jī)處理程序給出查詢超時事件。
¨ 從機(jī)接收查詢,無通訊錯誤,但無法處理(如讀不存在的線圈和寄存器)時,向主機(jī)報告錯誤的性質(zhì)。
不正常響應(yīng)信息有2個與正常響應(yīng)不相同的區(qū)域:
功能代碼區(qū):正常響應(yīng)時,從機(jī)的響應(yīng)功能代碼區(qū),帶原查詢的功能代碼。所有功能代碼的MSB為0(其值低于80H)。不正常響應(yīng)時,從機(jī)把功能代碼的MSB置為1,使功能代碼值大于80H,高于正常響應(yīng)的值。這樣,主機(jī)應(yīng)用程序能識別不正常響應(yīng)事件,能檢查不正常代碼的數(shù)據(jù)區(qū)。
數(shù)據(jù)區(qū):正常響應(yīng)中,數(shù)據(jù)區(qū)含有(按查詢要求給出的) 數(shù)據(jù)或統(tǒng)計值,在不正常響應(yīng)中,數(shù)據(jù)區(qū)為一個不正常代碼,它說明從機(jī)產(chǎn)生不正常響應(yīng)的條件和原因。
例:主機(jī)發(fā)出查詢,從機(jī)不正常響應(yīng)。(為十六進(jìn)制數(shù)據(jù))。
查詢:
Addr
Fun
DO start reg hi
DO start reg lo
DO #of regs hi
DO #of regs lo
CRC16
Hi
CRC16
Lo
0AH
01H
04H
A1H
00H
01H
XXH
XXH
響應(yīng)(不正?;蚶猓?div style="height:15px;">
圖 3 – 1 . 不正常信息幀格式
上例中,從機(jī)設(shè)備地址10(0AH),讀線圈狀態(tài)的功能代碼(01),主機(jī)請求線圈狀態(tài)的地址為1245(04A1H)。注意:只讀一個指定線圈,地址為(0001).
從機(jī)已接收請求處理數(shù)據(jù),但需要較長的處理時間,為避免主機(jī)出現(xiàn)超時錯誤而發(fā)送該確認(rèn)響應(yīng)。主機(jī)以此再發(fā)送一個“查詢程序完成”未決定從機(jī)是否已完成處理。
從機(jī)不能執(zhí)行查詢要求的程序功能時,該代碼使用十進(jìn)制13或14代碼,向主機(jī)返回一個“不成功的編程請求”信息。主機(jī)應(yīng)請求診斷從機(jī)的錯誤信息。
從機(jī)讀擴(kuò)展內(nèi)存中的數(shù)據(jù)時,發(fā)現(xiàn)有奇偶校驗錯誤,主機(jī)按從機(jī)的要求重新發(fā)送數(shù)據(jù)請求。