1. 程式人生 > >組態王MODBUS TCP數據報格式

組態王MODBUS TCP數據報格式

定義 多人 標識符 發現 tcp協議 常用 編程 數量 device

在大家通讀Modbus協議時,總是會碰到一些容易混淆的名詞,從而導致對於協議的解讀出現問題,在本文中,我
們對於Modbus協議中可能會給大家造成困惑的名詞作相關的解釋。

1.功能碼:功能碼在modbus協議用於表示信息幀的功能,常用的功能碼有03,04,06,16等,其中03功能碼的作
用是讀保持寄存器內容,04功能碼的作用是讀輸入寄存器內容(輸入寄存器和保持寄存器的區別看下文),06功
能碼的內容是預置單個保持寄存器,16功能碼的內容則是預置多個保持寄存器。

2.輸入寄存器和保持寄存器:04功能碼的作用就是讀輸入寄存器,而03功能碼的作用則是讀保持寄存器,很多人
在看到這兩個功能碼的時候總是希望找到這兩個功能碼的區別,保持寄存器和輸入寄存器到底是什麽區別,
modbus協議最開始是用來解決PLC的通信協議問題的,主要用於輸入輸出數字量信號以及模擬量信號,所謂的輸
入寄存器就是從模擬量信號輸入引申出來的,即輸入寄存器只能從模擬量信號輸入端改變寄存器,而主機則不能
通過下發指令改變輸入寄存器的數據,而保持寄存器則是用於輸出模擬量信號的,主機是可以改變寄存器數據,
也就是說對於主機而言,輸入寄存器是只讀的,而保持寄存器是可以讀寫的,當主機用06,16功能碼的指令去預
置輸入寄存器的時候,設備會返回一個代碼為0x81的錯誤代碼,即企圖寫只讀寄存器。

3.Modbus中的數據地址格式:在Modbus協議中,經常會出現類似於3xxxx,4xxxx寄存器,這個表示的是寄存器支
持的數據類型。我們用列表來說明,還有Modbus數據地址格式是從0開始,比如以下一個寄存器40009,即表示保
持寄存器,寄存器地址為00 08,類似的數據地址格式經常在組態軟件以及PLC系統中用到。

映射地址 使用的功能碼 地址類型 存取方式 描述
0XXXX 01,05,15 離散輸出 讀寫 每個卷表示單個開關位
1XXXX 02 離散輸入 只讀 每個卷表示單個開關位
2XXXX 03,04,06,16 浮點寄存器 只讀/讀寫 兩個連續16位寄存器表示一個浮點數
3XXXX 04 輸入寄存器 只讀 每個寄存器表示一個16位無符號整數
4XXXX 03,06,16 保持寄存器 讀寫 每個寄存器表示一個16位無符號整數
5XXXX 03,04,06,16 ASCII字符 讀寫 每個寄存器表示兩個ASCII碼
4.Modbus RTU/ASCII/TCP:Modbus協議最開始是用於可編程邏輯控制器(PLC)之間的通訊,由於其具有的開放性
,大量的用於現場智能儀表。Modbus協議有多個變種,其中最著名的是Modbus RTU/Modbus ASCII和Modbus TCP
通信協議。其中RTU/ASCII協議是基於串行口通信,而TCP協議則是基於以太網通信。他們之間的區別和聯系請參
考本站其他頁面內容:Modbus RTU/TCP協議解析以及Modbus RTU/ASCII通信協議異同點。

5.Modbus錯誤代碼表,modbus有功能碼,校驗碼,異常功能碼和錯誤代碼,其中異常功能碼和錯誤代碼非常容易
混淆,一般來說異常功能碼指的是某個功能碼執行的時候出現的相應異常功能碼,一般都是在功能碼的基礎上加
上0x80,比如03功能碼出現的異常碼是0x83異常功能碼,16功能碼對應出現的異常功能碼則是0x90,而錯誤代碼
則是表示出現錯誤的具體情況,比如寄存器地址不存在,不管是讀還是寫,如果該寄存器地址不存在的話,錯誤
代碼為02。具體情況請參閱本站其他頁面文章。

/***************************以上摘自http://www.485-can-tcp.com/technology/232485/TheModbus.htm********************************/

以下實際結果如下:

測試條件:組態王選擇 MODBUS-TCP 做客戶端, 服務器為樹莓派3B,IP 192.168.1.200, 端口6000

組太王設置通信參數:192.168.1.200 :6000 22/30 //IP 192.168.1.200 PORT 6000 DEVICE 22

定義三個變量 寄存器分別是 40001 40002 40005,主界面定義三個文本框,選擇模擬量輸入+模擬量輸出, 更新時間1000ms 連通後

組態王發送
00 00 00 00 00 06 16 03 00 00 00 05 //讀取模擬量的值

00 00 為此次通信事務處理標識符,一般每次通信之後將被要求加1以區別不同的通信數據報文; 實際測試這個值沒有變化 一直是00 00
00 00 表示協議標識符,00 00為modbus協議;
00 06 為數據長度,用來指示接下來數據的長度,單位字節;
16 地址碼 設備地址22
03 讀功能碼
00 00 起始地址碼 組態王從1開始計數,00 00 即40001
00 05 數據長度 5個16位數值(word數量)


回應
00 00 00 00 00 0d 16 03 0a 00 01 00 02 00 03 00 04 00 05
00 00 為此次通信事務處理標識符,應答報文要求與先前對應的請求保持一致;
00 00 為協議標識符,與先前對應的請求保持一致;
00 0d 為數據長度,用來指示接下來數據的長度,單位字節
16 設備地址 應答報文要求與先前對應的請求保持一致;
03 為功能碼,正常情況下應答報文要求與先前對應的請求保持一致,如果出錯則返回80h+先前的功能碼;
0a 指示接下來數據的字節長度; 應該是請求的數據字節數05 x2 對應10個字節
00 01 00 02 00 03 00 04 00 05 數據高低位數值

結果組態王文本框分別顯示 01 02 05


在組態王中,向40001寄存器寫入 33

組態王發送

00 00 00 00 00 06 16 06 00 00 00 21
00 00 為此次通信事務處理標識符,一般每次通信之後將被要求加1以區別不同的通信數據報文; 實際測試保持00 00
00 00 表示協議標識符,00 00為modbus協議;
00 06 為數據長度,用來指示接下來數據的長度,單位字節;
06 寫單保持寄存器功能碼
16 地址碼 設備地址22
00 00 單保持寄存器地址,這裏是40001
00 21 單保持寄存器數據,00 21 即33

回應
00 00 00 00 00 06 16 06 00 00 00 21
00 00 為此次通信事務處理標識符,應答報文要求與先前對應的請求保持一致;
00 00 為協議標識符,與先前對應的請求保持一致;
00 06 為數據長度,用來指示接下來數據的長度,單位字節
16 設備地址 應答報文要求與先前對應的請求保持一致;
06 為寫功能碼,正常情況下應答報文要求與先前對應的請求保持一致,如果出錯則返回80h+先前的功能碼
00 00 單保持寄存器地址,這裏是40001
00 21 單保持寄存器數據,00 21 即33

即原封不動的將數據發回去

測試過程中沒有出現任何通訊錯誤, 樹莓派檢測組態王發送來的數據,也沒有發現任何不合理數據。

在不給組態王發送數據或者一直發送錯誤數據的情況下,組態王會間斷的發送 00 00 00 00 00 06 16 01 ff ff 00 01, 不知為何,01是讀線圈的命令碼,解析後是讀地址為ffff的一個線圈的狀態,不明白是心跳檢測還是別的 沒有找到相關資料,在檢測到這個報文的時候我原封不動的發回去,未見任何異常。望有高人指點!

組態王MODBUS TCP數據報格式