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