Modbus -- TCP协议

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界面

代码

cs 复制代码
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);
    }
}
相关推荐
Plastic garden3 分钟前
Linux下rsync + inotify 实时文件同步方案
linux·运维·服务器
liulilittle8 分钟前
删除 Inflight Bounds:为什么 KCC 放弃了 BDP 钳位
linux·网络·tcp/ip·计算机网络·信息与通信·tcp·通信
云飞云共享云桌面10 分钟前
面向机械研发:双服务器架构搭配云飞云运行 SolidWorks 方案详解
运维·服务器·前端·网络·架构·制造
吕工-老船长199817 分钟前
20260610----S905Y5(Android14)-----连接WiFi成功后显示网络受限或者开机不会回连
网络
鼎讯信通19 分钟前
电波监测站 OM-036 频谱仪 维系能源产业通信网络
网络·能源
行走__Wz25 分钟前
【网工入门-01】模拟器工具eNSP
网络·网络协议
让我上个超影吧28 分钟前
Cluade code:上下文压缩
java·服务器·ai
江华森30 分钟前
深入 Linux 性能调试 —— BPF 与 BCC 工具实战指南
linux·运维·服务器
ElevenS_it18841 分钟前
网络设备配置合规审计自动化实战:用Nornir+Netmiko自动比对华为/Cisco/H3C配置基线+合规报告自动生成
运维·网络·自动化
wangyadong3171 小时前
重新安装k3s,因为我安装jenkins 的时候报错了。不知道为啥rancher 访问不了了。
linux·服务器·rancher