MODBUS TCP协议是一种基于TCP/IP协议的Modbus变种,它允许Modbus协议在以太网网络上运行,使得设备之间可以通过IP网络交换数据。
一:协议概述
modbus_TCP协议:走的是网口,所以需要创建TCPclient对象进行通信,和modubus-RTU协议最大的区别是,modbustcp 是通过事务处理标识来区分同一时刻的 不同的modbus事务,并且modbustcp不需要通过自己进行校检
二、协议结构
modbus-TCP 的请求帧格式 00 05 | 00 00 | 00 06 | 01 | 03 | 00 03 |S 00 01
//第一部分:事务处理标识符,占2个字节(唯一的) 00 05
//第二部分:协议标识符,占2个字节 00 00 modbus-tcp当中协议标识符恒为0
//第三部分:长度,占2个字节 00 06 后面数据长度
//第四部分:单元标识符,占1个字节 01 就是从站地址
//第五部分:功能码,占1个字节 03 功能码
//第六部分:数据部分,占N个字节(寄存器地址00 03 + 寄存器个数 00 01)
三、关于modbus TCP 的实例
这里用的是WinForm点击按钮
搭建WinForm界面
代码
public partial class Form1 : Form
{
TcpClient tcp;
public Form1()
{
InitializeComponent();
tcp = new TcpClient();
tcp.Connect("192.168.107.8",502);
startReceive(); //接受数据的方法
}
void startReceive()
{
NetworkStream stra = tcp.GetStream();
Task.Run(() =>
{
try
{
byte[] bs = new byte[15];
while (true)
{
int count = stra.Read(bs, 0, bs.Length); // 获取数据
string s = BitConverter.ToString(bs, 0, count); // 把bs数组转成字符串
Console.WriteLine(bs[bs.Length-2]*256 + bs[bs.Length-1]);
if (count == 0) break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
});
}
private ushort key = 0x000;
// 发送
private void button1_Click(object sender, EventArgs e)
{
key++;
byte[] bs = BitConverter.GetBytes(key); // 把一转成字节数组[00 , 01
// ]
// 组织请求帧
byte[] data = new byte[]
{
bs[0],bs[1], // 事务标识符
0x00,0x00, // 协议标识符 tcp恒为0
0x00,0x06, // 后面字节长度
0x01,// 从站地址
0x03, // 功能码
0x00,0x00, // 寄存器起始地址
0x00,0x03 // 读取寄存器个数
};
// 请求发送帧
tcp.GetStream().Write(data, 0, data.Length);
}
}