MODBUS協(xié)議簡述及通訊應(yīng)用格式詳解
在本章主要講述如何利用軟件通過通訊口來操控該系列儀表。本章內(nèi)容的掌握需要您具有MODBUS協(xié)議的知識儲備并且通讀了本冊其它章節(jié)所有內(nèi)容,對本產(chǎn)品功能和應(yīng)用概念有較全面了解。
本章內(nèi)容包括:MODBUS協(xié)議簡述,通訊應(yīng)用格式詳解,本機的應(yīng)用細節(jié)及參量地址表。
1.1 MODBUS協(xié)議簡述
ACRXXXE系列儀表使用的是MODBUS-RTU通訊協(xié)議,MODBUS協(xié)議詳細定義了校驗碼、數(shù)據(jù)序列等,這些都是特定數(shù)據(jù)交換的必要內(nèi)容。MODBUS協(xié)議在一根通訊線上使用主從應(yīng)答式連接(半雙工),這意味著在一根單獨的通訊線上信號沿著相反的兩個方向傳輸。首先,主計算機的信號尋址到一臺唯一的終端設(shè)備(從機),然后,終端設(shè)備發(fā)出的應(yīng)答信號以相反的方向傳輸給主機。
MODBUS協(xié)議只允許在主機(PC,PLC等)和終端設(shè)備之間通訊,而不允許獨立的終端設(shè)備之間的數(shù)據(jù)交換,這樣各終端設(shè)備不會在它們初始化時占據(jù)通訊線路,而僅限于響應(yīng)到達本機的查詢信號。
1.2 查詢—回應(yīng)周期
1.2.1 查詢
查詢消息中的功能代碼告之被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí)行功能的任何附加信息。例如功能代碼03是要求從設(shè)備讀保持寄存器并返回它們的內(nèi)容。數(shù)據(jù)段必須包含要告之從設(shè)備的信息:從何寄存器開始讀及要讀的寄存器數(shù)量。錯誤檢測域為從設(shè)備提供了一種驗證消息內(nèi)容是否正確的方法。
1.2.2 回應(yīng)
如果從設(shè)備產(chǎn)生一正常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢消息中的功能代碼的回應(yīng)。數(shù)據(jù)段包括了從設(shè)備收集的數(shù)據(jù):如寄存器值或狀態(tài)。如果有錯誤發(fā)生,功能代碼將被修改以用于指出回應(yīng)消息是錯誤的,同時數(shù)據(jù)段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設(shè)備確認消息內(nèi)容是否可用。
1.3 傳輸方式
傳輸方式是指一個數(shù)據(jù)幀內(nèi)一系列獨立的數(shù)據(jù)結(jié)構(gòu)以及用于傳輸數(shù)據(jù)的有限規(guī)則,下面定義了與MODBUS 協(xié)議– RTU方式相兼容的傳輸方式。
每個字節(jié)的位:
· 1個起始位
· 8個數(shù)據(jù)位,最小的有效位先發(fā)送
· 無奇偶校驗位
· 1個停止位
錯誤檢測(Error checking):CRC(循環(huán)冗余校驗)
1.4 協(xié)議
當(dāng)數(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.4.1 數(shù)據(jù)幀格式
|
Address |
Function |
Data |
Check |
|
8-Bits |
8-Bits |
N x 8-Bits |
16-Bits |
1.4.2 地址(Address)域
地址域在幀的開始部分,由一個字節(jié)(8位二進制碼)組成,十進制為0~255,在我們的系統(tǒng)中只使用1~247,其它地址保留。這些位標明了用戶指定的終端設(shè)備的地址,該設(shè)備將接收來自與之相連的主機數(shù)據(jù)。每個終端設(shè)備的地址必須是唯一的,僅僅被尋址到的終端會響應(yīng)包含了該地址的查詢。當(dāng)終端發(fā)送回一個響應(yīng),響應(yīng)中的從機地址數(shù)據(jù)便告訴了主機哪臺終端正與之進行通信。
1.4.3 功能(Function)域
功能域代碼告訴了被尋址到的終端執(zhí)行何種功能。下表列出了該系列儀表用到的功能碼,以及它們的意義和功能。
|
代碼 |
意義 |
行為 |
|
03 |
讀數(shù)據(jù)寄存器 |
獲得一個或多個寄存器的當(dāng)前二進制值 |
|
16 |
預(yù)置多寄存器 |
設(shè)定二進制值到一系列多寄存器中(不對ACRXXXE開放) |
1.4.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.4.5 錯誤校驗(Check)域
該域允許主機和終端檢查傳輸過程中的錯誤。有時,由于電噪聲和其它干擾,一組數(shù)據(jù)在從一個設(shè)備傳輸?shù)搅硪粋€設(shè)備時在線路上可能會發(fā)生一些改變,出錯校驗?zāi)軌虮WC主機或者終端不去響應(yīng)那些傳輸過程中發(fā)生了改變的數(shù)據(jù),這就提高了系統(tǒng)的安全性和效率,錯誤校驗使用了16位循環(huán)冗余的方法(CRC16)。
1.5 錯誤檢測的方法
錯誤校驗(CRC)域占用兩個字節(jié),包含了一個16位的二進制值。CRC值由傳輸設(shè)備計算出來,然后附加到數(shù)據(jù)幀上,接收設(shè)備在接收數(shù)據(jù)時重新計算CRC值,然后與接收到的CRC域中的值進行比較,如果這兩個值不相等,就發(fā)生了錯誤。
CRC運算時,首先將一個16位的寄存器預(yù)置為全1,然后連續(xù)把數(shù)據(jù)幀中的每個字節(jié)中的8位與該寄存器的當(dāng)前值進行運算,僅僅每個字節(jié)的8個數(shù)據(jù)位參與生成CRC,起始位和終止位以及可能使用的奇偶位都不影響CRC。在生成CRC時,每個字節(jié)的8位與寄存器中的內(nèi)容進行異或,然后將結(jié)果向低位移位,高位則用“0”補充,最低位(LSB)移出并檢測,如果是1,該寄存器就與一個預(yù)設(shè)的固定值(0A001H)進行一次異或運算,如果最低位為0,不作任何處理。
上述處理重復(fù)進行,直到執(zhí)行完了8次移位操作,當(dāng)最后一位(第8位)移完以后,下一個8位字節(jié)與寄存器的當(dāng)前值進行異或運算,同樣進行上述的另一個8次移位異或操作,當(dāng)數(shù)據(jù)幀中的所有字節(jié)都作了處理,生成的最終值就是CRC值。
生成一個CRC的流程為:
1 預(yù)置一個16位寄存器為0FFFFH(全1),稱之為CRC寄存器。
2 把數(shù)據(jù)幀中的第一個字節(jié)的8位與CRC寄存器中的低字節(jié)進行異或運算,結(jié)果存回CRC寄存器。
3 將CRC寄存器向右移一位,最高位填以0,最低位移出并檢測。
4 如果最低位為0:重復(fù)第三步(下一次移位);如果最低位為1:將CRC寄存器與一個預(yù)設(shè)的固定值(0A001H)進行異或運算。
5 重復(fù)第三步和第四步直到8次移位。這樣處理完了一個完整的八位。
6 重復(fù)第2步到第5步來處理下一個八位,直到所有的字節(jié)處理結(jié)束。
7 最終CRC寄存器的值就是CRC的值。
此外還有一種利用預(yù)設(shè)的表格計算CRC的方法,它的主要特點是計算速度快,但是表格需要較大的存儲空間,該方法此處不再贅述,請參閱相關(guān)資料。
1.6 通訊應(yīng)用格式祥解
本節(jié)所舉實例將盡可能的使用如圖所示的格式,(數(shù)字為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:數(shù)據(jù)起始地址 寄存器高字節(jié)
Data start reg lo:數(shù)據(jù)起始地址 寄存器低字節(jié)
Data #of reg hi:數(shù)據(jù)讀取個數(shù) 寄存器高字節(jié)
Data #of reg lo:數(shù)據(jù)讀取個數(shù) 寄存器低字節(jié)
CRC16 Hi: 循環(huán)冗余校驗 高字節(jié)
CRC16 L 循環(huán)冗余校驗 低字節(jié)
1.6.1 讀數(shù)據(jù)(功能碼03)
l 查詢數(shù)據(jù)幀
此功能允許用戶獲得設(shè)備采集與記錄的數(shù)據(jù)及系統(tǒng)參數(shù)。主機一次請求的數(shù)據(jù)個數(shù)沒有限制,但不能超出定義的地址范圍。
下面的例子是從01號從機讀3個采集到的基本數(shù)據(jù)(數(shù)據(jù)幀中每個地址占用2個字節(jié))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 響應(yīng)數(shù)據(jù)幀
響應(yīng)包含從機地址、功能碼、數(shù)據(jù)的數(shù)量和CRC錯誤校驗。
下面的例子是讀取UA、UB、UC (UA=082CH,UB=082AH,UC=082CH的響應(yīng)。
|
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 預(yù)置多寄存器(功能碼16,不對ACRXXXE開放)
l 查詢數(shù)據(jù)幀
功能碼16允許用戶改變多個寄存器的內(nèi)容,該儀表中系統(tǒng)參數(shù)、開關(guān)量輸出狀態(tài)等可用此功能號寫入。主機一次最多可以寫入16個(32字節(jié))數(shù)據(jù)。
下面的例子是預(yù)置ACR220EK、ACR320EFK及ACR420EK地址都為1時同時輸出開關(guān)量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 響應(yīng)數(shù)據(jù)幀
對于預(yù)置單寄存器請求的正常響應(yīng)是在寄存器值改變以后回應(yīng)機器地址、功能號、數(shù)據(jù)起始地址、數(shù)據(jù)個數(shù)(ACR320EFK為數(shù)據(jù)字節(jié)數(shù))、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 錯誤指示碼
如果主機請求的地址不存在或數(shù)據(jù)個數(shù)不正確則返回錯誤指示碼:FFH。
1.7 ACRXXXE的應(yīng)用細節(jié)及參量地址表
該系列測量值用Modbus-RTU 通訊規(guī)約的03號命令讀出。
通訊值與實際值之間的對應(yīng)關(guān)系如下表:(約定Val_t為通訊讀出值,Val_s為實際值)
|
適用參量 |
對應(yīng)關(guān)系 |
單位 | |
|
電壓值UA、UB、UC |
Val_s=(Val_t /10000)*(10^DPT) |
伏(V) | |
|
電流值IA、IB、IC |
|
安培(A) | |
|
功率值PA、 PB、 PC、P、 QA、 QB、QC、Q |
Val_s=(-1) (Val_t /10000)*(10^DPQ) |
瓦(W)、
乏(Var) | |
|
電度量一次側(cè)值EpI、 EpE、EqL、EqC |
Val_s=Val_t*PT*CT |
瓦時(wh)
乏時(varh) | |
|
功率因數(shù)值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 數(shù)據(jù)類型:“BYTE”指1個字節(jié);“word” 指16位無符號整數(shù);“Integer”指16位有符號整數(shù);“Dword” 指32位無符號整數(shù),“Fword”指32位浮點數(shù)。
2 讀寫屬性:“R”只讀,讀參量用03H號命令;“R/W”可讀可寫,寫系統(tǒng)參量用10H號命令。禁止向未列出的或不具可寫屬性的地址寫入。
3 波特率的設(shè)定范圍4800 bps,9600 bps,19200 bps,38400 bps.在此范圍外的設(shè)定是不允許的。如果寫入超范圍的設(shè)定值,儀表會啟用默認波特率:38400 bps。
4 ACR320EFK所測電能值均為二次側(cè)電能。高字節(jié)在前,低字節(jié)在后,單位WH 或VARH, 統(tǒng)計一次側(cè)電能數(shù)據(jù)的時候,請乘以相應(yīng)的變比。例如10KV/100V,75A/5A 的儀表,請在計量抄表的數(shù)據(jù)乘以PT=100和CT=15 的乘積1500。
5 ACR320EFK提供4 路開關(guān)量輸入功能和2路繼電器開關(guān)量輸出功能。4 路開關(guān)輸入是采用濕接點電阻開關(guān)信號輸入方式,儀表內(nèi)部配備+5V 的工作電源,無須外部供電。當(dāng)外部接通的時候,經(jīng)過儀表開關(guān)輸入模塊DI 采集其為接通信息、顯示為1;當(dāng)外部斷開的時候,經(jīng)過儀表開關(guān)輸入模塊DI 采集其為斷開信息、顯示為0。開關(guān)量輸入模塊不僅能夠采集和顯示本地的開關(guān)信息,同時可以通過儀表的數(shù)字接口RS485 實現(xiàn)遠程傳輸功能,即“遙信”功能;2路繼電器輸出功能可用于各種場所下的報警指示、保護控制等輸出功能。在開關(guān)輸出有效的時候,繼電器輸出導(dǎo)通,顯示為1;開關(guān)輸出關(guān)閉的時候,顯示為0,繼電器輸出關(guān)斷。
6 ACRXXXE(K)電度一次側(cè)時的值采用浮點變量數(shù)據(jù)類型。它用符號位表示數(shù)的符號,用階碼和尾數(shù)表示數(shù)的大小。儀表采用的數(shù)據(jù)格式為IEEE754數(shù)據(jù)格式具有24位精度,尾數(shù)的高位始終為“1”,因而不保存,位的分布如下
● 1位符號位;
● 8位指數(shù)位;
● 23位尾數(shù)。
符號位是最高位,尾數(shù)為最低的23位,按字節(jié)描述如下:
|
地址 |
+0 |
+1 |
+2 |
+3 |
|
內(nèi)容 |
SEEE EEEE |
EMMM MMMM |
MMMM MMMM |
MMMM MMMM |
其中, S:符號位,1表示負,0表示正;
E:階碼(在兩個字節(jié)中)偏移為127;
M:23位尾數(shù),最高位為“1”。
具體舉例如下:
讀出0 10001110 100 1011 1010 1100 0000 0000B
0 代表符號位,“1”為負,“0”為正;
10001110 為計算指數(shù),設(shè)為a, a為10進制,a為142;
100 1011 1010 1100 0000 0000 為計算尾數(shù),設(shè)為b,b為10進制,b為4959232。
計算公式:
一次側(cè)電量=
上例計算結(jié)果為:
==52140
本文標簽:MODBUS協(xié)議簡述及通訊應(yīng)用格式詳解
* 由于無法獲得聯(lián)系方式等原因,本網(wǎng)使用的文字及圖片的作品報酬未能及時支付,在此深表歉意,請《MODBUS協(xié)議簡述及通訊應(yīng)用格式詳解》相關(guān)權(quán)利人與機電之家網(wǎng)取得聯(lián)系。
關(guān)于“MODBUS協(xié)議簡述及通訊應(yīng)用格式詳解”的更多資訊










