概述
(二)幀結(jié)構(gòu)PDU:PDU由功能碼+數(shù)據(jù)組成。功能碼為1字節(jié),數(shù)據(jù)長(zhǎng)度不定,由具體功能決定。
(1)功能碼:Modbus的操作對(duì)象有四種:線圈、離散輸入、保持寄存器、輸入寄存器。
(2)根據(jù)對(duì)象的不同,Modbus的功能碼有:
(3)說(shuō)明更詳細(xì)的表:
(1)0x01:讀線圈:在從站中讀1~2000個(gè)連續(xù)線圈狀態(tài),ON=1,OFF=0
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 數(shù)量H 數(shù)量L(共12字節(jié)) 響應(yīng):MBAP 功能碼 數(shù)據(jù)長(zhǎng)度 數(shù)據(jù)(一個(gè)地址的數(shù)據(jù)為1位) 如:在從站0x01中,讀取開(kāi)始地址為0x0002的線圈數(shù)據(jù),讀0x0008位
00 01 00 00 00 06 01 01 00 02 00 08回:數(shù)據(jù)長(zhǎng)度為0x01個(gè)字節(jié),數(shù)據(jù)為0x01,第一個(gè)線圈為ON,其余為OFF
00 01 00 00 00 04 01 01 01 01
請(qǐng)求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié)) 響應(yīng):MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié)) 如:將地址為0x0003的線圈設(shè)為ON
00 01 00 00 00 06 01 05 00 03 FF 00回:寫(xiě)入成功
00 01 00 00 00 06 01 05 00 03 FF 00
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 輸出數(shù)量H 輸出數(shù)量L 字節(jié)長(zhǎng)度 輸出值H 輸出值L 響應(yīng):MBAP 功能碼 起始地址H 起始地址L 輸出數(shù)量H 輸出數(shù)量L
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 數(shù)量H 數(shù)量L(共12字節(jié)) 響應(yīng):MBAP 功能碼 數(shù)據(jù)長(zhǎng)度 數(shù)據(jù)(長(zhǎng)度:9+ceil(數(shù)量/8)) 如:從地址0x0000開(kāi)始讀0x0012個(gè)離散量輸入
00 01 00 00 00 06 01 02 00 00 00 12回:數(shù)據(jù)長(zhǎng)度為0x03個(gè)字節(jié),數(shù)據(jù)為0x01 04 00,表示第一個(gè)離散量輸入和第11個(gè)離散量輸入為ON,其余為OFF
00 01 00 00 00 06 01 02 03 01 04 00
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié)) 響應(yīng):MBAP 功能碼 數(shù)據(jù)長(zhǎng)度 寄存器數(shù)據(jù)(長(zhǎng)度:9+寄存器數(shù)量×2) 如:讀起始地址為0x0002,數(shù)量為0x0005的寄存器數(shù)據(jù)
00 01 00 00 00 06 01 04 00 02 00 05回:數(shù)據(jù)長(zhǎng)度為0x0A,第一個(gè)寄存器的數(shù)據(jù)為0x0c,其余為0x00
00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié)) 響應(yīng):MBAP 功能碼 數(shù)據(jù)長(zhǎng)度 寄存器數(shù)據(jù)(長(zhǎng)度:9+寄存器數(shù)量×2) 如:起始地址是0x0000,寄存器數(shù)量是 0x0003
00 01 00 00 00 06 01 03 00 00 00 03回:數(shù)據(jù)長(zhǎng)度為0x06,第一個(gè)寄存器的數(shù)據(jù)為0x21,其余為0x00
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00
請(qǐng)求:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié)) 響應(yīng):MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié)) 如:向地址是0x0000的寄存器寫(xiě)入數(shù)據(jù)0x000A
00 01 00 00 00 06 01 06 00 00 00 0A回:寫(xiě)入成功
00 01 00 00 00 06 01 06 00 00 00 0A
請(qǐng)求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L 字節(jié)長(zhǎng)度 寄存器值(13+寄存器數(shù)量×2) 響應(yīng):MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié)) 如:向起始地址為0x0000,數(shù)量為0x0001的寄存器寫(xiě)入數(shù)據(jù),數(shù)據(jù)長(zhǎng)度為0x02,數(shù)據(jù)為0x000F
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F回:寫(xiě)入成功
00 01 00 00 00 06 01 10 00 00 00 01
ModBusTcp與串行鏈路Modbus的數(shù)據(jù)域是一致的,具體數(shù)據(jù)域可以參考串行Modbus。這里給出幾個(gè)ModbusTcp的鏈路解析說(shuō)明,輔助新人分析報(bào)文。
(一)通信方式
主站請(qǐng)求:功能碼+數(shù)據(jù) 從站正常響應(yīng):請(qǐng)求功能碼+響應(yīng)數(shù)據(jù) 從站異常響應(yīng):異常功能碼+異常碼,其中異常功能碼即將請(qǐng)求功能碼的最高有效位置1,異常碼指示差錯(cuò)類型 需要超時(shí)管理機(jī)制,避免無(wú)期限的等待可能不出現(xiàn)的應(yīng)答 IANA(Internet Assigned Numbers Authority,互聯(lián)網(wǎng)編號(hào)分配管理機(jī)構(gòu))給Modbus協(xié)議賦予TCP端口號(hào)為502,這是目前在儀表與自動(dòng)化行業(yè)中唯一分配到的端口號(hào)。
connect 建立TCP連接 準(zhǔn)備Modbus報(bào)文 使用send命令發(fā)送報(bào)文 在同一連接下等待應(yīng)答 使用recv命令讀取報(bào)文,完成一次數(shù)據(jù)交換 通信任務(wù)結(jié)束時(shí),關(guān)閉TCP連接
Modbus poll 和Modbus slave是一組Modbus仿真軟件,可以實(shí)現(xiàn)Modbus RTU、TCP、串口仿真等。
仿真軟件下載關(guān)注公眾號(hào)回復(fù):Modbuspoll
仿真軟件下載關(guān)注公眾號(hào)回復(fù):Modbusslave
在ModbusTCP中,Modbus poll 作為客戶端請(qǐng)求數(shù)據(jù),Modbus slave 作為服務(wù)器端處理請(qǐng)求。
使用c語(yǔ)言編寫(xiě)客戶端連接Modbus slave時(shí),注意數(shù)據(jù)格式,一條指令一次性發(fā)出,否則連接會(huì)出錯(cuò)。
使用軟件時(shí),需要指定功能碼,在setup->slave definition或者poll definition中進(jìn)行設(shè)置。
– slave ID:從站編號(hào)(事務(wù)標(biāo)識(shí)符)
– function:功能碼,0x01對(duì)應(yīng)線圈操作,0x02對(duì)應(yīng)離散量操作,0x03對(duì)應(yīng)保持寄存器操作,0x04對(duì)應(yīng)輸入寄存器操作
– address:開(kāi)始地址
– quantity:寄存器/線圈/離散量 的數(shù)量免責(zé)聲明:本文轉(zhuǎn)自網(wǎng)絡(luò),版權(quán)歸原作者所有,如涉及作品版權(quán)問(wèn)題,請(qǐng)及時(shí)與我們聯(lián)系刪除,謝謝!