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

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