Modbus是一種串行通信協議,是Modicon公司(現在的施耐德電氣Schneider Electric)於1979年為使用可編程邏輯控制器(PLC)通信而發表。Modbus已經成為工業領域通信協議的業界標准(De facto),並且現在是工業電子設備之間常用的連接方式。
廣泛的系統集成:
PDM系列儀表/變送器提供了標准的RS-485/422通訊接口及ModBus通訊協議,這個通訊協議已廣泛被國內外電力行業及工控行業作為系統集成的標准。
通訊數據的類型及格式:
信息傳輸為異步方式,並以字節為單位。在主站和從站之間傳遞的通訊信息是11位的字格式:
| 字格式(串行數據) |
11位二進制 |
| 起始位 |
1位 |
| 數據位 |
8位 |
| 奇偶校驗位 |
1位:有奇偶校驗位/無:無奇偶校驗位 |
| 停止位 |
1位:有奇偶校驗位/2位:無奇偶校驗位 |
● 通訊數據(信息幀)格式
| 數據格式: |
地址碼 |
功能碼 |
數據區 |
錯誤校檢 |
| 數據長度: |
1字節 |
1字節 |
N字節 |
16位CRC碼(冗余循環碼) |
★ 注:1、1個字節由8位二進制數組成(既8 bit)。
2、ModBus是Modicon公司的注冊商標。
3、“從機”在本文件中既為PDM。
一、通訊信息傳輸過程:
當通訊命令由發送設備(主機)發送至接收設備(從機)時,符合相應地址碼的從機接收通訊命令,並根據功能碼及相關要求讀取信息,如果CRC校驗無誤,則執行相應的任務,然后把執行結果(數據)返送給主機。返回的信息中包括地址碼、功能碼、執行后的數據以及CRC校驗碼。如果CRC校驗出錯就不返回任何信息。
1.1 地址碼:
地址碼是每次通訊信息幀的第一字節(8位),從0到255。這個字節表明由用戶設置地址的從機將接收由主機發送來的信息。每個從機都必須有唯一的地址碼,並且只有符合地址碼的從機才能響應回送信息。當從機回送信息時,回送數據均以各自的地址碼開始。主機
發送的地址碼表明將發送到的從機地址,而從機返回的地址碼表明回送的從機地址。相應的地址碼表明該信息來自於何處。
1.2 功能碼:
是每次通訊信息幀傳送的第二個字節。ModBus通訊規約可定義的功能碼為1到127。PDM系列儀表/變送器僅用到其中的一部分功能碼。作為主機請求發送,通過功能碼告訴從機應執行什么動作。作為從機響應,從機返回的功能碼與從主機發送來的功能碼一樣,並表明從機已響應主機並且已進行相關的操作。
表8.1 MODBUS部分功能碼
| 功能碼 |
定 義 |
操 作(二進制) |
| 02 |
讀開關量輸入 |
讀取一路或多路開關量狀態輸入數據 |
| 01 |
讀開關量輸出 |
讀取一路或多路開關量輸出狀態數據 |
| 03 |
讀寄存器數據 |
讀取一個或多個寄存器的數據 |
| 05 |
寫開關量輸出 |
控制一路繼電器“合/分”輸出 |
| 06 |
寫單路寄存器 |
把一組二進制數據寫入單個寄存器 |
| 10 |
寫多路寄存器 |
把多組二進制數據寫入多個寄存器 |
1.3 數據區:
數據區包括需要由從機返送何種信息或執行什么動作。這些信息可以是數據(如:開關量輸入/輸出、模擬量輸入/輸出、寄存器等等)、參考地址等。例如,主機通過功能碼03告訴從機返回寄存器的值(包含要讀取寄存器的起始地址及讀取寄存器的長度),則返回的數據包括寄存器的數據長度及數據內容。對於不同的從機,地址和數據信息都不相同(應給出通訊信息表)。
PDM系列儀表/變送器采用Modbus通訊規約,主機(PLC、RTU、PC機、DCS等)利用通訊命令(功能碼03),可以任意讀取其數據寄存器(其數據信息表詳見附錄)。PDM系列儀表/變送器的數據寄存器存儲的電量多達幾百個(如:電流、電壓、功率、0~31次諧波分量等),並且都是16位(2字節)的二進制數據,並且高位在前;一次最多可讀取寄存器數(既各種電量的數量)是50個。
PDM響應的命令格式是從機地址、功能碼、數據區及CRC碼。數據區的數據都是兩個字節,並且高位在前(電能量除外)。
注:1、PDM-820AC/ACM/ACR、PDM-800AC/ACM具有“03”、“06”、“10”功能碼;
2、如果PDM采用MODBUS ASCII通訊協議,其通訊數據格式為;7個數據位,1個
停止位,偶校驗。
二、MODBUS功能碼簡介
2.1 功能碼“02”:讀1路或多路開關量狀態輸入
例如:主機要讀取地址為01,開關量DI1—DI4的輸入狀態。
從機(PDM)數據寄存器的地址和數據為:
| 起始位地址 |
DI寄存器數據(16進制) |
備 注 |
| 0000 |
0B |
DI1/DI2/DI4狀態為“1”,DI3狀態為“0” |
主機發送的報文格式:
| 主機發送 |
字節數 |
發送的信息 |
備 注 |
| 從機地址 |
1 |
01 |
發送至地址為01的從機 |
| 功能碼 |
1 |
02 |
讀開關量輸入狀態 |
| 起始BIT位 |
2 |
0000 |
起始BIT位地址為0000 |
| 讀數據長度 |
2 |
0004 |
讀取4路開關量輸入狀態位 |
| CRC碼 |
2 |
79C9 |
由主機計算得到CRC碼 |
從機(PDM)響應返回的報文格式:
| 從機響應 |
字節數 |
返回的信息 |
備 注 |
| 從機地址 |
1 |
01 |
來自從機01 |
| 功能碼 |
1 |
02 |
讀開關量輸入狀態 |
| 數據長度 |
1 |
01 |
1個字節(8個BIT位) |
| DI狀態數據 |
1 |
0B |
DI寄存器內容 |
| CRC碼 |
2 |
E04F |
由從機計算得到CRC碼 |
2.2 功能碼“01”:讀1路或多路開關量輸出狀態
例如:主機要讀取地址為01,開關量DO1,DO2的輸出狀態。
從機(PDM)數據寄存器的地址和數據為:
| 起始位地址 |
DO寄存器數據(16進制) |
備 注 |
| 0000 |
02 |
DO2輸出狀態為“1”,DO1輸出狀態為“0” |
主機發送的報文格式:
| 主機發送 |
字節數 |
發送的信息 |
備 注 |
| 從機地址 |
1 |
01 |
發送至地址為01的從機 |
| 功能碼 |
1 |
01 |
讀開關量輸出狀態 |
| 起始BIT位 |
2 |
0000 |
起始BIT位地址為0000 |
| 讀數據長度 |
2 |
0002 |
讀取2路繼電器輸出狀態位 |
| CRC碼 |
2 |
BDCB |
由主機計算得到CRC碼 |
從機(PDM)響應返回的報文格式:
| 從機響應 |
字節數 |
返回的信息 |
備 注 |
| 從機地址 |
1 |
01 |
來自從機01 |
| 功能碼 |
1 |
01 |
讀開關量輸出狀態 |
| 數據長度 |
1 |
01 |
1個字節(8個BIT位) |
| DO狀態數據 |
1 |
02 |
DO寄存器內容 |
| CRC碼 |
2 |
D049 |
由從機計算得到CRC碼 |
2.3 功能碼“03”:讀多路寄存器輸入
例如:主機要讀取地址為01,起始地址為0116的3個從機寄存器數據。
從機(PDM)數據寄存器的地址和數據為:
| 寄存器地址 |
寄存器數據(16進制) |
對應PDM電量 |
| 0116 |
1784 |
UA |
| 0117 |
1780 |
UB |
| 0118 |
178A |
UC |
主機發送的報文格式:
| 主機發送 |
字節數 |
發送的信息 |
備 注 |
| 從機地址 |
1 |
01 |
發送至地址為01的從機 |
| 功能碼 |
1 |
03 |
讀取寄存器 |
| 起始地址 |
2 |
0116 |
起始地址為0116 |
| 數據長度 |
3 |
0003 |
讀取3個寄存器(共6個字節) |
| CRC碼 |
2 |
E5F3 |
由主機計算得到CRC碼 |
從機(PDM)響應返回的報文格式:
| 從機響應 |
字節數 |
返回的信息 |
備 注 |
| 從機地址 |
1 |
01 |
來自從機01 |
| 功能碼 |
1 |
03 |
讀取寄存器 |
| 讀取字 |
1 |
06 |
3個寄存器共6個字節 |
| 寄存器數據1 |
2 |
1784 |
地址為0116內存的內容 |
| 寄存器數據2 |
2 |
1780 |
地址為0117內存的內容 |
| 寄存器數據3 |
2 |
178A |
地址為0118內存的內容 |
| CRC碼 |
2 |
5847 |
由從機計算得到CRC碼 |
2.4 功能碼“05”:寫1路開關量輸出(“遙控”)
例1:開關量輸出點DO1,其當前狀態為“分”,主機要控制該路繼電器“合”。
控制命令為:
“FF00”為控制繼電器“合”;
“0000”為控制繼電器“分”;
主機發送的報文格式:
| 主機發送 |
字節數 |
發送的信息 |
備 注 |
| 從機地址 |
1 |
01 |
發送至地址為01的從機 |
| 功能碼 |
1 |
05 |
寫開關量輸出狀態 |
| 輸出BIT位 |
2 |
0000 |
對應輸出繼電器BIT位(DO1) |
| 控制命令 |
2 |
FF00 |
控制該路繼電器輸出為“合”狀態位 |
| CRC碼 |
2 |
8C3A |
由主機計算得到CRC碼 |
從機(PDM)響應返回的報文格式:
與主機發送的報文格式及數據內容完全相同。
例2:開關量輸出點DO2,其當前狀態為“合”,主機要控制該路繼電器“分”。
主機發送的報文格式:
| 主機發送 |
字節數 |
發送的信息 |
備 注 |
| 從機地址 |
1 |
01 |
發送至地址為01的從機 |
| 功能碼 |
1 |
05 |
寫開關量輸出狀態 |
| 輸出BIT位 |
2 |
0001 |
對應輸出繼電器BIT位(DO2) |
| 控制命令 |
2 |
0000 |
控制該路繼電器輸出為“合”狀態位 |
| CRC碼 |
2 |
9C0A |
由主機計算得到CRC碼 |
從機(PDM)響應返回的報文格式:
與主機發送的報文格式及數據內容完全相同。
2.5 功能碼“06”:寫單路寄存器
例如:主機要把數據07D0,保存到地址為002C的從機寄存器中去(從機地址碼為01)。通訊數據保存結束后,地址為002C的PDM表原存儲信息為:
| 地址 |
原來存儲數據(16進制) |
| 002C |
04B0 |
主機發送的報文格式:
| 主機發送 |
字節數 |
發送的信息 |
舉例 |
| 從機地址 |
1 |
01 |
發送至地址為01的從機 |
| 功能碼 |
1 |
06 |
寫單路寄存器 |
| 起始地址 |
2 |
002C |
要寫入的寄存器地址 |
| 寫入數據 |
2 |
07D0 |
對應的新數據 |
| CRC碼 |
2 |
4BAF |
由主機計算得到的CRC碼 |
從機(PDM)響應返回的報文格式:
與主機發送的報文格式及數據內容完全相同。
2.6功能碼“10”:寫多路寄存器
主機利用這個功能碼把多個數據保存到PDM表的數據存儲器中去。Modbus通訊規約中的寄存器指的是16位(即2字節),並且高位在前。這樣PDM的存儲器都是二個字節。由於Modbus通訊規約允許每次最多保存60個寄存器,因此PDM一次也最多允許保存60個數據寄存器。
例如:主機要把0064,0010保存到地址為002C,002D的從機寄存器中去(從機地址碼為01)。通訊數據保存結束后,地址為002C/002D的PDM表內存儲信息為:
| 地址 |
原來存儲數據(16進制) |
| 002C |
04B0 |
| 002D |
1388 |
主機發送的報文格式:
| 主機發送 |
字節數 |
發送信息 |
舉例 |
| 從機地址 |
1 |
01 |
發送至從機01 |
| 功能碼 |
1 |
10 |
寫多路寄存器 |
| 起始地址 |
2 |
002C |
要寫入的寄存器的起始地址 |
| 保存數據字長度 |
2 |
0002 |
保存數據的字長度(共2字) |
| 保存數據字節長 |
1 |
04 |
保存數據的字節長度(共4字節) |
| 保存數據1 |
2 |
04B0 |
數據地址002C |
| 保存數據2 |
2 |
1388 |
數據地址002D |
| CRC碼 |
2 |
FC63 |
由主機計算得到的CRC碼 |
從機(PDM)響應返回的報文格式:
| 從機響應 |
字節數 |
字節數 |
舉例 |
| 從機地址 |
1 |
01 |
來自從機01 |
| 功能碼 |
1 |
10 |
寫多路寄存器 |
| 起始地址 |
2 |
002C |
起始地址為002C |
| 保存數據字長度 |
2 |
0002 |
保存2個字長度的數據 |
| CRC碼 |
2 |
8001 |
由從機計算得到的CRC碼 |
三、錯誤校驗碼(CRC校驗):
主機或從機可用校驗碼進行判別接收信息是否正確。由於電子噪聲或一些其它干擾,信息在傳輸過程中有時會發生錯誤,錯誤校驗碼(CRC)可以檢驗主機或從機在通訊數據傳送過程中的信息是否有誤,錯誤的數據可以放棄(無論是發送還是接收),這樣增加了系統的安全和效率。
MODBUS通訊協議的CRC(冗余循環碼)包含2個字節,即16位二進制數。CRC碼由發送設備(主機)計算,放置於發送信息幀的尾部。接收信息的設備(從機)再重新計算接收到信息的CRC,比較計算得到的CRC是否與接收到的相符,如果兩者不相符,則表明出錯。
在進行CRC計算時只用8個數據位,起始位及停止位,如有奇偶校驗位也包括奇偶校驗位,都不參與CRC計算。
● CRC碼的計算方法是:
1.預置1個16位的寄存器為十六進制FFFF(即全為1);稱此寄存器為CRC寄存器;
2.把第一個8位二進制數據(既通訊信息幀的第一個字節)與16位的CRC寄存器的低
8位相異或,把結果放於CRC寄存器;
3.把CRC寄存器的內容右移一位(朝低位)用0填補最高位,並檢查右移后的移出位;
4.如果移出位為0:重復第3步(再次右移一位);
如果移出位為1:CRC寄存器與多項式A001(1010 0000 0000 0001)進行異或;
5.重復步驟3和4,直到右移8次,這樣整個8位數據全部進行了處理;
6.重復步驟2到步驟5,進行通訊信息幀下一個字節的處理;
7.將該通訊信息幀所有字節按上述步驟計算完成后,得到的16位CRC寄存器的高、低
字節進行交換;
8.最后得到的CRC寄存器內容即為:CRC碼。
四、通訊錯誤信息及數據的處理:
當PDM表檢測到除了CRC碼出錯以外的錯誤時,必須向主機回送信息,功能碼的最高位置為1,即從機返送給主機的功能碼是在主機發送的功能碼的基礎上加128 。以下的這些代碼表明有意外的錯誤發生。
PDM從主機接收到的信息如有CRC錯誤,則將被PDM表忽略。
PDM返送的錯誤碼的格式如下(CRC碼除外):
地址碼: 1字節
功能碼: 1字節(最高位為1)
錯誤碼: 1字節
CRC碼:2字節。
PDM響應回送如下錯誤碼:
81.非法的功能碼。
接收到的功能碼PDM表不支持。
82.非法的數據位置。
指定的數據位置超出PDM表的范圍。
83.非法的數據值。
接收到主機發送的數據值超出PDM相應地址的數據范圍。
