MODBUS-RTU通信協議簡介

http://m.blog.chinaunix.net/uid-20620288-id-3206545.html#userconsent#html

MODBUS-RTU通信協議簡介
 

 

 

什麼是MODBUS安全

MODBUS MODICON公司最早倡導的一種軟的通信規約,通過大多數公司
 的實際應用,逐漸被承認,成爲一種標準的通信規約,只要按照這種規約進行
數據通信或傳輸,不一樣的系統就能夠通信。目前,在RS232/RS485通信過程當中,
更是普遍採用這種規約。
    經常使用的MODBUS 通信規約有兩種,一種是MODBUS ASCII,一種是MODBUS RTU
 通常來講,通信數據量少並且主要是文本的通信則採用MODBUS ASCII規約,通信數據數據量大並且是二進制數值時,多采用MODBUS RTU規約。
  在實際的應用過程當中,爲了解決某一個特殊問題,人們喜歡本身修改MODBUS規約來知足本身的須要(事實上,人們常用本身定義的規約來通信,這樣能解決問題,但不太規範)。更爲普通的用法是,少許修改規約,但將規約格式附在軟件說明書一塊兒,或直接放在幫助中,這樣就方便了用戶的通信。數據結構

 

MODBUS-RTU通信協議簡介
在本章主要講述如何利用軟件經過通信口來操控該系列儀表。本章內容的掌握須要您具備MODBUS協議的知識儲備而且通讀了本冊其它章節全部內容,對本產品功能和應用概念有較全面瞭解。
本章內容包括:MODBUS協議簡述,通信應用格式詳解,本機的應用細節及參量地址表。
 
1.1          MODBUS協議簡述
ACRXXXE系列儀表使 用的是MODBUS-RTU通信協議,MODBUS協議詳細定義了校驗碼、數據序列等,這些都是特定數據交換的必要內容。MODBUS協議在一根通信線上 使用主從應答式鏈接(半雙工),這意味着在一根單獨的通信線上信號沿着相反的兩個方向傳輸。首先,主計算機的信號尋址到一臺惟一的終端設備(從機),然 後,終端設備發出的應答信號以相反的方向傳輸給主機。
MODBUS協議只容許在主機(PC,PLC等)和終端設備之間通信,而不容許獨立的終端設備之間的數據交換,這樣各終端設備不會在它們初始化時佔據通信線路,而僅限於響應到達本機的查詢信號。
 
1.2          查詢—迴應週期
 
1.2.1           查詢
查 詢消息中的功能代碼告之被選中的從設備要執行何種功能。數據段包含了從設備要執行功能的任何附加信息。例如功能代碼03是要求從設備讀保持寄存器並返回它 們的內容。數據段必須包含要告之從設備的信息:從何寄存器開始讀及要讀的寄存器數量。錯誤檢測域爲從設備提供了一種驗證消息內容是否正確的方法。
1.2.2           迴應
如 果從設備產生一正常的迴應,在迴應消息中的功能代碼是在查詢消息中的功能代碼的迴應。數據段包括了從設備收集的數據:如寄存器值或狀態。若是有錯誤發生, 功能代碼將被修改以用於指出迴應消息是錯誤的,同時數據段包含了描述此錯誤信息的代碼。錯誤檢測域容許主設備確認消息內容是否可用。
 
1.3          傳輸方式
傳輸方式是指一個數據幀內一系列獨立的數據結構以及用於傳輸數據的有限規則,下面定義了與MODBUS 協議– RTU方式相兼容的傳輸方式。
每一個字節的位:
·     1個起始位
·     8個數據位,最小的有效位先發送
·     無奇偶校驗位
·     1箇中止位
錯誤檢測(Error checking):CRC(循環冗餘校驗)
 
1.4          協議
當數據幀到達終端設備時, 它經過一個簡單的「端口」進入被尋址到的設備,該設備去掉數據幀的「信封」(數據頭),讀取數據,若是沒有錯誤,就執行數據所請求的任務,而後,它將本身 生成的數據加入到取得的「信封」中,把數據幀返回給發送者。返回的響應數據中包含了如下內容:終端從機地址(Address)、被執行了的命令(Function)執行命令生成的被請求數據(Data)和一個校驗碼(Check)。發生任何錯誤都不會有成功的響應,或者返回一個錯誤指示幀。
 
1.4.1           數據幀格式
 
Address
Function
Data
Check
8-Bits
8-Bits
N x 8-Bits
16-Bits
 
 
1.4.2           地址(Address)域
地址域在幀的開始部分,由 一個字節(8位二進制碼)組成,十進制爲0~255,在咱們的系統中只使用1~247,其它地址保留。這些位標明瞭用戶指定的終端設備的地址,該設備將接 收來自與之相連的主機數據。每一個終端設備的地址必須是惟一的,僅僅被尋址到的終端會響應包含了該地址的查詢。當終端發送回一個響應,響應中的從機地址數據 便告訴了主機哪臺終端正與之進行通訊。
 
1.4.3           功能(Function)域
功能域代碼告訴了被尋址到的終端執行何種功能。下表列出了該系列儀表用到的功能碼,以及它們的意義和功能。
代碼
意義
行爲
03
讀數據寄存器
得到一個或多個寄存器的當前二進制值
16
預置多寄存器
設定二進制值到一系列多寄存器中(不對ACRXXXE開放)
 
1.4.4           數據(Data)域
數據域包含了終端執行特定 功能所須要的數據或者終端響應查詢時採集到的數據。這些數據的內容多是數值、參考地址或者設置值。例如:功能域碼告訴終端讀取一個寄存器,數據域則須要 指明從哪一個寄存器開始及讀取多少個數據,內嵌的地址和數據依照類型和從機之間的不一樣內容而有所不一樣。
 
1.4.5           錯誤校驗(Check)域
該域容許主機和終端檢查傳 輸過程當中的錯誤。有時,因爲電噪聲和其它干擾,一組數據在從一個設備傳輸到另外一個設備時在線路上可能會發生一些改變,出錯校驗可以保證主機或者終端不去響 應那些傳輸過程當中發生了改變的數據,這就提升了系統的安全性和效率,錯誤校驗使用了16位循環冗餘的方法(CRC16)。
 
1.5          錯誤檢測的方法
錯誤校驗(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寄存器向右移一位,最高位填以0,最低位移出並檢測。
4            若是最低位爲0:重複第三步(下一次移位);若是最低位爲1:將CRC寄存器與一個預設的固定值(0A001H)進行異或運算。
5            重複第三步和第四步直到8次移位。這樣處理完了一個完整的八位。
6            重複第2步到第5步來處理下一個八位,直到全部的字節處理結束。
7       最終CRC寄存器的值就是CRC的值。
此外還有一種利用預設的表格計算CRC的方法,它的主要特色是計算速度快,可是表格須要較大的存儲空間,該方法此處再也不贅述,請參閱相關資料。
 
1.6          通信應用格式祥解
本節所舉實例將盡量的使用如圖所示的格式,(數字爲16進制)。
Addr
Fun
Data start  reg hi
Data start  reg lo
Data #of regs hi
Data #of regs lo
CRC16 lo
CRC16hi
01H
03H
00H
00H
00H
03H
05H
CBH
Addr:從機地址
Fun:功能碼
Data start reg hi:數據起始地址 寄存器高字節
Data start reg lo:數據起始地址 寄存器低字節
Data #of reg hi:數據讀取個數 寄存器高字節
Data #of reg lo:數據讀取個數 寄存器低字節
CRC16 Hi: 循環冗餘校驗 高字節
CRC16 Lo: 循環冗餘校驗 低字節
 
1.6.1           讀數據(功能碼03)
l         查詢數據幀
此功能容許用戶得到設備採集與記錄的數據及系統參數。主機一次請求的數據個數沒有限制,但不能超出定義的地址範圍。
下面的例子是從01號從機讀3個採集到的基本數據(數據幀中每一個地址佔用2個字節)UA、UB、UC,其中UA的地址爲0025H, UB的地址爲0026H, UC的地址爲0027H。
Addr
 Fun
Data start
Addr hi
Datastart
Addr lo
Data#of
regs hi
Data #of
regs lo
CRC16 lo
CRC16 hi
01H
03H
00H
25H
00H
03H
14H
00H
l         響應數據幀
響應包含從機地址、功能碼、數據的數量和CRC錯誤校驗。
下面的例子是讀取UA、UB、UC (UA=082CH,UB=082AH,UC=082CH的響應。
Addr
Fun
Byte count
Data1 hi
Data1 lo
Data2 hi
Data2 lo
Data3 hi
Data3 lo
CRC16 lo
CRC16 hi
01H
03H
06H
08H
2CH
08H
2AH
08H
2CH
94H
4EH
l         錯誤指示碼
若是主機請求的地址不存在則返回錯誤指示碼:FFH。
 
1.6.2           預置多寄存器(功能碼16,不對ACRXXXE開放)
l         查詢數據幀
         功能碼16容許用戶改變多個寄存器的內容,該儀表中系統參數、開關量輸出狀態等可用此功能號寫入。主機一次最多能夠寫入16個(32字節)數據。
 下面的例子是預置ACR220EK、ACR320EFK及ACR420EK地址都爲1時同時輸出開關量Do1和Do2。
ACR220EK:
Addr
Fun
Data Start reg hi
Data start reg lo
Data #of regs hi
Data #of regs lo
Bytecount
Value hi
Value lo
CRC lo
CRC hi
01H
10H
00H
22H
00H
01H
02 H
30H
00H
B4H
D2H
ACR420EK:
Addr
Fun
Data Start reg hi
Data start reg lo
Data #of regs hi
Data #of regs lo
Bytecount
Value hi
Value lo
CRC lo
CRC hi
01H
10H
00H
22H
00H
01H
02 H
C0H
00H
F0H
D2H
ACR320EFK:
Addr
Fun
Data Start reg hi
Data start reg lo
Data #of regs hi
Data #of regs lo
Value hi
Value lo
CRC lo
CRC hi
01H
10H
00H
05H
00H
01H
00H
C0H
0DH
96H
 
l         響應數據幀
對於預置單寄存器請求的正常響應是在寄存器值改變之後迴應機器地址、功能號、數據起始地址、數據個數(ACR320EFK爲數據字節數)、CRC校驗碼。如圖。
ACR220EK和ACR420EK:
Addr
Fun
Data start reg hi
Data start reg lo
Data #of regs hi
Data #of regs lo
CRC16 lo
CRC16 hi
01H
10H
00H
22H
00H
01H
A1H
C3H
 
ACR320EFK:
Addr
Fun
Data start reg hi
Data start reg lo
Bytecount
CRC16 lo
CRC16 hi
01H
10H
00H
05H
02H
9FH
91H
 
l         錯誤指示碼
若是主機請求的地址不存在或數據個數不正確則返回錯誤指示碼:FFH。
 
1.7          ACRXXXE的應用細節及參量地址表
該系列測量值用Modbus-RTU 通信規約的03號命令讀出。
通信值與實際值之間的對應關係以下表:(約定Val_t爲通信讀出值,Val_s爲實際值)
適用參量
對應關係
單位
電壓值UA、UB、UC
Val_s=(Val_t /10000)*(10^DPT)
伏(V)
電流值IA、IB、IC

 

sign
Val_s=(Val_t /10000)*(10^DCT)
安培(A)
功率值PA、 PB、 PC、P、 QA、 QB、QC、Q
Val_s=(-1)  (Val_t /10000)*(10^DPQ)
瓦(W)、
乏(Var)
電度量一次側值EpI、 EpE、EqL、EqC
Val_s=Val_t*PT*CT
瓦時(wh)
乏時(varh)
功率因數值PFA、PFB、PFC、PFS
Val_s=Val_t / 1000
無單位
頻率FR
Val_s=Val_t / 100
赫茲(Hz)
範例:UA的通信讀出值爲08C6H(2246),DPT爲5,則UA的實際值
Va =(2246/10000)*(10^5) = 22.46KV。
                    IA的通信讀出值爲0FA0H(4000),DCT爲3,則IA的實際值
Ia =(4000/10000)*(10^3) = 400.0A。
 
幾點說明:
1           數據類型:「BYTE」指1個字節;「word」 指16位無符號整數;「Integer」指16位有符號整數;「Dword」 指32位無符號整數,「Fword」指32位浮點數。
2           讀寫屬性:「R」只讀,讀參量用03H號命令;「R/W」可讀可寫,寫系統參量用10H號命令。禁止向未列出的或不具可寫屬性的地址寫入。
3                    波特率的設定範圍4800 bps,9600 bps,19200 bps,38400 bps.在此範圍外的設定是不容許的。若是寫入超範圍的設定值,儀表會啓用默認波特率:38400 bps。
4           ACR320EFK所測電能值均爲二次側電能。高字節在前,低字節在後,單位WH 或VARH, 統計一次側電能數據的時候,請乘以相應的變比。例如10KV/100V,75A/5A 的儀表,請在計量抄表的數據乘以PT=100和CT=15 的乘積1500。
5           ACR320EFK 提供4 路開關量輸入功能和2路繼電器開關量輸出功能。4 路開關輸入是採用溼接點電阻開關信號輸入方式,儀表內部配備+5V 的工做電源,無須外部供電。當外部接通的時候,通過儀表開關輸入模塊DI 採集其爲接通訊息、顯示爲1;當外部斷開的時候,通過儀表開關輸入模塊DI 採集其爲斷開信息、顯示爲0。開關量輸入模塊不只可以採集和顯示本地的開關信息,同時能夠經過儀表的數字接口RS485 實現遠程傳輸功能,即「遙信」功能;2路繼電器輸出功能可用於各類場所下的報警指示、保護控制等輸出功能。在開關輸出有效的時候,繼電器輸出導通,顯示爲1;開關輸出關閉的時候,顯示爲0,繼電器輸出關斷。
 
6           ACRXXXE(K)電度一次側時的值採用浮點變量數據類型。它用符號位表示數的符號,用階碼和尾數表示數的大小。儀表採用的數據格式爲IEEE754數據格式具備24位精度,尾數的高位始終爲「1」,於是不保存,位的分佈以下
●        1位符號位;
●        8位指數位;
●        23位尾數。
符號位是最高位,尾數爲最低的23位,按字節描述以下:
地址
+0
+1
+2
+3
內容
SEEE EEEE
EMMM MMMM
MMMM MMMM
MMMM MMMM
其中,     S:符號位,1表示負,0表示正;
E:階碼(在兩個字節中)偏移爲127;
M:23位尾數,最高位爲「1」。
具體舉例以下:
讀出0 10001110 100 1011 1010 1100 0000 0000B
0             表明符號位,「1」爲負,「0」爲正;
10001110 爲計算指數,設爲a, a爲10進制,a爲142;
100 1011 1010 1100 0000 0000 爲計算尾數,設爲b,b爲10進制,b爲4959232。
計算公式:
                  一次側電量= 
上例計算結果爲:
 ==52140
相關文章
相關標籤/搜索