目录
Modbus-TCP
Modbus TCP协议的帧结构如下:
实现Modbus-Tcp
使用EasyModbusTCP第三方实现Modbus-Tcp
EasyModbusTCP的使用
设置IP
设置端口
设置设备地址
开启通讯
读取寄存器
写入寄存器
实例
Modbus-TCP
Modbus TCP是Modbus协议的一种变体,它使用TCP/IP网络进行设备之间的通信。Modbus TCP协议帧与Modbus RTU或Modbus ASCII不同,因为它包含了TCP头部、IP头部以及可能的以太网头部。
Modbus TCP协议的帧结构如下:
modbus-tcp一般没有效验
(1). 事务处理标识:客户端生成的随机数,由服务器返回,可用于匹配请求和响应。
(2). 协议标识:在Modbus TCP中,该字段固定是00 00。
(3). 数据长度:请求或响应数据的长度,包括单元标识符、功能代码、数据和校验和,但不包括MBAP头。
(4). 单元标识符:在Modbus TCP中,一般设置为0或者连续的从设备地址。
(5). 功能代码:表示要执行的功能。
(6). 数据:根据功能代码不同,数据字段的长度也不同。
事务处理标识符 | 协议标识 | 数据长度 | 单元标识符 | 功能码 | 数据字段 |
00 01 | 00 00 | 00 06 | 01 | 03 | 00 00 00 0A |
实现Modbus-Tcp
public partial class Form1 : Form
{
/// <summary>
/// 客户端
/// </summary>
TcpClient tcp;
/// <summary>
/// form构造
/// </summary>
public Form1()
{
InitializeComponent();
tcp = new TcpClient();
tcp.Connect("127.0.0.1",502);
startReceve();
}
/// <summary>
/// 接收数据
/// </summary>
void startReceve()
{
Task.Run(() =>
{
try
{
while (true)
{
byte[] bytes = new byte[15];
int count = tcp.GetStream().Read(bytes, 0, bytes.Length);
string s = BitConverter.ToString(bytes, 0, count); // 把bs数组转成字符串
MessageBox.Show(bytes[bytes.Length - 2] * 256 + bytes[bytes.Length-1]+"");
MessageBox.Show(s);
if (count == 0)
{
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
private ushort key = 0x000;
/// <summary>
/// 发送
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
key++;
byte[] bs = BitConverter.GetBytes(key);
byte[] data = new byte[]
{
bs[0],bs[1], // 事务标识符
0x00,0x00, // 协议标识符
0x00,0x06, // 后面字节长度
0x01, // 从站地址
0x03, // 功能码
0x00,0x00, // 寄存器起始地址
0x00,0x03 // 读取寄存器个数
};
// 发送请求帧
tcp.GetStream().Write(data, 0, data.Length);
}
}
使用EasyModbusTCP第三方实现Modbus-Tcp
在C#中使用第三方库EasyModbus TCP进行Modbus通信时,首先需要安装该库。可以通过NuGet包管理器来安装。
EasyModbusTCP的使用
设置IP
ModbusClient client = new ModbusClient();
client.IPAddress = "127.0.0.1"; // 设置IP
设置端口
ModbusClient client = new ModbusClient();
client.Port = 502; // 端口
设置设备地址
ModbusClient client = new ModbusClient();
client.UnitIdentifier = 2; // 修改设备地址
开启通讯
ModbusClient client = new ModbusClient();
client.Connect(); // 开启通讯
读取寄存器
// 参数1 地址 参数2 读取数量
int[] data = client.ReadHoldingRegisters(2,1); // 从主机设备读取寄存器
写入寄存器
// 参数1 地址 参数2 数据
client.WriteSingleRegister(7, 900); // 写入单个寄存器
写入多个寄存器
// 参数1 地址 参数2 数据
client.WriteMultipleRegisters(3,new int[] {200,300}); // 写入多个寄存器
实例
public partial class Form1 : Form
{
ModbusClient client;
public Form1()
{
InitializeComponent();
client = new ModbusClient();
client.IPAddress = "127.0.0.1"; // 设置IP
client.Port = 502; // 端口
client.UnitIdentifier = 2; // 修改设备地址
client.Connect(); // 开启通讯
}
/// <summary>
/// 读取
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
int[] data = client.ReadHoldingRegisters(2,1); // 从主机设备读取寄存器
MessageBox.Show(data[0]+"");
}
/// <summary>
/// 写入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
client.WriteMultipleRegisters(3,new int[] {200,300}); // 写入多个寄存器
client.WriteSingleRegister(7, 900); // 写入单个寄存器
}
}