電力-MODBUS_RTU通訊規(guī)約1
目錄:
一、簡介
1、簡介
2、簡單理解MODBUS通信協(xié)議
3、表1與表2名詞解釋
二、通訊信息傳輸過程
1.1 地址碼
1.2 功能碼
1.3 數(shù)據(jù)區(qū)
三、MODBUS功能碼
3.1 功能碼“02”:讀1路或多路開關(guān)量輸入狀態(tài)
3.2 功能碼“01”:讀1路或多路開關(guān)量輸出狀態(tài)
3.3 功能碼“03”:讀多路寄存器輸入
3.4 功能碼“05”:寫1路開關(guān)量輸出(遙控)
3.5 功能碼“06”:寫單路寄存器
3.6 功能碼“10”:寫多路寄存器
3.7 功能碼“03”:讀事件記錄
四、錯誤校驗碼(CRC校驗)
五、通訊錯誤信息及數(shù)據(jù)的處理
-------------------------------------------------------
相關(guān)參考搜索我的百度網(wǎng)盤“Modbus-國家標(biāo)準(zhǔn)-完整版、ModBus_RTU通訊自定義范例和Modbus TCP_IP協(xié)議規(guī)范”。
--------------------------------------------------------------------------------------------------------------
一、簡介
1、簡介
ModBus通訊規(guī)約允許PDM系列儀表/變送器與施耐德、西門子、AB、GE等多個國際著名品牌的可編程順序控制器(PLC)、RTU、SCADA系統(tǒng)、DCS或與第三方具有ModBus兼容的監(jiān)控系統(tǒng)之間進(jìn)行信息交換和數(shù)據(jù)傳送。
PDM系列儀表/變送器只要簡單地增加一套基于計算機(或工控機)的監(jiān)控軟件(如:組態(tài)王、Intouch、FIX、synall等)就可以構(gòu)成一套電力監(jiān)控系統(tǒng)。
①ModBus通訊規(guī)約有兩種數(shù)據(jù)傳送方式:HEX碼和ASCII碼,分別稱為ModBus-RTU和ModBus-ASCII,前者為數(shù)據(jù)傳送,而后者需將數(shù)據(jù)變換為ASCII碼后傳送,因此ModBus-RTU協(xié)議的通訊效率較高,處理簡單,使用得更多。
②ModBus TCP/IP是RTU模式的延伸:基于ModBus以太網(wǎng)
----------------------------
廣泛的系統(tǒng)集成:
PDM系列儀表/變送器提供了標(biāo)準(zhǔn)的RS-485/422通訊接口及ModBus通訊協(xié)議,這個通訊協(xié)議已廣泛被國內(nèi)外電力行業(yè)及工控行業(yè)作為系統(tǒng)集成的標(biāo)準(zhǔn)。
----------------------------
通訊數(shù)據(jù)的類型及格式:
●信息傳輸為異步方式,并以字節(jié)為單位。在主站和從站之間傳遞的通訊信息是11位的字格式:
字格式(串行數(shù)據(jù)) |
11位二進(jìn)制 |
起始位 |
1位 |
數(shù)據(jù)位 |
8位 |
奇偶校驗位 |
1位:有奇偶校驗位/無:無奇偶校驗位 |
停止位 |
1位:有奇偶校驗位/2位:無奇偶校驗位 |
● 通訊數(shù)據(jù)(信息幀)格式
數(shù)據(jù)格式: |
地址碼 |
功能碼 |
數(shù)據(jù)區(qū) |
錯誤校檢 |
數(shù)據(jù)長度: |
1字節(jié) |
1字節(jié) |
N字節(jié) |
16位CRC碼(冗余循環(huán)碼) |
★ 注:1)1個字節(jié)由8位二進(jìn)制數(shù)組成(既8 bit)
2)ModBus是Modicon公司的注冊商標(biāo)
3)“從機”在本文件中既為PDM
----------------------------
判斷Modbus一幀數(shù)據(jù)結(jié)束的方法:在RTU方式下,ModBus協(xié)議是根據(jù)3.5個字符時間內(nèi)有沒有接收數(shù)據(jù)來判斷是否接受完成。
串行數(shù)據(jù)一般采用11位的字格式,那么3.5個字符就是3.5*11=38.5位。如果沒有校驗位,采用10位的字格式,那么3.5個字符就是
3.5*10=35位。
波特率是每秒傳輸?shù)亩M(jìn)制位的個數(shù),比如9600bps,即每1秒傳輸9600位,那么傳輸38.5個二進(jìn)制位需要的時間:
38.5/9.6=4.0104167mS,Modbus_RTU要求一幀數(shù)據(jù)起始到結(jié)束至少要不小于3.5個字符時間。
先給定時器定時大概3.5個字符(更大點也可以),然后在串口的接收中斷服務(wù)程序中,先將定時器的計數(shù)寄存器清零,然后重新開
始定時,如果接收的不是最后一個字節(jié),那么在下個字節(jié)來的時候定時器就會又從零開始計數(shù),如果后面再沒有數(shù)據(jù)進(jìn)來的話,定
時器就會因為定時時間到而進(jìn)入定時器中斷,就表示數(shù)據(jù)接收結(jié)束了。
-------------------------------------------------------
2、簡單理解MODBUS通信協(xié)議
對于01 16 1000 1234 ABCD這段代碼的含義說明如下:
向地址 01的控制器1000地址處寫入1234 。
地址域:就是指 從站的地址,比如一個儀表,這個地址就是它的通訊地址;
功能碼:就是你要做的事情,通訊的目的 就是讀寫數(shù)據(jù),所以 ModBus 功能碼雖然很多,但是只有兩個是我們常用的,就是讀和
寫。讀的功能碼是03,寫的功能碼是16。注意,這里的讀寫都是一次性寫16個位,也就是一個WORD(包含數(shù)據(jù)地址與數(shù)據(jù)),
功能碼如表2。
----------------------------
表1、ModBus功能碼
功能碼 | 名稱 | 作用 |
1 0x01 | 讀取線圈狀態(tài) | 取得一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF) |
2 0x02 | 讀取輸入狀態(tài) | 取得一組開關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF) |
3 0x03 | 讀取保持寄存器 | 在一個或多個保持寄存器中取得當(dāng)前的二進(jìn)制值 |
4 0x04 | 讀取輸入寄存器 | 在一個或多個輸入寄存器中取得當(dāng)前的二進(jìn)制值 |
5 0x05 | 強置單線圈 | 強置一個邏輯線圈的通斷狀態(tài) |
6 0x06 | 預(yù)置單寄存器 | 把具體二進(jìn)值裝入一個保持寄存器 |
7 0x07 | 讀取異常狀態(tài) | 取得8個內(nèi)部線圈的通斷狀態(tài),這8個線圈的地址由控制器決定,用戶邏輯可以將這些線圈定義,以說明從機狀態(tài),短報文適宜于迅速讀取狀態(tài)。 |
8 0x08 | 回送診斷校驗 | 把診斷校驗報文送從機,以對通信處理進(jìn)行評鑒。 |
9 0x09 | 編程(只用于484) | 使主機模擬編程器作用,修改PC從機邏輯。 |
10 0x0A | 控詢(只用于484) | 可使主機與一臺正在執(zhí)行長程序任務(wù)從機通信,探詢該從機是否已完成其操作任務(wù),僅在含有功能碼9的報文發(fā)送后,本功能碼才發(fā)送。 |
11 0x0B | 讀取事件計數(shù) | 可使主機發(fā)出單詢問,并隨即判定操作是否成功,尤其是該命令或其他應(yīng)答產(chǎn)生通信錯誤時。 |
12 0x0C | 讀取通信事件記錄 | 可是主機檢索每臺從機的ModBus事務(wù)處理通信事件記錄(比如傳送53條報文)。如果某項事務(wù)處理完成,記錄會給出有關(guān)錯誤。 |
13 0x0D | 編程(184/384 484 584) | 可使主機模擬編程器功能修改PC從機邏輯 |
14 0x0E | 探詢(184/384 484 584) | 可使主機與正在執(zhí)行任務(wù)的從機通信,定期控詢該從機是否已完成其程序操作,僅在含有功能13的報文發(fā)送后,本功能碼才得發(fā)送。 |
15 0x0F | 強置多線圈 | 強置一串連續(xù)邏輯線圈的通斷。 |
16 0x10 | 預(yù)置多寄存器 | 把具體的二進(jìn)制值裝入一串連續(xù)的保持寄存器。 |
17 0x11 | 報告從機標(biāo)識 | 可使主機判斷編址從機的類型及該從機運行指示燈的狀態(tài)。 |
18 0x12 | (884和MICRO 84) | 可使主機模擬編程功能,修改PC狀態(tài)邏輯。 |
19 0x13 | 重置通信鏈路 | 發(fā)生非可修改錯誤后,是從機復(fù)位于已知狀態(tài),可重置順序字節(jié)。 |
20 0x14 | 讀取通用參數(shù)(584L) | 顯示擴展存儲器文件中的數(shù)據(jù)信息。 |
21 0x15 | 寫入通用參數(shù)(584L) | 把通用參數(shù)寫入擴展存儲文件,或修改之。 |
22~64 | 保留作擴展功能備用 | |
65~72 | 保留以備用戶功能所用 | 留作用戶功能的擴展編碼 |
73~119 | 非法功能 | |
120~127 | 保留 | 留作內(nèi)部作用 |
128~255 | 保留 | 用于異常應(yīng)答 |
表2、ModBus功能碼與數(shù)據(jù)類型對應(yīng)表
代碼 | 功能 | 數(shù)據(jù)類型 |
1 | 讀 | 位 |
2 | 讀 | 位 |
3 | 讀 | 整型、字符型、狀態(tài)字、浮點型 |
4 | 讀 | 整型、狀態(tài)字、浮點型 |
5 | 寫 | 位 |
6 | 寫 | 整型、字符型、狀態(tài)字、浮點型 |
8 | N/A | 重復(fù)“回路反饋”信息 |
15 | 寫 | 位 |
16 | 寫 | 整型、字符型、狀態(tài)字、浮點型 |
----------------------------
表3、Modbus寄存器
寄存器種類 | 說明 | PLC類比 | 舉例說明 |
離散輸入 狀態(tài)DI |
輸入端口。通過外部設(shè)定改變輸入狀態(tài),可讀但不可寫 | DI數(shù)字量輸入 | 面板上的按鍵、開關(guān)狀態(tài),電機的故障狀態(tài) |
線圈狀態(tài)DO | 輸出端口。可設(shè)定端口的輸出狀態(tài),也可以讀取該位的輸出狀態(tài),可分為兩種不同的執(zhí)行狀態(tài),例如保持型或邊沿觸發(fā)型 | DO數(shù)字量 輸出 |
電磁閥輸出、電機的啟停控制信號、 LED顯示等 |
保持 寄存器AO |
輸出參數(shù)或保持參數(shù),控制器運行時被設(shè)定的某些參數(shù)。 可讀可寫 |
AO模擬量 | 模擬量輸出設(shè)定值,PID運行參數(shù) |
輸入 寄存器AI |
輸入?yún)?shù)。控制器運行時從外部設(shè)備獲得的參數(shù)。 可讀但不可寫 |
AI模擬量輸入 | 模擬量輸入 |
Modbus協(xié)議定義了4種基本數(shù)據(jù)類型:只讀位數(shù)據(jù)DI,可讀寫位數(shù)據(jù)DO,只讀16位數(shù)據(jù)AI,可讀寫16位數(shù)據(jù)AO。這些數(shù)據(jù)分別被稱為輸入狀態(tài),線圈狀態(tài),輸入寄存器,保持寄存器。
DI | 數(shù)字輸入,離散輸入,一個地址一個數(shù)據(jù)位,用戶只能讀取它的狀態(tài),不能修改。 比如面板上的按鍵、開關(guān)狀態(tài),電機的故障狀態(tài) |
DO | 數(shù)字輸出,線圈輸出,一個地址一個數(shù)據(jù)位,用戶可以置位、復(fù)位,可以回讀狀態(tài)。 比如電磁閥輸出,電機的啟停控制信號、LED顯示等 |
AI | 模擬輸入,輸入寄存器,一個地址16位數(shù)據(jù),用戶只能讀,不能修改,比如一個電壓值的讀數(shù) |
AO | 模擬輸出,保持寄存器,一個地址16位數(shù)據(jù),用戶可以寫,也可以回讀,比如一個控制變頻器的電流值 |
無論這些東西被叫做什么名字,其內(nèi)容不外乎這幾種,輸入的信號用戶只能看不能改,輸出的信號用戶控制,并可以回讀。離散的
數(shù)據(jù)只有一位,模擬的數(shù)據(jù)有16位。
----------------------------
數(shù)據(jù) 就是我們傳遞的消息,這個對于我們來說才是最終目的。 1000 1234 就是我們傳遞的消息,是我們要告訴從站的內(nèi)容,它又
分兩部分:地址和內(nèi)容。如果把從站比喻成一個大樓地址域就是大樓的門牌號,而數(shù)據(jù)里的地址就是大樓的房間號,換成變頻器也
就是變頻器的參數(shù)地址。所以這段幀 就是這樣理解:告訴01大樓的1000房間,1234 往01變頻器的1000參數(shù)寫1234。差錯校驗:
是為了防止出錯而做的保護(hù),就是雙方約定的各種計算方法,也就是我們在實際應(yīng)用中的偶校驗、奇校驗、停止位等等。 這里的
ABCD 是隨便寫的,沒任何意義。
-------------------------------------------------------
3、表1與表2名詞解釋
1)功能碼含義
讀:
01_DI: 讀內(nèi)部比特量輸出狀態(tài),如告警、變位、故障、異常等。
02_DO:讀外部開關(guān)量輸入狀態(tài),如光耦輸入、繼電器輸入等。
03_AO:讀內(nèi)部輸出量的寄存器,如一些配置參數(shù)、定值的讀取等。
04_AI: 讀外部輸入量的寄存器,如外部電壓電流模擬量,溫濕度等。
02_DO:讀外部開關(guān)量輸入狀態(tài),如光耦輸入、繼電器輸入等。
03_AO:讀內(nèi)部輸出量的寄存器,如一些配置參數(shù)、定值的讀取等。
04_AI: 讀外部輸入量的寄存器,如外部電壓電流模擬量,溫濕度等。
功能碼01、02讀到的位滿8個組合成一個字節(jié),可以用功能碼04讀取;線圈可以直接定義成一個位變量或者直接置某變量的某一位
寫:
功能碼05:寫內(nèi)部單個開關(guān)量狀態(tài);如光耦輸出、繼電器輸出等。
功能碼06:寫內(nèi)部單個寄存器的值;如更改配置參數(shù)、定值等。
功能碼15:寫內(nèi)部多個開關(guān)量狀態(tài);如同05。
功能碼16:寫內(nèi)部多個寄存器的值;如同06;對時是寫多個寄存器,用此功能碼。
11:通信超時或錯誤時詢問用
12:詢問從機檢測到的各種故障、異常事件
12:詢問從機檢測到的各種故障、異常事件
----------------------------
2)關(guān)于實現(xiàn)
先定義一個變量區(qū)如: uint modbus_data [50],再定義那些保持寄存器和輸入寄存器,如下:
保持寄存器:M30001-M300022 // 存放設(shè)置的參數(shù),用 03讀,16寫
輸入寄存器:M40001-M40028 // 存放實時數(shù)據(jù),如啟動、運行、停止、待機以及錯誤代碼 ,用04讀
#define M30001 modbus_data[0]
#define M30002 modbus_data[1]
…………
#define M30021 modbus_data[20]
#define M30022 modbus_data[21]
#define M40001 modbus_data[22]
#define M40002 modbus_data[23]
…………
#define M400021 modbus_data[48]
#define M400028 modbus_data[49]
參考:www.amobbs.com/thread-3339982-2-1.html
--------------------------------------------------------------------------------------------------------------
二、通訊信息傳輸過程
當(dāng)通訊命令由發(fā)送設(shè)備(主機)發(fā)送至接收設(shè)備(從機)時,符合相應(yīng)地址碼的從機接收通訊命令,并根據(jù)功能碼及相關(guān)要求讀取信息,如果CRC校驗無誤,則執(zhí)行相應(yīng)的任務(wù),然后把執(zhí)行結(jié)果(數(shù)據(jù))返送給主機。返回的信息中包括地址碼、功能碼、執(zhí)行后的數(shù)據(jù)以及CRC校驗碼,如果CRC校驗出錯就不返回任何信息。
1.1 地址碼
地址碼是每次通訊信息幀的第一字節(jié)(8位),從0到255。這個字節(jié)表明由用戶設(shè)置地址的從機將接收由主機發(fā)送來的信息。每個從機都必須有唯一的地址碼,并且只有符合地址碼的從機才能響應(yīng)回送信息。當(dāng)從機回送信息時,回送數(shù)據(jù)均以各自的地址碼開始。主機發(fā)送的地址碼表明將發(fā)送到的從機地址,而從機返回的地址碼表明回送的從機地址。相應(yīng)的地址碼表明該信息來自于何處。
-------------------------------------------------------
1.2 功能碼
功能碼是每次通訊信息幀傳送的第二個字節(jié)。ModBus通訊規(guī)約可定義的功能碼為1到127。PDM系列儀表/變送器僅用到其中的一部分功能碼。作為主機請求發(fā)送,通過功能碼告訴從機應(yīng)執(zhí)行什么動作。作為從機響應(yīng),從機返回的功能碼與從主機發(fā)送來的功能碼一樣,并表明從機已響應(yīng)主機并且已進(jìn)行相關(guān)的操作。
表1 Modbus部分功能碼
功能碼 |
定 義 |
操 作(二進(jìn)制) |
0x02 |
讀開關(guān)量輸入 |
讀取一路或多路開關(guān)量狀態(tài)輸入數(shù)據(jù) |
0x01 |
讀開關(guān)量輸出 |
讀取一路或多路開關(guān)量輸出狀態(tài)數(shù)據(jù) |
0x03 |
讀寄存器數(shù)據(jù) |
讀取一個或多個寄存器的數(shù)據(jù) |
0x05 |
寫開關(guān)量輸出 |
控制一路繼電器“合/分”輸出 |
0x06 |
寫單路寄存器 |
把一組二進(jìn)制數(shù)據(jù)寫入單個寄存器 |
0x10 |
寫多路寄存器 |
把多組二進(jìn)制數(shù)據(jù)寫入多個寄存器 |
-------------------------------------------------------
1.3 數(shù)據(jù)區(qū)
數(shù)據(jù)區(qū)包括需要由從機返送何種信息或執(zhí)行什么動作。這些信息可以是數(shù)據(jù)(如:開關(guān)量輸入/輸出、模擬量輸入/輸出、寄存器等等)、參考地址等。例如,主機通過功能碼03告訴從機返回寄存器的值(包含要讀取寄存器的起始地址及讀取寄存器的長度),則返回的數(shù)據(jù)包括寄存器的數(shù)據(jù)長度及數(shù)據(jù)內(nèi)容。對于不同的從機,地址和數(shù)據(jù)信息都不相同(應(yīng)給出通訊信息表)。
PDM 系列儀表/變送器采用Modbus通訊規(guī)約,主機(PLC、RTU、PC機、DCS等)利用通訊命令(功能碼03),可以任意讀取其數(shù)據(jù)寄存器(其數(shù)據(jù)信息表詳見附錄)。PDM系列儀表/變送器的數(shù)據(jù)寄存器存儲的電量多達(dá)幾百個(如:電流、電壓、功率、0~31次諧波分量等),并且都是16位(2字節(jié))的二進(jìn)制數(shù)據(jù),并且高位在前;一次最多可讀取寄存器數(shù)(既各種電量的數(shù)量)是50個。
PDM響應(yīng)的命令格式是從機地址、功能碼、數(shù)據(jù)區(qū)及CRC碼。數(shù)據(jù)區(qū)的數(shù)據(jù)都是兩個字節(jié),并且高位在前(電能量除外)。
注:1、PDM-820AC/ACM/ACR、PDM-800AC/ACM具有“03”、“06”、“10”功能碼;
2、如果PDM采用MODBUS ASCII通訊協(xié)議,其通訊數(shù)據(jù)格式為;7個數(shù)據(jù)位,1個停止位,偶校驗。
--------------------------------------------------------------------------------------------------------------
三、MODBUS功能碼
3.1 功能碼“02”:讀1路或多路開關(guān)量輸入狀態(tài)
例如:主機要讀取地址為01,開關(guān)量DI1—DI4的輸入狀態(tài)。讀取告警、變位、故障、異常等。
從機(PDM)數(shù)據(jù)寄存器的地址和數(shù)據(jù)為:
起始位地址 |
DI寄存器數(shù)據(jù)(16進(jìn)制) |
備 注 |
0000 |
0B |
DI1/DI2/DI4狀態(tài)為“1”,DI3狀態(tài)為
“0” |
主機發(fā)送的報文格式為:
主機發(fā)送 |
字節(jié)數(shù) |
發(fā)送的信息 |
備 注 |
從機地址 |
1 |
01 |
發(fā)送至地址為01的從機 |
功能碼 |
1 |
02 |
讀開關(guān)量輸入狀態(tài) |
起始BIT位 |
2 |
0000 |
起始BIT位地址為0000 |
讀數(shù)據(jù)長度 |
2 |
0004 |
讀取4路開關(guān)量輸入狀態(tài)位 |
CRC碼 |
2 |
79C9 |
由主機計算得到CRC碼 |
從機(PDM)響應(yīng)返回的報文格式:
從機響應(yīng) |
字節(jié)數(shù) |
返回的信息 |
備 注 |
從機地址 |
1 |
01 |
來自從機01 |
功能碼 |
1 |
02 |
讀開關(guān)量輸入狀態(tài) |
數(shù)據(jù)長度 |
1 |
01 |
1個字節(jié)(8個BIT位) |
DI狀態(tài)數(shù)據(jù) |
1 |
0B |
DI寄存器內(nèi)容 |
CRC碼 |
2 |
E04F |
由從機計算得到CRC碼 |
-------------------------------------------------------
3.2 功能碼“01”:讀1路或多路開關(guān)量輸出狀態(tài)
例如:主機要讀取地址為01,開關(guān)量DO1,DO2的輸出狀態(tài)。讀取電磁閥輸出、電機的啟停控制信號、LED顯示等
從機(PDM)數(shù)據(jù)寄存器的地址和數(shù)據(jù)為:
起始位地址 |
DO寄存器數(shù)據(jù)(16進(jìn)制) |
備 注 |
0000 |
02 |
DO2輸出狀態(tài)為“1”,DO1輸出狀態(tài)為“0” |
主機發(fā)送的報文格式:
主機發(fā)送 |
字節(jié)數(shù) |
發(fā)送的信息 |
備 注 |
從機地址 |
1 |
01 |
發(fā)送至地址為01的從機 |
功能碼 |
1 |
01 |
讀開關(guān)量輸出狀態(tài) |
起始BIT位 |
2 |
0000 |
起始BIT位地址為0000 |
讀數(shù)據(jù)長度 |
2 |
0002 |
讀取2路繼電器輸出狀態(tài)位 |
CRC碼 |
2 |
BDCB |
由主機計算得到CRC碼 |
從機(PDM)響應(yīng)返回的報文格式:
從機響應(yīng) |
字節(jié)數(shù) |
返回的信息 |
備 注 |
從機地址 |
1 |
01 |
來自從機01 |
功能碼 |
1 |
01 |
讀開關(guān)量輸出狀態(tài) |
數(shù)據(jù)長度 |
1 |
01 |
1個字節(jié)(8個BIT位) |
DO狀態(tài)數(shù)據(jù) |
1 |
02 |
DO寄存器內(nèi)容 |
CRC碼 |
2 |
D049 |
由從機計算得到CRC碼 |
-------------------------------------------------------
3.3 功能碼“03”:讀多路寄存器輸入
例如:主機要讀取地址為01,起始地址為0116的3個從機寄存器數(shù)據(jù)。讀取多路定值,比如模擬量輸出設(shè)定值,PID運行參數(shù)
從機(PDM)數(shù)據(jù)寄存器的地址和數(shù)據(jù)為:
寄存器地址 |
寄存器數(shù)據(jù)(16進(jìn)制) |
對應(yīng)PDM電量 |
0116 |
1784 |
UA |
0117 |
1780 |
UB |
0118 |
178A |
UC |
主機發(fā)送的報文格式:
主機發(fā)送 |
字節(jié)數(shù) |
發(fā)送的信息 |
備 注 |
從機地址 |
1 |
01 |
發(fā)送至地址為01的從機 |
功能碼 |
1 |
03 |
讀取寄存器 |
起始地址 |
2 |
0116 |
起始地址為0116 |
數(shù)據(jù)長度 |
3 |
0003 |
讀取3個寄存器(共6個字節(jié)) |
CRC碼 |
2 |
E5F3 |
由主機計算得到CRC碼 |
從機(PDM)響應(yīng)返回的報文格式:
從機響應(yīng) |
字節(jié)數(shù) |
返回的信息 |
備 注 |
從機地址 |
1 |
01 |
來自從機01 |
功能碼 |
1 |
03 |
讀取寄存器 |
讀取字 |
1 |
06 |
3個寄存器共6個字節(jié) |
寄存器數(shù)據(jù)1 |
2 |
1784 |
地址為0116內(nèi)存的內(nèi)容 |
寄存器數(shù)據(jù)2 |
2 |
1780 |
地址為0117內(nèi)存的內(nèi)容 |
寄存器數(shù)據(jù)3 |
2 |
178A |
地址為0118內(nèi)存的內(nèi)容 |
CRC碼 |
2 |
5847 |
由從機計算得到CRC碼 |
-------------------------------------------------------
3.4 功能碼“05”:寫1路開關(guān)量輸出(遙控)
例1:開關(guān)量輸出點DO1,其當(dāng)前狀態(tài)為“分”,主機要控制該路繼電器“合”。強置一個邏輯線圈的通斷狀態(tài)
控制命令為:
“FF00”為控制繼電器“合”;“0000”為控制繼電器“分”;
主機發(fā)送的報文格式:
主機發(fā)送 |
字節(jié)數(shù) |
發(fā)送的信息 |
備 注 |
從機地址 |
1 |
01 |
發(fā)送至地址為01的從機 |
功能碼 |
1 |
05 |
寫開關(guān)量輸出狀態(tài) |
輸出BIT位 |
2 |
0000 |
對應(yīng)輸出繼電器BIT位(DO1) |
控制命令 |
2 |
FF00 |
控制該路繼電器輸出為“合”狀態(tài)位 |
CRC碼 |
2 |
8C3A |
由主機計算得到CRC碼 |
從機(PDM)響應(yīng)返回的報文格式:
與主機發(fā)送的報文格式及數(shù)據(jù)內(nèi)容完全相同。
例2:開關(guān)量輸出點DO2,其當(dāng)前狀態(tài)為“合”,主機要控制該路繼電器“分”。
主機發(fā)送的報文格式:
主機發(fā)送 |
字節(jié)數(shù) |
發(fā)送的信息 |
備 注 |
從機地址 |
1 |
01 |
發(fā)送至地址為01的從機 |
功能碼 |
1 |
05 |
寫開關(guān)量輸出狀態(tài) |
輸出BIT位 |
2 |
0001 |
對應(yīng)輸出繼電器BIT位(DO2) |
控制命令 |
2 |
0000 |
控制該路繼電器輸出為“合”狀態(tài)位 |
CRC碼 |
2 |
9C0A |
由主機計算得到CRC碼 |
從機(PDM)響應(yīng)返回的報文格式:與主機發(fā)送的報文格式及數(shù)據(jù)內(nèi)容完全相同。
-------------------------------------------------------
3.5 功能碼“06”:寫單路寄存器
例如:主機要把數(shù)據(jù)07D0,保存到地址為002C的從機寄存器中去(從機地址碼為01)。通訊數(shù)據(jù)保存結(jié)束后,地址為002C的PDM表原存儲信息為:
地址 |
原來存儲數(shù)據(jù)(16進(jìn)制) |
002C |
04B0 |
主機發(fā)送的報文格式:
主機發(fā)送 |
字節(jié)數(shù) |
發(fā)送的信息 |
舉 例 |
從機地址 |
1 |
01 |
發(fā)送至地址為01的從機 |
功能碼 |
1 |
06 |
寫單路寄存器 |
起始地址 |
2 |
002C |
要寫入的寄存器地址 |
寫入數(shù)據(jù) |
2 |
07D0 |
對應(yīng)的新數(shù)據(jù) |
CRC碼 |
2 |
4BAF |
由主機計算得到的CRC碼 |
從機(PDM)響應(yīng)返回的報文格式: 與主機發(fā)送的報文格式及數(shù)據(jù)內(nèi)容完全相同。
-------------------------------------------------------
3.6 功能碼“10”:寫多路寄存器
主機利用這個功能碼把多個數(shù)據(jù)保存到PDM表的數(shù)據(jù)存儲器中去。Modbus通訊規(guī)約中的寄存器指的是16位(即2字節(jié)),并且高位在前。這樣PDM的存儲器都是二個字節(jié)。由于Modbus通訊規(guī)約允許每次最多保存60個寄存器,因此PDM一次也最多允許保存60個數(shù)據(jù)寄存器。比如對時
例如:主機要把0064,0010保存到地址為002C,002D的從機寄存器中去(從機地址碼為01)。通訊數(shù)據(jù)保存結(jié)束后,地址為002C/002D的PDM表內(nèi)存儲信息為:
地址 |
原來存儲數(shù)據(jù)(16進(jìn)制) |
002C |
04B0 |
002D |
1388 |
主機發(fā)送的報文格式:
主機發(fā)送 |
字節(jié)數(shù) |
發(fā)送信息 |
舉 例 |
從機地址 |
1 |
01 |
發(fā)送至從機01 |
功能碼 |
1 |
10 |
寫多路寄存器 |
起始地址 |
2 |
002C |
要寫入的寄存器的起始地址 |
保存數(shù)據(jù)字長度 |
2 |
0002 |
保存數(shù)據(jù)的字長度(共2字) |
保存數(shù)據(jù)字節(jié)長 |
1 |
04 |
保存數(shù)據(jù)的字節(jié)長度(共4字節(jié)) |
保存數(shù)據(jù)1 |
2 |
04B0 |
數(shù)據(jù)地址002C |
保存數(shù)據(jù)2 |
2 |
1388 |
數(shù)據(jù)地址002D |
CRC碼 |
2 |
FC63 |
由主機計算得到的CRC碼 |
從機(PDM)響應(yīng)返回的報文格式:
從機響應(yīng) |
字節(jié)數(shù) |
字節(jié)數(shù) |
舉 例 |
從機地址 |
1 |
01 |
來自從機01 |
功能碼 |
1 |
10 |
寫多路寄存器 |
起始地址 |
2 |
002C |
起始地址為002C |
保存數(shù)據(jù)字長度 |
2 |
0002 |
保存2個字長度的數(shù)據(jù) |
CRC碼 |
2 |
8001 |
由從機計算得到的CRC碼 |
-------------------------------------------------------
3.7 功能碼“03”:讀事件記錄
采用功能碼03H向保持寄存器地址0x0001,讀一個字,產(chǎn)生讀一個事件記錄的作用。
主站發(fā)送: 從機地址 功能碼 事件記錄地址H 事件記錄地址L 事件記錄個數(shù)H 事件記錄個數(shù)L CRC碼H CRC碼L 01 03 00 01 00 01 D5 CA 子站響應(yīng): 從機地址 功能碼 字節(jié)數(shù) 事件條目數(shù)H 事件條目數(shù)L 事件代碼H
(事件組號) 事件代碼L
(事件代碼) 動作值
02:合; 01:分 01 03 0C 00 01 04 09 02 毫秒L 毫秒H 分鐘 小時 日 月份 年份 CRC碼H CRC碼L A5 4D 19 12 17 01 07 2F EB

--------------------------------------------------------------------------------------------------------------
四、錯誤校驗碼(CRC校驗)
主機或從機可用校驗碼進(jìn)行判別接收信息是否正確。由于電子噪聲或一些其它干擾,信息在傳輸過程中有時會發(fā)生錯誤,錯誤校驗碼(CRC)可以檢驗主機或從機在通訊數(shù)據(jù)傳送過程中的信息是否有誤,錯誤的數(shù)據(jù)可以放棄(無論是發(fā)送還是接收),這樣增加了系統(tǒng)的安全和效率。
MODBUS通訊協(xié)議的CRC(冗余循環(huán)碼)包含2個字節(jié),即16位二進(jìn)制數(shù)。CRC碼由發(fā)送設(shè)備(主機)計算,放置于發(fā)送信息幀的尾部。接收信息的設(shè)備(從機)再重新計算接收到信息的CRC,比較計算得到的CRC是否與接收到的相符,如果兩者不相符,則表明出錯。
在進(jìn)行CRC計算時只用8個數(shù)據(jù)位,起始位及停止位,如有奇偶校驗位也包括奇偶校驗位,都不參與CRC計算。
● CRC碼的計算方法是:
1.預(yù)置1個16位的寄存器為十六進(jìn)制FFFF(即全為1);稱此寄存器為CRC寄存器;
2.把第一個8位二進(jìn)制數(shù)據(jù)(既通訊信息幀的第一個字節(jié))與16位的CRC寄存器的低8位相異或,把結(jié)果放于CRC寄存器;
3.把CRC寄存器的內(nèi)容右移一位(朝低位)用0填補最高位,并檢查右移后的移出位;
4.如果移出位為0:重復(fù)第3步(再次右移一位);
如果移出位為1:CRC寄存器與多項式A001(1010 0000 0000 0001)進(jìn)行異或;
5.重復(fù)步驟3和4,直到右移8次,這樣整個8位數(shù)據(jù)全部進(jìn)行了處理;
6.重復(fù)步驟2到步驟5,進(jìn)行通訊信息幀下一個字節(jié)的處理;
7.將該通訊信息幀所有字節(jié)按上述步驟計算完成后,得到的16位CRC寄存器的高、低字節(jié)進(jìn)行交換;
8.最后得到的CRC寄存器內(nèi)容即為:CRC碼。
--------------------------------------------------------------------------------------------------------------
五、通訊錯誤信息及數(shù)據(jù)的處理
當(dāng)PDM表檢測到除了CRC碼出錯以外的錯誤時,必須向主機回送信息,功能碼的最高位置為1,即從機返送給主機的功能碼是在主機發(fā)送的功能碼的基礎(chǔ)上加128 。以下的這些代碼表明有意外的錯誤發(fā)生。PDM從主機接收到的信息如有CRC錯誤,則將被PDM表忽略。
PDM返送的錯誤碼的格式如下(CRC碼除外):
地址碼: 1字節(jié)
功能碼: 1字節(jié)(最高位為1)
錯誤碼: 1字節(jié)
CRC碼: 2字節(jié)
PDM響應(yīng)回送如下錯誤碼:
81.非法的功能碼。
接收到的功能碼PDM表不支持。
82.非法的數(shù)據(jù)位置。
指定的數(shù)據(jù)位置超出PDM表的范圍。
83.非法的數(shù)據(jù)值。
接收到主機發(fā)送的數(shù)據(jù)值超出PDM相應(yīng)地址的數(shù)據(jù)范圍。
--------------------------------------------------------------------------------------------------------------