問題解答

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#程序供大家參考,這里要注意一個問題,此程序中缺少

斷線重連機制,請大家自己添加一下吧

{ganrao} 普通麻将作弊影形眼镜 海南飞鱼 韩国a片名字 超级大乐透 日本av影视大片 下3d开奖结果 河南快赢481 有板深雪在线观看 体彩排列三开奖结果 英超积分榜雪缘园 银川小姐 上海百搭麻将怎么玩 新浪竞彩比分旧版 琼崖海南麻将辅助软件 nba东部决赛热火vs步行者 山东十一选五开奖数