C# Modbus TCP通訊實例
C#例程下載:Modbus TCP 連接大連德嘉PLC
這里我只是簡單的理解一下Modbus TCP/IP協議的內容,就是去掉了modbus協議本身的CRC校驗,增加了MBAP 報文頭。這里只是簡單的理解,
深入之后可能會有更多的東西需要學習,但為了可以快速入門,我們先按照這個思路往下走。
我們首先來看一下,MBAP 報文頭都包括了哪些信息和內容:
下面我們再來介紹一下針對我們PLC的功能碼:
1、0x01功能碼:按位讀取Q區(線圈 )
例:我們來讀取從Q0.0到Q0.5這6個線圈
發送碼分析:
根據上面的分析,我們需要發送0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x00, 0x00, 0x00, 0x06
接收碼分析:
我們收到的數據為0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01,0x01,0x2A
modbus數據中從左數,0x01表示功能碼,0x01表示1個字節數據,0x2A表示數據值,把0x2A轉換為2進制為0010 1010,從左數起,前2位
是補充數據00,剩下的101010表示我們讀取的Q0.5到Q0.0的狀態。
Q0.5------ ON, Q0.4 ------ OFF, Q0.3-------ON,Q0.2--------OFF,Q0.1-------ON,Q0.0----------OFF。
注意數據的順序,左側是高位,右側是低位。
注意:上述發送及接收數據中,紅色數碼是MBAP報文頭,黑色碼是modbus數據,下同
2、0x02功能碼:按位讀取I 區 (離散輸入)
例:我們來讀取從I0.0到I0.5這6個離散輸入點
發送碼分析:
根據上面的分析,我們需要發送0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x02, 0x00, 0x00, 0x00, 0x06
接收碼分析:
我們收到的數據為0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x01, 0x02,0x01,0x00
modbus數據中從左數,0x02表示功能碼,0x01表示1個字節數據,0x00表示數據值,把0x0轉換為2進制為0000 0000 , 從左數起,前2位是補充數據00
,剩下的000000表示我們讀取的I0.5到I0.0的狀態。
3、0x03功能碼:按雙字節(VW)讀取V區或者讀MW
Modbus寄存器0-------19999是讀取VW,20000------20031是讀取MW
例:我們來讀取從VW0到VW2這個數據
發送碼分析:
根據上面的分析,我們需要發送0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x00, 0x00, 0x03
接收碼分析:
我們收到的數據為0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x03,0x06,0x04,0x00,0x03,0x01,0x02,0x05
modbus數據中從左數,0x03表示功能碼,0x06表示6個字節數據,0x04,0x00,0x03,0x01,0x02,0x05表示數據值VW0為0x0400,
VW2為0x0301,VW4為0x0205
4、0x05功能碼:按位寫Q區
例:我們來把Q0.0置1,請注意,置位數據為0xFF00,清零數據為0x0000
發送碼分析:
根據上面的分析,我們需要發送0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x00, 0xFF, 0x00
接收碼分析:
我們收到的數據為0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05,0x00,0x00,0xFF,0x00
5、0x06功能碼: 按雙字節(VW)寫V區或者寫MW
Modbus寄存器0-------19999是寫VW,20000------20031是寫MW
例:我們將數據0x2636寫入VW0
發送碼分析:
根據上面的分析,我們需要發送0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, 0x00, 0x26, 0x36
接收碼分析:
我們收到的數據為0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06,0x00,0x00,0x26,0x36
6、0x0F功能碼:按多個位寫Q區
例:我們將Q0.0到Q0.5共6個線圈全部置位1
發送碼分析:
我們要將Q0.0到Q0.5輸出1,要發送的值應該為二進制0011 1111,轉換為16進制為 0x3F
根據上面的分析,我們需要發送0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x06,0x01,0x3F
接收碼分析:
我們收到的數據為0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x0F,0x00,0x00,0x00,0x06
7、0x10功能碼: 寫2N個VW 或者MW
Modbus寄存器0-------19999是寫VW,20000------20031是寫MW
例:我們將數據0x01,0x05,0x0A,0x09寫入VW0和VW2
發送碼分析:
根據上面的分析,我們需要發送0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x10, 0x00, 0x00, 0x00, 0x02,0x04,0x01,0x05,0x0A,0x09
接收碼分析:
我們收到的數據為0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x10,0x00,0x00,0x00,0x02
至此,我們關于Modbus TCP命令連接我們PLC的分析就結束了,我上傳了我做好的C#程序供大家參考,這里要注意一個問題,此程序中缺少
斷線重連機制,請大家自己添加一下吧