目錄
第一章 MODBUS協(xié)議簡(jiǎn)介
1.1 傳輸方式
1.2 協(xié)議
1.2.1數(shù)據(jù)幀格式
1.2.2 地址(Address)域
1.2.3 功能(Function)域
1.2.4 數(shù)據(jù)域
1.2.5錯(cuò)誤校驗(yàn)域
1.3 錯(cuò)誤檢測(cè)
第二章MODBUS功能詳解
2.1 讀數(shù)字輸出狀態(tài)(功能碼01)
2.2 讀數(shù)字輸入狀態(tài)(功能碼02)
2.3 讀數(shù)據(jù)(功能碼03)
2.4 控制DO (功能碼05)
2.5 預(yù)置多寄存器(功能碼16)
第一章 MODBUS協(xié)議簡(jiǎn)介
MODBUS協(xié)議詳細(xì)定義了校驗(yàn)碼、數(shù)據(jù)序列等,這些都是特定數(shù)據(jù)交換的必要內(nèi)容。
MODBUS協(xié)議在一根通訊線上使用主從應(yīng)答式連接(半雙工),這意味著在一根單獨(dú)的通訊線上信號(hào)沿著相反的兩個(gè)方向傳輸。首先,主計(jì)算機(jī)的信號(hào)尋址到一臺(tái)唯一的終端設(shè)備(從機(jī)),然后,終端設(shè)備發(fā)出的應(yīng)答信號(hào)以相反的方向傳輸給主機(jī)。
MODBUS協(xié)議只允許在主計(jì)算機(jī)和終端設(shè)備之間通訊,而不允許獨(dú)立的設(shè)備之間的數(shù)據(jù)交換,這樣各終端設(shè)備不會(huì)在它們初始化時(shí)占據(jù)通訊線路,而僅限于響應(yīng)到達(dá)本機(jī)的查詢信號(hào)。
1.1 傳輸方式
傳輸方式是一個(gè)數(shù)據(jù)幀內(nèi)一系列獨(dú)立的數(shù)據(jù)結(jié)構(gòu)以及用于傳輸數(shù)據(jù)的有限規(guī)則,下面定義了與MODBUS 協(xié)議– RTU方式相兼容的傳輸方式。
u Coding System 二進(jìn)制編碼 8位
u Start bit 起始位 1位
u Data bits 數(shù)據(jù)位 8位
u Parity 校驗(yàn) 無奇偶校驗(yàn)
u Stop bit 停止位 1位
u Error checking 錯(cuò)誤檢測(cè) CRC(循環(huán)冗余校驗(yàn))
[注]瑞士DAE公司的網(wǎng)絡(luò)電力儀表響應(yīng)查詢的時(shí)間為0.1 ~ 1.0秒(典型值為0.4秒)
響應(yīng)查詢的時(shí)間指主機(jī)命令發(fā)出到收到回復(fù)的時(shí)間。
1.2協(xié)議
當(dāng)數(shù)據(jù)幀到達(dá)終端設(shè)備時(shí),它通過一個(gè)簡(jiǎn)單的“端口”進(jìn)入被尋址到的設(shè)備,該設(shè)備去掉數(shù)據(jù)幀的“信封”(數(shù)據(jù)頭),讀取數(shù)據(jù),如果沒有錯(cuò)誤,就執(zhí)行數(shù)據(jù)所請(qǐng)求的任務(wù),然后,它將自己生成的數(shù)據(jù)加入到取得的“信封”中,把數(shù)據(jù)幀返回給發(fā)送者。返回的響應(yīng)數(shù)據(jù)中包含了以下內(nèi)容:終端從機(jī)地址(Address)、被執(zhí)行了的命令(Function)、執(zhí)行命令生成的被請(qǐng)求數(shù)據(jù)(Data)和一個(gè)校驗(yàn)碼(Check)。發(fā)生任何錯(cuò)誤都不會(huì)有成功的響應(yīng)。
1.2.1數(shù)據(jù)幀格式
Address |
Function |
Data |
Check |
8-Bits |
8-Bits |
N x 8-Bits |
16-Bits |
圖 1 – 1 .數(shù)據(jù)幀格式
1.2.2地址(Address)域
地址域在幀的開始部分,由一個(gè)字節(jié)8位(0 ~ 255)組成,這些位標(biāo)明了用戶指定的終端設(shè)備的地址,該設(shè)備將接收來自與之相連的主機(jī)數(shù)據(jù)。每個(gè)終端設(shè)備的地址必須是唯一的,僅僅被尋址到的終端會(huì)響應(yīng)包含了該地址的查詢。當(dāng)終端發(fā)送回一個(gè)響應(yīng),響應(yīng)中的從機(jī)地址數(shù)據(jù)便告訴了主機(jī)哪臺(tái)終端正與之進(jìn)行通信。
1.2.3功能(Function)域
功能域代碼告訴了被尋址到的終端執(zhí)行何種功能。表 1 – 1列出了瑞士DAE網(wǎng)絡(luò)電力儀表用到的功能碼,以及它們的意義和功能。
表 1 – 1 功能碼
代碼 |
意義 |
行為 |
01 |
讀DO狀態(tài) |
獲得數(shù)字(繼電器)輸出的當(dāng)前狀態(tài)(ON/OFF) |
02 |
讀DI狀態(tài) |
獲得數(shù)字輸入的當(dāng)前狀態(tài)(ON/OFF) |
03 |
讀數(shù)據(jù)寄存器 |
獲得一個(gè)或多個(gè)寄存器的當(dāng)前二進(jìn)制值 |
05 |
控制DO |
控制數(shù)字(繼電器)輸出狀態(tài)(ON/OFF) |
16 |
預(yù)置多寄存器 |
設(shè)定二進(jìn)制值到一系列多寄存器中 |
1.2.4數(shù)據(jù)(Data)域
數(shù)據(jù)域包含了終端執(zhí)行特定功能所需要的數(shù)據(jù)或者終端響應(yīng)查詢時(shí)采集到的數(shù)據(jù)。這
些數(shù)據(jù)的內(nèi)容可能是數(shù)值、參考地址或者設(shè)置值。例如:功能域碼告訴終端讀取一個(gè)寄存器,數(shù)據(jù)域則需要指明從哪個(gè)寄存器開始及讀取多少個(gè)數(shù)據(jù),內(nèi)嵌的地址和數(shù)據(jù)依照類型和從機(jī)之間的不同內(nèi)容而有所不同。
1.2.5錯(cuò)誤校驗(yàn)(Check)域
該域允許主機(jī)和終端檢查傳輸過程中的錯(cuò)誤。有時(shí),由于電噪聲和其它干擾,一組數(shù)
據(jù)在從一個(gè)設(shè)備傳輸?shù)搅硪粋(gè)設(shè)備時(shí)在線路上可能會(huì)發(fā)生一些改變,出錯(cuò)校驗(yàn)?zāi)軌虮WC主機(jī)或者終端不去響應(yīng)那些傳輸過程中發(fā)生了改變的數(shù)據(jù),這就提高了系統(tǒng)的安全性和效率,出錯(cuò)校驗(yàn)使用了16位循環(huán)冗余的方法(CRC16)。
[注] 發(fā)送序列總是相同的 – 地址、功能碼、數(shù)據(jù)和與方向相關(guān)的出錯(cuò)校驗(yàn)。
1.3錯(cuò)誤檢測(cè)
循環(huán)冗余校驗(yàn)(CRC)域占用兩個(gè)字節(jié),包含了一個(gè)16位的二進(jìn)制值。CRC值由傳
送設(shè)備計(jì)算出來,然后附加到數(shù)據(jù)幀上,接收設(shè)備在接收數(shù)據(jù)時(shí)重新計(jì)算CRC值,然后與接收到的CRC域中的值進(jìn)行比較,如果這兩個(gè)值不相等,就發(fā)生了錯(cuò)誤。
CRC運(yùn)算時(shí),首先將一個(gè)16位的寄存器預(yù)置為全1,然后連續(xù)把數(shù)據(jù)幀中的每個(gè)字節(jié)中的8位與該寄存器的當(dāng)前值進(jìn)行運(yùn)算,僅僅每個(gè)字節(jié)的8個(gè)數(shù)據(jù)位參與生成CRC,起始位和終止位以及可能使用的奇偶位都不影響CRC。
在生成CRC時(shí),每個(gè)字節(jié)的8位與寄存器中的內(nèi)容進(jìn)行異或,然后將結(jié)果向低位移位,高位則用“0”補(bǔ)充,最低位(LSB)移出并檢測(cè),如果是1,該寄存器就與一個(gè)預(yù)設(shè)的固定值(0A001H)進(jìn)行一次異或運(yùn)算,如果最低位為0,不作任何處理。
上述處理重復(fù)進(jìn)行,直到執(zhí)行完了8次移位操作,當(dāng)最后一位(第8位)移完以后,下一個(gè)8位字節(jié)與寄存器的當(dāng)前值進(jìn)行異或運(yùn)算,同樣進(jìn)行上述的另一個(gè)8次移位異或操作,當(dāng)數(shù)據(jù)幀中的所有字節(jié)都作了處理,生成的最終值就是CRC值。
生成一個(gè)CRC的流程為:
1、 預(yù)置一個(gè)16位寄存器為0FFFFH(全1),稱之為CRC寄存器。
2、 把數(shù)據(jù)幀中的第一個(gè)字節(jié)的8位與CRC寄存器中的低字節(jié)進(jìn)行異或運(yùn)算,結(jié)果存回CRC寄存器。
3、 將CRC寄存器向右移一位。
4、 如果最低位為0:重復(fù)第三步(下一次移位)。
如果最低位為1:將CRC寄存器與一個(gè)預(yù)設(shè)的固定值(1010 0000 0000 0001)進(jìn)行異或運(yùn)算。
5、 重復(fù)第三步和第四步直到8次移位。這樣處理完了一個(gè)完整的八位。
6、 重復(fù)第2步到第5步來處理下一個(gè)八位,直到所有的字節(jié)處理結(jié)束。
7、 最終CRC寄存器得值就是CRC的值。
8、 CRC寄存器發(fā)送時(shí)將高位、低位互換。
注:
CRC校驗(yàn)可用插表法和運(yùn)算法兩種方法實(shí)現(xiàn),具體范例請(qǐng)看附錄。
第二章 MODBUS功能詳解
本章的目標(biāo)是為使用DAE網(wǎng)絡(luò)電力儀表構(gòu)造系統(tǒng)的程序員定義特定有效命令的通用格式,在每條數(shù)據(jù)查詢格式說明的后面有一個(gè)該數(shù)據(jù)查詢所執(zhí)行的功能的解釋和一個(gè)例子。
第一章已經(jīng)簡(jiǎn)述了協(xié)議和數(shù)據(jù)幀,使用DAE網(wǎng)絡(luò)電力儀表的程序員可以使用下述的方法以便通過協(xié)議正確地建立與它們通訊的特定應(yīng)用程序。
本章所述協(xié)議將盡可能的使用如圖2 – 1 所示的格式,(數(shù)字為16進(jìn)制)。
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 |
00H |
00H |
21H |
84H |
65H |
注:
Addr:從機(jī)地址
Fun:功能碼
Data start reg hi:數(shù)據(jù)起始地址 寄存器高位
Data start reg lo:數(shù)據(jù)起始地址 寄存器低位
Data #of reg hi:數(shù)據(jù)讀取個(gè)數(shù) 寄存器高位
Data #of reg lo:數(shù)據(jù)讀取個(gè)數(shù) 寄存器低位
CRC16 Hi: 循環(huán)冗余校驗(yàn) 高位
CRC16 Lo: 循環(huán)冗余校驗(yàn) 低位
圖 2 – 1 協(xié)議例述
2.1讀數(shù)字輸出狀態(tài)(功能碼01)
查詢數(shù)據(jù)幀
此功能允許用戶獲得指定地址的從機(jī)控制的特定地址的DO輸出狀態(tài) ON/OFF(1 = ON , 0 = OFF),除了從機(jī)地址和功能域,數(shù)據(jù)幀還需要在數(shù)據(jù)域中包含將被讀取DO的初始地址和要讀取的DO數(shù)量。SRTU510中DO的地址從0000H開始(DO1=0000H,DO2=0001H)。
圖 2 – 2 的例子是從地址為17的從機(jī)讀取DO1到DO6的狀態(tài)。
(例如:有6個(gè)DO,DO的地址應(yīng)該為0001~0006)
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 |
BEH |
98H |
圖 2 – 2 讀DO1~DO6的查詢數(shù)據(jù)幀
響應(yīng)數(shù)據(jù)幀
響應(yīng)包含從機(jī)地址、功能碼、數(shù)據(jù)的數(shù)量和CRC錯(cuò)誤校驗(yàn),數(shù)據(jù)包中每個(gè)DO占用一位(1 = ON , 0 = OFF),第一個(gè)字節(jié)的最低位為尋址到的DO值,其余的在后面。
圖2 – 3 所示為讀數(shù)字輸出狀態(tài)響應(yīng)的實(shí)例。
(DO1 = OFF , DO2=ON,DO3=OFF,DO4=ON,DO5=OFF,DO6 = ON)
Addr |
Fun |
Byte count |
Data |
CRC16 hi |
CRC16 lo |
11H |
01H |
01H |
2AH |
D4H |
97H |
DO狀態(tài)
0 |
0 |
DO6 |
DO5 |
DO4 |
DO3 |
DO2 |
DO1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
MSB LSB
圖 2 – 3 讀DO1~DO6狀態(tài)的響應(yīng)數(shù)據(jù)幀
2.2讀數(shù)字輸入狀態(tài)(功能碼02)
查詢數(shù)據(jù)幀
此功能允許用戶獲得DI的狀態(tài) ON / OFF(1 = ON , 0 = OFF),除了從機(jī)地址和功能域,數(shù)據(jù)幀還需要在數(shù)據(jù)域中包含將被讀取DI的初始地址和要讀取的DI數(shù)量。SRTU510中DI的地址從0000H開始(DI1=0000H,DI2=0001H依此類推)。具體地址請(qǐng)查看第三章。
圖 2 – 4 的例子是從地址為17的從機(jī)讀取DI1到DI16的狀態(tài)。
(例如:SRTU510有16個(gè)DI,DI的數(shù)量為1~16)
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 |
7BH |
56H |
圖 2 – 4 讀DI1到DI16的查詢
響應(yīng)據(jù)數(shù)幀
響應(yīng)包含從機(jī)地址、功能碼、數(shù)據(jù)的數(shù)量和CRC錯(cuò)誤校驗(yàn),數(shù)據(jù)幀中每個(gè)DI占用一位(1 = ON , 0 = off),第一個(gè)字節(jié)的最低位為尋址到的DI值,其余的在后面。
圖2-5 所示為讀數(shù)字輸出狀態(tài)( DI1=on, DI2=on, DI3=off, DI4=off , DI5=on, DI6=on, DI7=off, DI8=off , DI9=off, DI10=off, DI11=on, DI12=on, DI13=off, DI14=off, DI15=on, DI16=on)響應(yīng)的實(shí)例。
Addr |
Fun |
Byte count |
Data1 |
Data2 |
CRC16 hi |
CRC16 lo |
11H |
02H |
02H |
33H |
CCH |
6CH |
DEH |
Data 1
DI8 |
DI7 |
DI6 |
DI5 |
DI4 |
DI3 |
DI2 |
DI1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
MSB LSB
Data 2
DI16 |
DI15 |
DI14 |
DI13 |
DI12 |
DI11 |
DI10 |
DI9 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
MSB LSB
圖 2 – 5 讀DI1到DI16狀態(tài)的響應(yīng)
2.3讀數(shù)據(jù)(功能碼03)
查詢數(shù)據(jù)幀
此功能允許用戶獲得設(shè)備采集與記錄的數(shù)據(jù)及系統(tǒng)參數(shù)。
圖2 – 6 的例子是從17號(hào)從機(jī)(EPM420)讀3個(gè)采集到的基本數(shù)據(jù)(數(shù)據(jù)幀中每個(gè)地址占用2個(gè)字節(jié))U1,U2,U3, EPM420中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 |
07H |
5BH |
圖 2 – 6 讀U1、U2、U3的查詢數(shù)據(jù)幀
響應(yīng)數(shù)據(jù)幀
響應(yīng)包含從機(jī)地址、功能碼、數(shù)據(jù)的數(shù)量和CRC錯(cuò)誤校驗(yàn)。
圖 2 – 6的例子是讀取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 |
FDH |
9CH |
圖 2 – 7讀U1,U2,U3 的響應(yīng)數(shù)據(jù)幀
2.4控制DO (功能碼05)
查詢數(shù)據(jù)幀
該數(shù)據(jù)幀強(qiáng)行設(shè)置一個(gè)獨(dú)立的DO為 ON 或OFF,DAE公司產(chǎn)品的內(nèi)部DO有的以集電極開路方式輸出,有的以繼電器輸出,有的還可以選擇電平方式(LATCH)或脈沖方式(PULSE)方式輸出,具體使用請(qǐng)參考產(chǎn)品手冊(cè)。SRTU系列產(chǎn)品的DO的地址從0000H開始(DO1 = 0000H,DO2 = 0001H)。
數(shù)據(jù)FF00H將設(shè)DO為ON狀態(tài),而0000H則將設(shè)DO為OFF 狀態(tài); 所有其它的值都被忽略,并且不影響DO。
下面的例子是請(qǐng)求17號(hào)從機(jī)設(shè)置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 |
8EH |
AAH |
圖示 2-8 控制獨(dú)立的DO查詢
響應(yīng)數(shù)據(jù)幀
對(duì)這個(gè)命令請(qǐng)求的正常響應(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 |
8EH |
AAH |
圖示 2-9 控制獨(dú)立DO的響應(yīng)響應(yīng)
2.5預(yù)置多寄存器(功能碼16)
查詢數(shù)據(jù)幀
功能碼16(十進(jìn)制)(十六進(jìn)制為10H)允許用戶改變多個(gè)寄存器的內(nèi)容,DAE產(chǎn)品的系統(tǒng)內(nèi)部的許多寄存器都可以使用此命令來改變其值。
注意:禁止對(duì)不具有可寫屬性的單元使用此命令改寫。
下面的例子是預(yù)置17號(hào)從機(jī)(EPM420數(shù)據(jù)幀中每個(gè)地址為16位存儲(chǔ)) 正向有功電度EP+為178077833Kwh。 EP+的地址是0040H, EP+占用32位,共4個(gè)字節(jié)。
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 |
A0H |
7CH |
圖示 2-10 預(yù)置EP+
響應(yīng)數(shù)據(jù)幀
對(duì)于預(yù)置單寄存器請(qǐng)求的正常響應(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 |
42H |
8CH |
圖示 2-11 EP+響應(yīng)
|