
一、Modbus Tcp協(xié)議
1、實(shí)現(xiàn)與配置
- 實(shí)現(xiàn)方式和ModbusRtu大體一致,只是報(bào)文不一樣
- 配置方式:新建產(chǎn)品時(shí)通訊協(xié)議選擇ModbusTcp協(xié)議,然后參考網(wǎng)關(guān)與子設(shè)備文檔配置
- 注意:目前只支持把tcp設(shè)備作為客戶端接入系統(tǒng)
2、Modbus Tcp報(bào)文
Modbus TCP 報(bào)文由以下幾個(gè)主要部分組成:
- MBAP 報(bào)文頭(Modbus Application Protocol Header):
- 事務(wù)標(biāo)識(shí)符(Transaction Identifier):用于匹配請(qǐng)求和響應(yīng),通常由客戶端生成。
- 協(xié)議標(biāo)識(shí)符(Protocol Identifier):固定為 0,表示 Modbus 協(xié)議。
- 長(zhǎng)度(Length):后續(xù)數(shù)據(jù)的字節(jié)長(zhǎng)度,包括單元標(biāo)識(shí)符和 PDU (Protocol Data Unit)。
- 單元標(biāo)識(shí)符(Unit Identifier):用于標(biāo)識(shí)從站設(shè)備。
- PDU(Protocol Data Unit):
- 功能碼(Function Code):指示要執(zhí)行的操作,如讀取、寫(xiě)入等。
- 數(shù)據(jù)(Data):根據(jù)功能碼的不同,包含相應(yīng)的操作數(shù)據(jù)。
讀取保持寄存器的請(qǐng)求報(bào)文可能如下:
事務(wù)標(biāo)識(shí)符:0x0001
協(xié)議標(biāo)識(shí)符:0x0000
長(zhǎng)度:0x0006
單元標(biāo)識(shí)符:0x01
功能碼:0x03
起始地址:0x0000
寄存器數(shù)量:0x0002
響應(yīng)報(bào)文中,如果成功讀取到數(shù)據(jù)
事務(wù)標(biāo)識(shí)符:0x0001
協(xié)議標(biāo)識(shí)符:0x0000
長(zhǎng)度:0x0005
單元標(biāo)識(shí)符:0x01
功能碼:0x03
字節(jié)計(jì)數(shù):0x04
數(shù)據(jù):0x000A 0x000B
事務(wù)標(biāo)識(shí)符:
范圍值:0x0000 ~ 0xFFFF 即是 0-65535,如果超出范圍,會(huì)從0開(kāi)始計(jì)算
最重要作用:作為報(bào)文的流水號(hào)
客戶端發(fā)送請(qǐng)求時(shí)會(huì)生成一個(gè)唯一的事務(wù)標(biāo)識(shí)符,服務(wù)器在響應(yīng)時(shí)使用相同的事務(wù)標(biāo)識(shí)符。這使得客戶端能夠?qū)⑹盏降捻憫?yīng)與之前發(fā)送的請(qǐng)求準(zhǔn)確關(guān)聯(lián)起來(lái),確保數(shù)據(jù)的對(duì)應(yīng)性和準(zhǔn)確性。例如,客戶端同時(shí)發(fā)送了多個(gè)不同的請(qǐng)求,如果沒(méi)有事務(wù)標(biāo)識(shí)符,客戶端將難以區(qū)分每個(gè)響應(yīng)對(duì)應(yīng)的是哪個(gè)請(qǐng)求。
采用順序遞增的方式為每個(gè)對(duì)設(shè)備狀態(tài)的讀取請(qǐng)求分配事務(wù)標(biāo)識(shí)符。
這里建議每個(gè)設(shè)備都記錄一下自己的事務(wù)標(biāo)識(shí)符,以便遞增。
例如在redis中記錄這個(gè)設(shè)備A輪詢時(shí)的事務(wù)標(biāo)識(shí)符,從0開(kāi)始,想客戶端下發(fā)一條報(bào)文(客戶端應(yīng)答后),事務(wù)標(biāo)識(shí)符自動(dòng)+1
知道65535后,從0開(kāi)始計(jì)算??蛻舳瞬⒉粫?huì)識(shí)別事務(wù)標(biāo)識(shí)符,如果重復(fù)了客戶端也會(huì)有回復(fù)。
二、各功能碼示例
1. 0x01:讀線圈(云端輪詢)
請(qǐng)求:00 01 00 00 00 06 01 01 00 02 00 04(云端) 00 01:事務(wù)標(biāo)識(shí)符 00 00:Modbus TCP協(xié)議 00 06:后面有00 06個(gè)字節(jié)數(shù)據(jù) 01:?jiǎn)卧獦?biāo)識(shí)符 01:功能碼(讀線圈) 00 02:開(kāi)始讀的數(shù)據(jù)的地址。從00 02開(kāi)始讀數(shù)據(jù)。 00 04:注意這里不是讀到00 04,而是從開(kāi)始位置讀00 04個(gè)數(shù)據(jù)。 這段報(bào)文就是請(qǐng)求讀從 00 00 開(kāi)始的 00 08 個(gè)數(shù)據(jù)。
回應(yīng):00 01 00 00 00 04 01 01 01 0E(設(shè)備) 00 01:事務(wù)標(biāo)識(shí)符 00 00:Modbus TCP協(xié)議 00 04:后面有00 04個(gè)字節(jié)數(shù)據(jù) 01:?jiǎn)卧獦?biāo)識(shí)符 01:功能碼 01:后面有01個(gè)字節(jié)的數(shù)據(jù) 0E:表示所讀地址的線圈全是2的位置是0,其余是1 說(shuō)明:線圈是只有00和01兩種格式,所以圖中從2的位置開(kāi)始讀到的4位數(shù)據(jù)是:1110(二進(jìn)制),轉(zhuǎn)化為十六進(jìn)制就是0E

2. 0x03:讀保持寄存器
請(qǐng)求:00 01 00 00 00 06 01 03 00 02 00 04(云端) 00 01:事務(wù)標(biāo)識(shí)符 00 00:Modbus TCP協(xié)議 00 06:后面有00 06個(gè)字節(jié)數(shù)據(jù) 01:?jiǎn)卧獦?biāo)識(shí)符 03:功能碼(讀保持寄存器) 00 02:開(kāi)始讀的數(shù)據(jù)的地址。從00 02開(kāi)始讀數(shù)據(jù)。 00 04:注意這里不是讀到00 04,而是從開(kāi)始位置讀00 04個(gè)寄存器數(shù)據(jù)。 回應(yīng):00 01 00 00 00 0B 01 03 08 00 00 00 37 00 00 00 00(設(shè)備) 00 01:事務(wù)標(biāo)識(shí)符 00 00:Modbus TCP協(xié)議 00 09:后面有00 09個(gè)字節(jié)數(shù)據(jù) 01:?jiǎn)卧獦?biāo)識(shí)符 03:功能碼 08:后面有08個(gè)字節(jié)的數(shù)據(jù),后面的數(shù)據(jù)每?jī)晌槐硎疽粋€(gè)寄存器數(shù)據(jù)。 00 00:第一個(gè)寄存器數(shù)據(jù) 00 37:第二個(gè)寄存器數(shù)據(jù),圖中我寫(xiě)入的數(shù)據(jù)是55(十進(jìn)制),這里是十六進(jìn)制數(shù)據(jù) 00 00:第三個(gè)寄存器數(shù)據(jù) 00 00:第四個(gè)寄存器數(shù)據(jù)

3.寫(xiě)(單)多個(gè)線圈
首先,將Modbus Slave中的從站地址設(shè)置為:01,寄存器線圈類(lèi)型設(shè)置為:01 Coil Status(0x)。設(shè)置完成后單擊“OK”連接主站,并修改線圈的狀態(tài)。

最后,連接網(wǎng)絡(luò)調(diào)試助手,并將示例中的報(bào)文復(fù)制到網(wǎng)絡(luò)調(diào)試助手中單擊“發(fā)送”,可以觀察到Modbus Slave中對(duì)應(yīng)的線圈狀態(tài)改變。


4.寫(xiě)(單)多個(gè)保持寄存器
首先,將Modbus Slave中的從站地址設(shè)置為:01,寄存器線圈類(lèi)型設(shè)置為:03 Holding Register(4x)。設(shè)置完成后單擊“OK”連接主站,并修改寄存器的值(此處輸入的值為十進(jìn)制)。

最后,連接網(wǎng)絡(luò)調(diào)試助手,并將示例中的報(bào)文復(fù)制到網(wǎng)絡(luò)調(diào)試助手中單擊“發(fā)送”,可以觀察到Modbus Slave中對(duì)應(yīng)的保持寄存器的值改變(此處會(huì)自動(dòng)轉(zhuǎn)換成十進(jìn)制顯示)。

