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