原文連接:https://blog.csdn.net/iknow_nothing/article/details/84292914html
簡介
Modbus由MODICON公司於1979年開發,是一種工業現場總線協議標準。1996年施耐德公司推出基於以太網TCP/IP的Modbus協議:ModbusTCP。服務器
Modbus協議是一項應用層報文傳輸協議,包括ASCII、RTU、TCP三種報文類型。spa
標準的Modbus協議物理層接口有RS23二、RS42二、RS485和以太網接口,採用master/slave方式通訊。.net
ModbusTCP數據幀
ModbusTCP的數據幀可分爲兩部分:MBAP+PDU。3d
報文頭MBAP
MBAP爲報文頭,長度爲7字節,組成以下:server
事務處理標識 |
協議標識 |
長度 |
單元標識符 |
2字節 |
2字節 |
2字節 |
1字節 |
內容 |
解釋 |
事務處理標識 |
能夠理解爲報文的序列號,通常每次通訊以後就要加1以區別不一樣的通訊數據報文。 |
協議標識符 |
00 00表示ModbusTCP協議。 |
長度 |
表示接下來的數據長度,單位爲字節。 |
單元標識符 |
能夠理解爲設備地址。 |
幀結構PDU
PDU由功能碼+數據組成。功能碼爲1字節,數據長度不定,由具體功能決定。htm
功能碼對象
Modbus的操做對象有四種:線圈、離散輸入、輸入寄存器、保持寄存器。blog
對象 |
含義 |
線圈 |
PLC的輸出位,開關量,在Modbus中可讀可寫 |
離散量 |
PLC的輸入位,開關量,在Modbus中只讀 |
輸入寄存器 |
PLC中只能從模擬量輸入端改變的寄存器,在Modbus中只讀 |
保持寄存器 |
PLC中用於輸出模擬量信號的寄存器,在Modbus中可讀可寫 |
根據對象的不一樣,Modbus的功能碼有:接口
功能碼 |
含義 |
0x01 |
讀線圈 |
0x05 |
寫單個線圈 |
0x0F |
寫多個線圈 |
0x02 |
讀離散量輸入 |
0x04 |
讀輸入寄存器 |
0x03 |
讀保持寄存器 |
0x06 |
寫單個保持寄存器 |
0x10 |
寫多個保持寄存器 |
PDU詳細結構
0x01:讀線圈
在從站中讀1~2000個連續線圈狀態,ON=1,OFF=0
- 請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節)
- 響應:MBAP 功能碼 數據長度 數據(一個地址的數據爲1位)
- 如:在從站0x01中,讀取開始地址爲0x0002的線圈數據,讀0x0008位
00 01 00 00 00 06 01 01 00 02 00 08
- 回:數據長度爲0x01個字節,數據爲0x01,第一個線圈爲ON,其他爲OFF
00 01 00 00 00 04 01 01 01 01
0x05:寫單個線圈
將從站中的一個輸出寫成ON或OFF,0xFF00請求輸出爲ON,0x000請求輸出爲OFF
- 請求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節)
- 響應:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節)
- 如:將地址爲0x0003的線圈設爲ON
00 01 00 00 00 06 01 05 00 03 FF 00
- 回:寫入成功
00 01 00 00 00 06 01 05 00 03 FF 00
0x0F:寫多個線圈
將一個從站中的一個線圈序列的每一個線圈都強制爲ON或OFF,數據域中置1的位請求相應輸出位ON,置0的位請求響應輸出爲OFF
- 請求:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L 字節長度 輸出值H 輸出值L
- 響應:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L
0x02:讀離散量輸入
從一個從站中讀1~2000個連續的離散量輸入狀態
- 請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節)
- 響應:MBAP 功能碼 數據長度 數據(長度:9+ceil(數量/8))
- 如:從地址0x0000開始讀0x0012個離散量輸入
00 01 00 00 00 06 01 02 00 00 00 12
- 回:數據長度爲0x03個字節,數據爲0x01 04 00,表示第一個離散量輸入和第11個離散量輸入爲ON,其他爲OFF
00 01 00 00 00 06 01 02 03 01 04 00
0x04:讀輸入寄存器
從一個遠程設備中讀1~2000個連續輸入寄存器
- 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)
- 響應:MBAP 功能碼 數據長度 寄存器數據(長度:9+寄存器數量×2)
- 如:讀起始地址爲0x0002,數量爲0x0005的寄存器數據
00 01 00 00 00 06 01 04 00 02 00 05
- 回:數據長度爲0x0A,第一個寄存器的數據爲0x0c,其他爲0x00
00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00
0x03:讀保持寄存器
從遠程設備中讀保持寄存器連續塊的內容
- 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)
- 響應:MBAP 功能碼 數據長度 寄存器數據(長度:9+寄存器數量×2)
- 如:起始地址是0x0000,寄存器數量是 0x0003
00 01 00 00 00 06 01 03 00 00 00 03
- 回:數據長度爲0x06,第一個寄存器的數據爲0x21,其他爲0x00
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00
0x06:寫單個保持寄存器
在一個遠程設備中寫一個保持寄存器
- 請求:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節)
- 響應:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節)
- 如:向地址是0x0000的寄存器寫入數據0x000A
00 01 00 00 00 06 01 06 00 00 00 0A
- 回:寫入成功
00 01 00 00 00 06 01 06 00 00 00 0A
0x10:寫多個保持寄存器
在一個遠程設備中寫連續寄存器塊(1~123個寄存器)
- 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L 字節長度 寄存器值(13+寄存器數量×2)
- 響應:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)
- 如:向起始地址爲0x0000,數量爲0x0001的寄存器寫入數據,數據長度爲0x02,數據爲0x000F
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
- 回:寫入成功
00 01 00 00 00 06 01 10 00 00 00 01
Modbus TCP 示例報文
原文連接:https://blog.csdn.net/mikasoi/article/details/81782159
ModBusTcp與串行鏈路Modbus的數據域是一致的,具體數據域能夠參考串行Modbus。這裏給出幾個ModbusTcp的鏈路解析說明,輔助新人分析報文。
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
ModbusTCP通訊
通訊方式
Modbus設備可分爲主站(poll)和從站(slave)。主站只有一個,從站有多個,主站向各從站發送請求幀,從站給予響應。在使用TCP通訊時,主站爲client端,主動創建鏈接;從站爲server端,等待鏈接。
- 主站請求:功能碼+數據
- 從站正常響應:請求功能碼+響應數據
- 從站異常響應:異常功能碼+異常碼,其中異常功能碼即將請求功能碼的最高有效位置1,異常碼指示差錯類型
- 注意:須要超時管理機制,避免無期限的等待可能不出現的應答
IANA(Internet Assigned Numbers Authority,互聯網編號分配管理機構)給Modbus協議賦予TCP端口號爲502,這是目前在儀表與自動化行業中惟一分配到的端口號。
通訊過程
- connect 創建TCP鏈接
- 準備Modbus報文
- 使用send命令發送報文
- 在同一鏈接下等待應答
- 使用recv命令讀取報文,完成一次數據交換
- 通訊任務結束時,關閉TCP鏈接
4 仿真軟件
- Modbus poll 和Modbus slave是一組Modbus仿真軟件,能夠實現Modbus RTU、TCP、串口仿真等。
- 在ModbusTCP中,Modbus poll 做爲客戶端請求數據,Modbus slave 做爲服務器端處理請求。
- 使用c語言編寫客戶端鏈接Modbus slave時,注意數據格式,一條指令一次性發出,不然鏈接會出錯。
- 使用軟件時,須要指定功能碼,在setup->slave definition或者poll definition中進行設置。
– slave ID:從站編號(事務標識符)
– function:功能碼,0x01對應線圈操做,0x02對應離散量操做,0x03對應保持寄存器操做,0x04對應輸入寄存器操做
– address:開始地址
– quantity:寄存器/線圈/離散量 的數量
參考:
https://wenku.baidu.com/view/c2a9e1cc376baf1ffd4fad5c.html
https://blog.csdn.net/zwxue251/article/details/24154951
https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1
一些概念
原文連接:https://wenku.baidu.com/view/55595d0690c69ec3d5bb75ed.html