MODBUS-RTU通訊協議簡介


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM