在工業(yè)自動(dòng)化系統(tǒng)中,Modbus協(xié)議作為最經(jīng)典的現(xiàn)場(chǎng)通信標(biāo)準(zhǔn)之一,憑借結(jié)構(gòu)清晰、兼容性強(qiáng)的特點(diǎn),廣泛應(yīng)用于控制器、傳感器及監(jiān)控系統(tǒng)之間的數(shù)據(jù)交互。本文將簡(jiǎn)要說(shuō)明聯(lián)誠(chéng)科技LicOS PLC/PAC在作為Modbus服務(wù)器時(shí)的地址結(jié)構(gòu)與通信機(jī)制,幫助開發(fā)者和集成商快速理解與部署系統(tǒng)。
基本功能與意義
在LicOS PLC/PAC中,Modbus地址的作用主要體現(xiàn)在以下四個(gè)方面:
數(shù)據(jù)標(biāo)識(shí)與定位
每個(gè)地址對(duì)應(yīng)PLC內(nèi)部的特定數(shù)據(jù)區(qū)域,如線圈、輸入寄存器、保持寄存器等。通過(guò)地址,客戶端可以準(zhǔn)確訪問(wèn)或修改目標(biāo)數(shù)據(jù)。
數(shù)據(jù)交互與通信
客戶端通過(guò)讀寫特定地址完成與PLC的實(shí)時(shí)通信,實(shí)現(xiàn)數(shù)據(jù)采集與控制命令的下發(fā)。
設(shè)備互聯(lián)與兼容
清晰的地址規(guī)則使LicOS設(shè)備能與其他支持Modbus協(xié)議的系統(tǒng)實(shí)現(xiàn)無(wú)縫互聯(lián)。
系統(tǒng)配置與維護(hù)便利
明確的地址映射可降低系統(tǒng)調(diào)試與后期維護(hù)的復(fù)雜度,提高項(xiàng)目實(shí)施效率。
Modbus通訊格式有三種,這是根據(jù)物理層/傳輸層而做的適配。根據(jù)TCP等傳輸層協(xié)議的特點(diǎn),Modbus搖身一變,就成為了ModbusTCP,使用RS485、RS232等串行物理層協(xié)議,Modbus就形成了ModbusRTU和ModbusASCII。
本教程基于以下開發(fā)條件:
軟件:
Smart Control V5.0、Modbus Toolkit 5、SCOMM
網(wǎng)絡(luò)拓?fù)洌?/span>

Modbus TCP
Modbus TCP協(xié)議的數(shù)據(jù)格式由三部分組成:MBAP + 功能碼 + 數(shù)據(jù)。
其中 MBAP 含四個(gè)字段:事務(wù)標(biāo)識(shí)符、協(xié)議標(biāo)識(shí)符、長(zhǎng)度、單元標(biāo)識(shí)符。
事務(wù)標(biāo)識(shí)符(2字節(jié)):表示數(shù)據(jù)序號(hào),每發(fā)送一次數(shù)據(jù)可自增或保持不變;
協(xié)議標(biāo)識(shí)符(2字節(jié)):固定為00;
長(zhǎng)度(2字節(jié)):表示后續(xù)數(shù)據(jù)的長(zhǎng)度;
單元標(biāo)識(shí)符:相當(dāng)于串行從機(jī)地址。
示例:從機(jī)返回?cái)?shù)據(jù) 0001 0000 0005 03 04 02 0006
其中 0001 為消息序號(hào),0000 表示Modbus TCP協(xié)議,0005 為后續(xù)數(shù)據(jù)長(zhǎng)度,03 為單元標(biāo)識(shí)符,04 為功能碼,02 表示數(shù)據(jù)長(zhǎng)度為2字節(jié),0006 為寄存器數(shù)據(jù)。
1. 報(bào)文頭MBAP
MBAP為報(bào)文頭,長(zhǎng)度為7字節(jié),組成如下:

報(bào)文格式

報(bào)文格式解釋
從機(jī)返回響應(yīng)數(shù)據(jù):

從機(jī)返回響應(yīng)數(shù)據(jù)結(jié)構(gòu)圖
2. 幀結(jié)構(gòu)PDU
幀結(jié)構(gòu)PDU由功能碼+數(shù)據(jù)組成。功能碼為1字節(jié),數(shù)據(jù)長(zhǎng)度不定,由具體功能決定。
功能碼
Modbus的操作對(duì)象有四種:線圈、離散輸入、保持寄存器、輸入寄存器。

功能碼解釋
根據(jù)對(duì)象的不同,Modbus的功能碼有:

功能碼類型
3. 服務(wù)器配置
PLC/PAC作為ModbusTCP服務(wù)器,有以下幾個(gè)參數(shù),如下圖所示:

ModbusTCP服務(wù)器配置
l Base Info Config-基本信息
Enable or Disable:TRUE啟用PLC的 ModbusTCP從站功能:FALSE關(guān)閉PLC的ModbusTCP從站功能。
Port ID:端口號(hào)。
Max Connection:最大連接數(shù)量。
l Filter Info Config-過(guò)濾信息
Enable Filter:TRUE啟用IP過(guò)濾功能,F(xiàn)ALSE關(guān)閉IP過(guò)濾功能。
Mask:允許接入的客戶端所處網(wǎng)段的子網(wǎng)掩碼。
Start IP:允許接入的客戶端所處網(wǎng)段的起始IP。
End IP:允許接入的客戶端所處網(wǎng)段的結(jié)束IP。
l Clients Info:連接信息,連接數(shù)量及IP信息
Nummber ofclient:已經(jīng)接入的客戶端數(shù)量。
IP ofclient:當(dāng)有多個(gè)客戶端接入時(shí),輪詢顯示接入客戶端的IP、端口信息,顯示格式如下圖所示。
![]()
接入設(shè)備IP信息
4. 0x01:讀多個(gè)線圈
在從站中讀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中,讀取開始地址為0x0000的線圈數(shù)據(jù),讀0x0008位
00 02 00 00 00 06 01 01 00 00 00 08
回:數(shù)據(jù)長(zhǎng)度為0x01個(gè)字節(jié),數(shù)據(jù)為0x01,第一個(gè)線圈為ON,其余為OFF
00 02 00 00 00 04 01 01 01 01
00000001

讀多個(gè)線圈
5. 0x02:讀多個(gè)離散量輸入
在從站中讀1~2000個(gè)連續(xù)的離散量輸入狀態(tài)
請(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開始讀0x0008個(gè)離散量輸入
00 03 00 00 00 06 01 02 00 00 00 08
回:數(shù)據(jù)長(zhǎng)度為0x01個(gè)字節(jié),數(shù)據(jù)為0x01,第一個(gè)離散量輸入為ON,其余為OFF
00 03 00 00 00 04 01 02 01 01
00000001

讀多個(gè)離散量輸入
6. 0x03:讀多個(gè)保持寄存器
在從站中讀保持寄存器連續(xù)塊的內(nèi)容
請(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 04 00 00 00 06 01 03 00 00 00 03
回:數(shù)據(jù)長(zhǎng)度為0x06,第一個(gè)寄存器的數(shù)據(jù)為0x05,第二個(gè)寄存器的數(shù)據(jù)為0x06,其余為0x00
00 04 00 00 00 09 01 03 06 00 05 00 06 00 00
5,6,0

讀多個(gè)保持寄存器
7. 0x04:讀多個(gè)輸入寄存器
在從站中讀1~2000個(gè)連續(xù)輸入寄存器
請(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ù)量為0x0005的寄存器數(shù)據(jù)
00 05 00 00 00 06 01 04 00 00 00 05
回:數(shù)據(jù)長(zhǎng)度為0x0A,第一個(gè)寄存器的數(shù)據(jù)為0x0B,第一個(gè)寄存器的數(shù)據(jù)為0x16,其余為0x00
00 05 00 00 00 0D 01 04 0A 00 0B 00 16 00 00 00 00 00 00
11,22,0,0,0

讀多個(gè)輸入寄存器
8. 0x05:寫單個(gè)線圈
在從站中的一個(gè)輸出寫成ON或OFF
請(qǐng)求:MBAP功能碼 輸出地址H輸出地址L輸出值H輸出值L(共12字節(jié))
響應(yīng):MBAP功能碼 輸出地址H輸出地址L輸出值H輸出值L(共12字節(jié))
如:將地址為0x0003的線圈設(shè)為ON
00 07 00 00 00 06 01 05 00 03 FF 00
回:寫入成功
00 07 00 00 00 06 01 05 00 03 FF 00
TRUE

寫單個(gè)線圈
9. 0x06:寫單個(gè)保持寄存器
在從站中寫一個(gè)保持寄存器
請(qǐng)求:MBAP功能碼寄存器地址H寄存器地址L寄存器值H寄存器值L(共12字節(jié))
響應(yīng):MBAP功能碼寄存器地址H寄存器地址L寄存器值H寄存器值L(共12字節(jié))
如:向地址是0x0000的寄存器寫入數(shù)據(jù)0x000A
00 08 00 00 00 06 01 06 00 00 00 0A
回:寫入成功
00 08 00 00 00 06 01 06 00 00 00 0A
10

寫單個(gè)保持寄存器
10. 0x10:寫多個(gè)保持寄存器
在一個(gè)遠(yuǎn)程設(shè)備中寫連續(xù)寄存器(1~123個(gè)寄存器)
請(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的寄存器寫入數(shù)據(jù),數(shù)據(jù)長(zhǎng)度為0x02,數(shù)據(jù)為0x000F
00 00 00 00 00 09 01 10 00 00 00 01 02 00 0F
回:寫入成功
00 00 00 00 00 06 01 10 00 00 00 01
1

寫多個(gè)保持寄存器
11. 0x0F:寫多個(gè)線圈
將一個(gè)從站中的一個(gè)線圈序列的每個(gè)線圈都強(qiáng)制為ON或OFF,數(shù)據(jù)域中置1的位請(qǐng)求相應(yīng)輸出位ON,置0的位請(qǐng)求響應(yīng)輸出為OFF
請(qǐng)求:MBAP功能碼起始地址H起始地址L輸出數(shù)量H輸出數(shù)量L字節(jié)長(zhǎng)度輸出值H輸出值L
響應(yīng):MBAP功能碼起始地址H起始地址L輸出數(shù)量H輸出數(shù)量L
如:將地址為0x0000、0x0002的線圈設(shè)為ON,0x0001的線圈為OFF
00 01 00 00 00 08 01 0F 00 00 00 03 01 05
回:寫入成功
00 01 00 00 00 06 01 0F 00 00 00 03
3

寫多個(gè)線圈
Modbus RTU
Modbus RTU 數(shù)據(jù)包通常由 從站地址、功能碼、數(shù)據(jù)和差錯(cuò)校驗(yàn) 組成。
例如,主機(jī)發(fā)送的數(shù)據(jù)包為:06 03 00 50 00 04 45 AF。
其中:
06 為從站地址;
03 為功能碼,表示讀取保持寄存器;
0050 為起始寄存器地址;
0004 表示讀取 4 個(gè)字的數(shù)據(jù);
45AF 為 CRC 校驗(yàn)碼,用于檢測(cè)數(shù)據(jù)傳輸是否出錯(cuò)。
1. 幀結(jié)構(gòu)
幀結(jié)構(gòu) = 地址 + 功能碼 + 數(shù)據(jù) + 校驗(yàn)
地址:占用一個(gè)字節(jié),范圍0-255,其中有效范圍是1-247,其他有特殊用途,比如255是廣播地址(廣播地址就是應(yīng)答所有地址,正常的需要兩個(gè)設(shè)備的地址一樣才能進(jìn)行查詢和回復(fù))。
功能碼:占用一個(gè)字節(jié),功能碼的意義就是,知道這個(gè)指令是干啥的,比如可以查詢從機(jī)的數(shù)據(jù),也可以修改數(shù)據(jù),所以不同功能碼對(duì)應(yīng)不同功能。
數(shù)據(jù):根據(jù)功能碼不同,有不同結(jié)構(gòu),在后續(xù)的實(shí)例中有說(shuō)明。
校驗(yàn):為了保證數(shù)據(jù)不錯(cuò)誤,增加這個(gè),然后再把前面的數(shù)據(jù)進(jìn)行計(jì)算看數(shù)據(jù)是否一致,如果一致,就說(shuō)明這幀數(shù)據(jù)是正確的,再回復(fù);如果不一樣,說(shuō)明這個(gè)數(shù)據(jù)在傳輸?shù)臅r(shí)候出了問(wèn)題,數(shù)據(jù)不對(duì)的,所以就拋棄了。
主機(jī)查詢數(shù)據(jù):

主機(jī)查詢數(shù)據(jù)結(jié)構(gòu)圖
2. 功能碼
根據(jù)對(duì)象的不同,Modbus的功能碼有:

功能碼類型
根據(jù)對(duì)象的不同,Modbus的功能碼有:

功能碼類型
3. 服務(wù)器配置
PLC/PAC作為ModbusRTU服務(wù)器,有以下幾個(gè)參數(shù),如下圖所示:

ModbusRTU服務(wù)器參數(shù)
基本配置
是否啟用:值為TRUE表示ModbusRTU通道開啟;值為FALSE表示ModbusRTU通道關(guān)閉,默認(rèn)值為FALSE。
從站地址:PLC/PAC作為ModbusRTU從站時(shí)的地址編號(hào),取值范圍為1-247。
串口配置
COM端口:PLC/PAC作為ModbusRTU從站時(shí)的通信端口,默認(rèn)值為1,取值范圍為1-4,分別對(duì)應(yīng)CPU單元的串口號(hào)為1-4的串口,各串口的管腳定義請(qǐng)參閱《PLC/PAC可編程邏輯控制器硬件手冊(cè)》。
波特率:ModbusRTU通信時(shí)的傳輸速率,取值范圍為1200-115200bps,建議使用9600bps,默認(rèn)值也為9600bps。
奇偶校驗(yàn):ModbusRTU通信時(shí)的數(shù)據(jù)校驗(yàn)方式,支持奇校驗(yàn)(ODD)、偶校驗(yàn)(EVEN)、無(wú)校驗(yàn)(NONE)三種數(shù)據(jù)校驗(yàn)方法,默認(rèn)為偶校驗(yàn)EVEN。
數(shù)據(jù)位:ModbusRTU通信時(shí)的數(shù)據(jù)位長(zhǎng)度,支持5、6、7、8位數(shù)據(jù)長(zhǎng)度,默認(rèn)為8位數(shù)據(jù)位。
停止位:ModbusRTU通信時(shí)的停止位長(zhǎng)度,支持1、2位停止位長(zhǎng)度,默認(rèn)為1位停止位長(zhǎng)度。
4. 0x01:讀多個(gè)線圈
作用:讀從機(jī)線圈寄存器,位操作,可讀單個(gè)或多個(gè);
發(fā)送指令:從機(jī)地址:0x01,寄存器開始地址:0x0000,共讀取8個(gè)線圈。發(fā)送命令如下:

TX:01 01 00 00 00 08 3D CC
響應(yīng):返回?cái)?shù)據(jù)每一位的對(duì)應(yīng)的線圈狀態(tài),1表示ON,0表示OFF;

RX:01 01 01 07 10 4A
5. 0x02:讀多個(gè)離散輸入
讀從機(jī)離散輸入寄存器,位操作,可讀單個(gè)或多個(gè);
發(fā)送指令:從機(jī)地址:0x01,寄存器開始地址:0x0000,共讀取8個(gè)輸入。發(fā)送命令如下:

TX:01 02 00 00 00 08 79 CC
響應(yīng):返回?cái)?shù)據(jù)每一位的對(duì)應(yīng)輸入的狀態(tài),1表示ON,0表示OFF;

RX:01 02 01 10 A0 44
6. 0x03:讀多個(gè)保持寄存器
作用:讀從機(jī)保持寄存器,字節(jié)操作,可讀單個(gè)或多個(gè);
發(fā)送指令:從機(jī)地址:0x01,寄存器開始地址:0x0000,共讀取1個(gè)寄存器。發(fā)送命令如下:

TX:01 03 00 00 00 01 84 0A
響應(yīng):返回?cái)?shù)據(jù)。

RX:01 03 02 00 0F F8 40
7. 0x04:讀多個(gè)輸入寄存器
作用:讀從機(jī)輸入寄存器,字節(jié)操作,可讀單個(gè)或多個(gè);
發(fā)送指令:從機(jī)地址:0x01,寄存器開始地址:0x0000,共讀取1個(gè)寄存器。發(fā)送命令如下:

TX:01 04 00 00 00 01 31 CA
響應(yīng):返回?cái)?shù)據(jù)。

RX:01 04 02 00 0F F9 34
8. 0x05:寫單個(gè)線圈
作用:寫單個(gè)線圈,位操作,只能寫一個(gè),寫0xFF00表示線圈為ON,寫0x0000表示線圈為OFF;
發(fā)送指令:從機(jī)地址:0x01,設(shè)置線圈0x0000為ON。發(fā)送命令如下:

TX:01 05 00 00 FF 00 8C 3A
響應(yīng):同發(fā)送數(shù)據(jù)。
9. 0x06:寫單個(gè)保持寄存器
作用:寫單個(gè)保持寄存器,字節(jié)操作,只能寫一個(gè);
發(fā)送指令:從機(jī)地址:0x01,設(shè)置線圈0x0000為0x2193。發(fā)送命令如下:

TX:01 06 00 00 21 93 D1 F7
響應(yīng):同發(fā)送數(shù)據(jù)。
10. 0x10:寫多個(gè)保持寄存器
作用:寫多個(gè)保持寄存器,字節(jié)操作,可寫多個(gè);
發(fā)送指令:從機(jī)地址:0x01,寄存器地址0x0000,寫2個(gè)寄存器4個(gè)字節(jié)數(shù)據(jù)。發(fā)送命令如下:

TX:01 10 00 00 00 02 04 00 08 00 09 B2 6B
響應(yīng):返回?cái)?shù)據(jù)。

RX:01 10 00 00 00 02 41 C8
LicOS PLC/PAC作為Modbus服務(wù)器,具備完整的Modbus TCP與RTU通信能力。其地址映射清晰,功能碼覆蓋全面,支持工業(yè)現(xiàn)場(chǎng)常見的數(shù)據(jù)讀寫需求。
在實(shí)際部署時(shí),建議結(jié)合具體網(wǎng)絡(luò)環(huán)境與設(shè)備性能,合理配置連接數(shù)、串口參數(shù)及IP過(guò)濾策略,以保障通信的實(shí)時(shí)性與安全性。