一、協議的特點
TCP協議是1996年施耐德公司推出的基于TCP/IP協議的Modbus協議。此協議與Modbus-RTU協議最大的不同就是使用了在TCP/IP協議上專用的報文識別Modbus應用數據單元。這種報文頭被稱為MBAP報文頭。
MBAP報文頭
報文頭的長度是7個字節,分別有:事務處理標識符,長度為兩個字節,用于事務處理配對。它是Modbus的事務處理碼,每次通信后就要加一。協議標識符,長度為兩個字節,用于系統內的多路復用。當它的值是0(00 00),表示使用Modbus協議。長度,由兩個字節構成,用于說明下面還有多少個字節的數量。這樣即使TCP將整個報文分為多個信息包傳輸,接收者也能識別報文的邊界。單元標識符,由一個字節構成,當Modbus客戶端在請求中設置這個域,在響應中服務器必須利用相同的值返回這個域,可以將其理解為設備地址。報文頭之后的功能碼和數據部分與Modbus-RTU協議相似。我們還是以實際的報文加以說明。
報文頭各區域含義
二、實驗設備介紹
實驗中將網絡調試助手軟件作為客戶機(主站),MT1004或MT2003遠程I/O模塊作為服務器(從站)。
主站和從站
MT1004有16個DO輸出端口(線圈)。
MT1004
MT2003有8組AI端口。
MT2003
它們可以測量電壓和電流信號。模塊的配套軟件可以查詢它的詳細信息也具有修改端口號等功能。我們盡量將端口號設置在2000以上,避免與其他協議產生沖突。打開MT軟件,找到模塊的IP地址、網關、端口等信息。在網絡調試助手的網絡設置中,選擇TCP Client協議類型,輸入遠程主機地址為192.168.1.200,遠程主機端口為2000。接著改變電腦的IP地址,使它們處于同一個網段內。打開電腦的網絡設置,選擇以太網,點擊屬性,選中Internet協議版本4,點擊屬性,輸入IP地址為:192.168.1.111,子網掩碼為255.255.255.0,點擊確定。返回網絡調試助手,點擊連接,這樣就可以在客戶端和服務器之間建立通信。此次通信我們沒有將模塊并聯到一起,所以兩模塊的參數設置都是相同的。(此段內容是軟件及電腦的設置內容,在文章下方推薦的視頻鏈接中可以看到。)
三、報文詳細說明
打開網絡調試軟件,點擊左上角電腦圖標,在工具選項中選擇MODBUS調試器,在出現的窗口中選擇Modbus-TCP協議。現在我們想讀取模塊DO 5~DO 10的狀態。我們根據指令填寫字節,設備默認的ID是01,Do在Modbus中被稱為線圈,所以選擇01命令。這里我們給出協議中四種數據類型的特征以及功能碼匯總。
寄存器種類
常用功能碼描述
打開MT1004模塊的用戶手冊選擇相應的寄存器地址。
MT1004映射表
通道5的地址是00006,輸入的地址應該是0x0005。讀取數據的長度是6個。所以生成的報文為:00 04 00 00 00 06 01 01 00 05 00 06。
01命令的請求報文
我們嘗試分析這個報文:00 04,是報文頭的事務處理標識,點擊更新我們能看到它會加一,變為00 05;
任務處理標識自動加1
00 00,是協議標識,說明使用Modbus協議;00 06,說明之后有六個字節的報文內容;01,是單元標識符,也就是設備地址;01,是功能碼,表示讀取線圈狀態;00 05,是寄存器起始地址;00 06,是讀取的線圈數量。調整接收設置的格式為HEX,服務器(從機)返回的響應報文是:00 05 00 00 00 04 01 01 01 00。
01命令的響應報文
00 05,是此次通信的事務處理標識,與請求報文保持一致;00 00,是協議標識符,與請求報文一致;00 04,是提示之后有4個字節長度的內容;01,是設備地址;01,是功能碼,與請求報文相同;01,說明接下來的報文長度;00,表明DO線圈均處于斷開狀態(0000 0000),高位用零補充。
接下來我們以閉合、斷開的規律改變通道5~10的線圈狀態,也就是進行寫線圈操作,它的命令是0F。生成的報文是:00 07 00 00 00 08 01 0F 00 05 00 06 01 15。
0F命令的請求報文
報文的解釋是:00 07,事務處理標識符;00 00,協議標識,說明使用Modbus協議;00 08,說明接下來有8個字節的報文長度;01,是設備地址;0F,是功能碼,請求執行寫線圈操作;00 05,是寄存器的起始地址;00 06,是寫寄存器的個數;01,說明之后有一個字節的內容;15,反映了要寫入的寄存器狀態,我們將其寫成二進制是:0001 0101,對應通道是10、9、8、7、6、5,最高兩位以0補齊。
響應報文是:00 07 00 00 00 06 01 0F 00 05 00 06。
0F命令的響應報文
對它的解釋是:00 07為事務處理標識符;00 00為協議標識符;00 06說明后面有6個字節的報文長度;01為設備地址;0F為功能碼;00 05是開始寄存器的地址;00 06是服務器一共改寫了6個線圈的狀態,我們可以打開軟件看一下。可見已經成功為線圈寫入狀態。
線圈狀態
最后,我們將壓力傳感器連接到MT2003模塊的AI 5通道上,嘗試讀取采集卡的輸入寄存器的值,功能碼是:04。各設備的接線圖如下圖所示:
設備接線圖
打開用戶手冊,AI 5的寄存器地址是6(十進制),
MT2003映射表
所以生成的響應報文是:00 05 00 00 00 06 01 04 00 05 00 01。
04命令的請求報文
返回的響應報文是:00 05 00 00 00 05 01 04 02 61 11。
04命令的響應報文
通過報文可以看到,模塊寄存器中的值是61 11,它反映了模塊采集到的電流值的大小。將其轉換為十進制是24849。根據用戶手冊,4mA~20mA的電流值對應0~65535(十進制)的數據值,所以24849對應的電流值為10.07mA。依據壓力傳感器的技術指標,其測量到的壓力大小約為39.1MPa。計算過程如下圖所示。
計算(一)
計算(二)
Modbus-TCP協議產生錯誤時返回的報文與Modbus-RTU協議一樣,都是功能碼加0x80后跟著一個字節的錯誤代碼。大家可以觀看我們發布的Modbus-RTU協議的文章,這里我們就不再贅述了。
錯誤報文示例
以上就是Modbus-TCP協議的相關內容。更推薦觀看文章內容的視頻版:Modbus TCP協議說明
文章中使用的調試軟件是Modbus Poll,使用的模塊可以進入Smacq官網查看。有任何問題大家可以留言給我們或是直接從微信公眾號:Smacq思邁科華,聯系我們。
審核編輯 黃宇
-
Modbus TCP協議
+關注
關注
0文章
20瀏覽量
1414
發布評論請先 登錄
Modbus TCP 到 RTU:輕松轉換指南!

Modbus網關如何實現Modbus RTU與Modbus TCP協議的數據采集?
Modbus RTU協議與Modbus TCP/IP協議的區別
DeviceNet主站轉Modbus TCP協議網關

MODBUS TCP 轉 CANOpen

Profibus DP轉Modbus TCP總線協議網關

EtherCAT轉Modbus TCP協議網關(JM-ECT-TCP)

EtherNet/IP轉Modbus-TCP協議網關(EtherNet/IP轉Modbus-TCP)

Modbus-TCP轉Profinet協議轉換網關(JM-TCP-PN)

EtherCAT主站轉Modbus TCP從站協議網關(JM-ECTM-TCP)

Modbus(TCP)轉Profinet從站協議網關(JM-TCP-PN)

Modbus(TCP)轉Profinet從總線協議轉換網關(JM-TCP-PN)

PLC協議、Modbus RTU TCP 、DL T645、IEC101-104、BACnet 轉Modbus TCP RTU、OPC UA、MQTT、BACnet IP協議網關

評論