目录

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐