|
目錄
第一章 MODBUS協議簡介
1.1 傳輸方式
1.2 協議
1.2.1數據幀格式
1.2.2 地址(Address)域
1.2.3 功能(Function)域
1.2.4 數據域
1.2.5錯誤校驗域
1.3 錯誤檢測
第二章MODBUS功能詳解
2.1 讀數字輸出狀態(功能碼01)
2.2 讀數字輸入狀態(功能碼02)
2.3 讀數據(功能碼03)
2.4 控製DO (功能碼05)
2.5 預置多寄存器(功能碼16)
第一章 MODBUS協議簡介
MODBUS協議詳細定義了校驗碼、數據序列等,這些都是特定數據交換的必要內容。
MODBUS協議在一根通訊線上使用主從應答式連接(半雙工),這意味著在一根單獨的通訊線上信號沿著相反的兩個方向傳輸。首先,主計算機的信號尋址到一台唯一的終端設備(從機),然後,終端設備發出的應答信號以相反的方向傳輸給主機。
MODBUSxieyizhiyunxuzaizhujisuanjihezhongduanshebeizhijiantongxun,erbuyunxudulideshebeizhijiandeshujujiaohuan,zheyanggezhongduanshebeibuhuizaitamenchushihuashizhanjutongxunxianlu,erjinxianyuxiangyingdaodabenjidezhaxunxinhao。
1.1 傳輸方式
傳輸方式是一個數據幀內一係列獨立的數據結構以及用於傳輸數據的有限規則,下麵定義了與MODBUS 協議– RTU方式相兼容的傳輸方式。
u Coding System 二進製編碼 8位
u Start bit 起始位 1位
u Data bits 數據位 8位
u Parity 校驗 無奇偶校驗
u Stop bit 停止位 1位
u Error checking 錯誤檢測 CRC(循環冗餘校驗)
[注]瑞士DAE公司的網絡電力儀表響應查詢的時間為0.1 ~ 1.0秒(典型值為0.4秒)
響應查詢的時間指主機命令發出到收到回複的時間。
1.2協議
當數據幀到達終端設備時,它通過一個簡單的“端口”進入被尋址到的設備,該設備去掉數據幀的“信封”(數據頭),讀取數據,如果沒有錯誤,就執行數據所請求的任務,然後,它將自己生成的數據加入到取得的“信封”中,把數據幀返回給發送者。返回的響應數據中包含了以下內容:終端從機地址(Address)、被執行了的命令(Function)、執行命令生成的被請求數據(Data)和一個校驗碼(Check)。發生任何錯誤都不會有成功的響應。
1.2.1數據幀格式
|
Address |
Function |
Data |
Check |
|
8-Bits |
8-Bits |
N x 8-Bits |
16-Bits |
圖 1 – 1 .數據幀格式
1.2.2地址(Address)域
地址域在幀的開始部分,由一個字節8位(0 ~ 255)組(zu)成(cheng),這(zhe)些(xie)位(wei)標(biao)明(ming)了(le)用(yong)戶(hu)指(zhi)定(ding)的(de)終(zhong)端(duan)設(she)備(bei)的(de)地(di)址(zhi),該(gai)設(she)備(bei)將(jiang)接(jie)收(shou)來(lai)自(zi)與(yu)之(zhi)相(xiang)連(lian)的(de)主(zhu)機(ji)數(shu)據(ju)。每(mei)個(ge)終(zhong)端(duan)設(she)備(bei)的(de)地(di)址(zhi)必(bi)須(xu)是(shi)唯(wei)一(yi)的(de),僅(jin)僅(jin)被(bei)尋(xun)址(zhi)到(dao)的(de)終(zhong)端(duan)會(hui)響(xiang)應(ying)包(bao)含(han)了(le)該(gai)地(di)址(zhi)的(de)查(zha)詢(xun)。當(dang)終(zhong)端(duan)發(fa)送(song)回(hui)一(yi)個(ge)響(xiang)應(ying),響(xiang)應(ying)中(zhong)的(de)從(cong)機(ji)地(di)址(zhi)數(shu)據(ju)便(bian)告(gao)訴(su)了(le)主(zhu)機(ji)哪(na)台(tai)終(zhong)端(duan)正(zheng)與(yu)之(zhi)進(jin)行(xing)通(tong)信(xin)。
1.2.3功能(Function)域
功能域代碼告訴了被尋址到的終端執行何種功能。表 1 – 1列出了瑞士DAE網絡電力儀表用到的功能碼,以及它們的意義和功能。
表 1 – 1 功能碼
|
代碼 |
意義 |
行為 |
|
01 |
讀DO狀態 |
獲得數字(繼電器)輸出的當前狀態(ON/OFF) |
|
02 |
讀DI狀態 |
獲得數字輸入的當前狀態(ON/OFF) |
|
03 |
讀數據寄存器 |
獲得一個或多個寄存器的當前二進製值 |
|
05 |
控製DO |
控製數字(繼電器)輸出狀態(ON/OFF) |
|
16 |
預置多寄存器 |
設定二進製值到一係列多寄存器中 |
1.2.4數據(Data)域
數據域包含了終端執行特定功能所需要的數據或者終端響應查詢時采集到的數據。這
些數據的內容可能是數值、參考地址或者設置值。例如:功gong能neng域yu碼ma告gao訴su終zhong端duan讀du取qu一yi個ge寄ji存cun器qi,數shu據ju域yu則ze需xu要yao指zhi明ming從cong哪na個ge寄ji存cun器qi開kai始shi及ji讀du取qu多duo少shao個ge數shu據ju,內nei嵌qian的de地di址zhi和he數shu據ju依yi照zhao類lei型xing和he從cong機ji之zhi間jian的de不bu同tong內nei容rong而er有you所suo不bu同tong。
1.2.5錯誤校驗(Check)域
該域允許主機和終端檢查傳輸過程中的錯誤。有時,由於電噪聲和其它幹擾,一組數
據(ju)在(zai)從(cong)一(yi)個(ge)設(she)備(bei)傳(chuan)輸(shu)到(dao)另(ling)一(yi)個(ge)設(she)備(bei)時(shi)在(zai)線(xian)路(lu)上(shang)可(ke)能(neng)會(hui)發(fa)生(sheng)一(yi)些(xie)改(gai)變(bian),出(chu)錯(cuo)校(xiao)驗(yan)能(neng)夠(gou)保(bao)證(zheng)主(zhu)機(ji)或(huo)者(zhe)終(zhong)端(duan)不(bu)去(qu)響(xiang)應(ying)那(na)些(xie)傳(chuan)輸(shu)過(guo)程(cheng)中(zhong)發(fa)生(sheng)了(le)改(gai)變(bian)的(de)數(shu)據(ju),這(zhe)就(jiu)提(ti)高(gao)了(le)係(xi)統(tong)的(de)安(an)全(quan)性(xing)和(he)效(xiao)率(lv),出(chu)錯(cuo)校(xiao)驗(yan)使(shi)用(yong)了(le)16位循環冗餘的方法(CRC16)。
[注] 發送序列總是相同的 – 地址、功能碼、數據和與方向相關的出錯校驗。
1.3錯誤檢測
循環冗餘校驗(CRC)域占用兩個字節,包含了一個16位的二進製值。CRC值由傳
送設備計算出來,然後附加到數據幀上,接收設備在接收數據時重新計算CRC值,然後與接收到的CRC域中的值進行比較,如果這兩個值不相等,就發生了錯誤。
CRC運算時,首先將一個16位的寄存器預置為全1,然後連續把數據幀中的每個字節中的8位與該寄存器的當前值進行運算,僅僅每個字節的8個數據位參與生成CRC,起始位和終止位以及可能使用的奇偶位都不影響CRC。
在生成CRC時,每個字節的8位與寄存器中的內容進行異或,然後將結果向低位移位,高位則用“0”補充,最低位(LSB)移出並檢測,如果是1,該寄存器就與一個預設的固定值(0A001H)進行一次異或運算,如果最低位為0,不作任何處理。
上述處理重複進行,直到執行完了8次移位操作,當最後一位(第8位)移完以後,下一個8位字節與寄存器的當前值進行異或運算,同樣進行上述的另一個8次移位異或操作,當數據幀中的所有字節都作了處理,生成的最終值就是CRC值。
生成一個CRC的流程為:
1、 預置一個16位寄存器為0FFFFH(全1),稱之為CRC寄存器。
2、 把數據幀中的第一個字節的8位與CRC寄存器中的低字節進行異或運算,結果存回CRC寄存器。
3、 將CRC寄存器向右移一位。
4、 如果最低位為0:重複第三步(下一次移位)。
如果最低位為1:將CRC寄存器與一個預設的固定值(1010 0000 0000 0001)進行異或運算。
5、 重複第三步和第四步直到8次移位。這樣處理完了一個完整的八位。
6、 重複第2步到第5步來處理下一個八位,直到所有的字節處理結束。
7、 最終CRC寄存器得值就是CRC的值。
8、 CRC寄存器發送時將高位、低位互換。
注:
CRC校驗可用插表法和運算法兩種方法實現,具體範例請看附錄。
第二章 MODBUS功能詳解
本章的目標是為使用DAE網wang絡luo電dian力li儀yi表biao構gou造zao係xi統tong的de程cheng序xu員yuan定ding義yi特te定ding有you效xiao命ming令ling的de通tong用yong格ge式shi,在zai每mei條tiao數shu據ju查zha詢xun格ge式shi說shuo明ming的de後hou麵mian有you一yi個ge該gai數shu據ju查zha詢xun所suo執zhi行xing的de功gong能neng的de解jie釋shi和he一yi個ge例li子zi。
第一章已經簡述了協議和數據幀,使用DAE網絡電力儀表的程序員可以使用下述的方法以便通過協議正確地建立與它們通訊的特定應用程序。
本章所述協議將盡可能的使用如圖2 – 1 所示的格式,(數字為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:數據起始地址 寄存器高位
Data start reg lo:數據起始地址 寄存器低位
Data #of reg hi:數據讀取個數 寄存器高位
Data #of reg lo:數據讀取個數 寄存器低位
CRC16 Hi: 循環冗餘校驗 高位
CRC16 Lo: 循環冗餘校驗 低位
圖 2 – 1 協議例述
2.1讀數字輸出狀態(功能碼01)
查詢數據幀
此功能允許用戶獲得指定地址的從機控製的特定地址的DO輸出狀態 ON/OFF(1 = ON , 0 = OFF),除了從機地址和功能域,數據幀還需要在數據域中包含將被讀取DO的初始地址和要讀取的DO數量。SRTU510中DO的地址從0000H開始(DO1=0000H,DO2=0001H)。
圖 2 – 2 的例子是從地址為17的從機讀取DO1到DO6的狀態。
(例如:有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的查詢數據幀
響應數據幀
響應包含從機地址、功能碼、數據的數量和CRC錯誤校驗,數據包中每個DO占用一位(1 = ON , 0 = OFF),第一個字節的最低位為尋址到的DO值,其餘的在後麵。
圖2 – 3 所示為讀數字輸出狀態響應的實例。
(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狀態
|
0 |
0 |
DO6 |
DO5 |
DO4 |
DO3 |
DO2 |
DO1 |
|
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
MSB LSB
圖 2 – 3 讀DO1~DO6狀態的響應數據幀
2.2讀數字輸入狀態(功能碼02)
查詢數據幀
此功能允許用戶獲得DI的狀態 ON / OFF(1 = ON , 0 = OFF),除了從機地址和功能域,數據幀還需要在數據域中包含將被讀取DI的初始地址和要讀取的DI數量。SRTU510中DI的地址從0000H開始(DI1=0000H,DI2=0001H依此類推)。具體地址請查看第三章。
圖 2 – 4 的例子是從地址為17的從機讀取DI1到DI16的狀態。
(例如:SRTU510有16個DI,DI的數量為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的查詢
響應據數幀
響應包含從機地址、功能碼、數據的數量和CRC錯誤校驗,數據幀中每個DI占用一位(1 = ON , 0 = off),第一個字節的最低位為尋址到的DI值,其餘的在後麵。
圖2-5 所示為讀數字輸出狀態( 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狀態的響應
2.3讀數據(功能碼03)
查詢數據幀
此功能允許用戶獲得設備采集與記錄的數據及係統參數。
圖2 – 6 的例子是從17號從機(EPM420)讀3個采集到的基本數據(數據幀中每個地址占用2個字節)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的查詢數據幀
響應數據幀
響應包含從機地址、功能碼、數據的數量和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 的響應數據幀
2.4控製DO (功能碼05)
查詢數據幀
該數據幀強行設置一個獨立的DO為 ON 或OFF,DAE公司產品的內部DO有的以集電極開路方式輸出,有的以繼電器輸出,有的還可以選擇電平方式(LATCH)或脈衝方式(PULSE)方式輸出,具體使用請參考產品手冊。SRTU係列產品的DO的地址從0000H開始(DO1 = 0000H,DO2 = 0001H)。
數據FF00H將設DO為ON狀態,而0000H則將設DO為OFF 狀態; 所有其它的值都被忽略,並且不影響DO。
下麵的例子是請求17號從機設置DO1為ON狀態。
|
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查詢
響應數據幀
對這個命令請求的正常響應是在DO狀態改變以後回傳接收到的數據。
|
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)
查詢數據幀
功能碼16(十進製)(十六進製為10H)允許用戶改變多個寄存器的內容,DAE產品的係統內部的許多寄存器都可以使用此命令來改變其值。
注意:禁止對不具有可寫屬性的單元使用此命令改寫。
下麵的例子是預置17號從機(EPM420數據幀中每個地址為16位存儲) 正向有功電度EP+為178077833Kwh。 EP+的地址是0040H, EP+占用32位,共4個字節。
|
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+
響應數據幀
對於預置單寄存器請求的正常響應是在寄存器值改變以後將接收到的數據傳送回去。
|
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+響應
|