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