欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > Modbus-TCP详解

Modbus-TCP详解

2024/10/23 23:30:54 来源:https://blog.csdn.net/qq_3517289697/article/details/140935407  浏览:    关键词:Modbus-TCP详解

目录

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 0000 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"; // 设置IPclient.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); // 写入单个寄存器}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com