初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)

由于感觉上一次写的篇幅过长,所以新开一贴,继续介绍Modbus TCP/IP的初步认识,

书接上回

3)、03(0x03)功能码--------读保持寄存器

请求与响应格式

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第1张图片


这是一个请求读寄存器108-110 的实例:


初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第2张图片


发送数据为:

0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x6B, 0x00, 0x03

程序如下:
private void send03_Click(object sender, EventArgs e)
{
    byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x6C, 0x00, 0x03 };
    newclient.Send(data);
}



接收数据为:

0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,  0x03, 0x06, 0x02, 0x2B, 0x00,0x00,0x00,0x64

程序如下:

public void showMsg03(string msg)
{
    //在线程里以安全方式调用控件
    if (receive0x01.InvokeRequired)
    {
        MyInvoke _myinvoke = new MyInvoke(showMsg03);
        receive0x03.Invoke(_myinvoke, new object[] { msg });
    }
    else
    {
        receive0x03.AppendText(msg);
    }
}

我们再来看一下Modbus Slave设置

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第3张图片

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第4张图片


我们再看一下Wireshark截取封包

Modbus TCP请求

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第5张图片


Modbus TCP响应

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第6张图片

我们的软件所收到的数据

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第7张图片


4)、05(0x05)功能码--------写单个线圈
 
十六进制值0XFF00请求线圈为ON。十六进制值0X0000请求线圈为OFF。

其它所有值均为非法的,并且对线圈不起作用。

请求与应答PDU
初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第8张图片

这是一个请求写线圈173 为ON 的实例:

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第9张图片



发送数据为;

0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0xAD, 0xFF, 0x00

程序如下:

private void send05_Click(object sender, EventArgs e)
{
    byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0xAD, 0xFF, 0x00 };
    newclient.Send(data);
}


接收数据为:

0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,  0x02, 0x03,0xAD, 0xFF, 0x00

程序如下:

public void showMsg05(string msg)
{
    //在线程里以安全方式调用控件
    if (receive0x05.InvokeRequired)
    {
        MyInvoke _myinvoke = new MyInvoke(showMsg05);
        receive0x05.Invoke(_myinvoke, new object[] { msg });
    }
    else
    {
        receive0x05.AppendText(msg);
    }
}

我们再来看一下Modbus Slave设置

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第10张图片

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第11张图片

我们再看一下Wireshark截取封包

Modbus TCP请求

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第12张图片

Modbus TCP响应

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第13张图片

我们的软件所收到的数据

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第14张图片


5)、06 (0x06)写单个寄存器


请求与应答PDU

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第15张图片

这是一个请求将十六进制00 03 写入寄存器2的实例:


初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第16张图片


发送数据为;

0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, 0x01, 0x00, 0x03

程序如下:


private void send06_Click(object sender, EventArgs e)
{
    byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, 0x01, 0x00, 0x03 };
    newclient.Send(data);
}


接收数据为:

0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,  0x06, 0x00,0x01, 0x00, 0x03

程序如下:

public void showMsg06(string msg)
{
    //在线程里以安全方式调用控件
    if (receive0x06.InvokeRequired)
    {
        MyInvoke _myinvoke = new MyInvoke(showMsg06);
        receive0x06.Invoke(_myinvoke, new object[] { msg });
    }
    else
    {
        receive0x06.AppendText(msg);
    }
}

我们再来看一下Modbus Slave设置

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第17张图片

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第18张图片


我们再看一下Wireshark截取封包

Modbus TCP请求

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第19张图片

Modbus TCP响应

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第20张图片


6)、15 (0x0F) 写多个线圈


在一个远程设备中,使用该功能码强制线圈序列中的每个线圈为ON 或OFF。

域比特位置中的逻辑“1”请求相应输出为ON。

域比特位置中的逻辑“0”请求相应输出为OFF。

请求与应答PDU


初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第21张图片


这是一个请求从线圈20 开始写入10 个线圈的实例:

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第22张图片


发送数据为;

0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x0F, 0x00, 0x14, 0x00, 0x0A,0x02,0xCD,0x01

程序如下:

private void send0F_Click(object sender, EventArgs e)
{
    byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x0F, 0x00, 0x14, 0x00, 0x0A, 0x02, 0xCD, 0x01 };
    newclient.Send(data);
}



接收数据为:

0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,  0x0F, 0x00,0x14,0x00, 0x0A

程序如下:

public void showMsg0F(string msg)
{
    //在线程里以安全方式调用控件
    if (receive0x0F.InvokeRequired)
    {
        MyInvoke _myinvoke = new MyInvoke(showMsg0F);
        receive0x0F.Invoke(_myinvoke, new object[] { msg });
    }
    else
    {
        receive0x0F.AppendText(msg);
    }
}

我们再来看一下Modbus Slave设置


初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第23张图片


初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第24张图片



我们再看一下Wireshark截取封包

Modbus TCP请求

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第25张图片


Modbus TCP响应


初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第26张图片


我们的软件所收到的数据

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第27张图片


7)、16 (0x10)写多个寄存器


请求与应答PDU


初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第28张图片


这是一个请求将十六进制00 0A 和01 02 写入以2 开始的两个寄存器的实例:

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第29张图片


发送数据为;

0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x010, 0x00, 0x02, 0x00, 0x02, 0x04,0x00,0x0A,0x01,0x02

程序如下:

private void send10_Click(object sender, EventArgs e)
{
    byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x10, 0x00, 0x02, 0x00, 0x02, 0x04, 0x00,0x0A,0x01, 0x02 };
    newclient.Send(data);
}

接收数据为:

0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,  0x10, 0x00,0x02, 0x00, 0x02

程序如下:

public void showMsg10(string msg)
{
    //在线程里以安全方式调用控件
    if (receive0x10.InvokeRequired)
    {
        MyInvoke _myinvoke = new MyInvoke(showMsg10);
        receive0x10.Invoke(_myinvoke, new object[] { msg });
    }
    else
    {
        receive0x10.AppendText(msg);
    }
}

我们再来看一下Modbus Slave设置

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第30张图片


初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第31张图片


我们再看一下Wireshark截取封包

Modbus TCP请求

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第32张图片

Modbus TCP响应

初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第33张图片

我们的软件所收到的数据
初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)_第34张图片



至此,我们对Modbus协议的初步认识就到此结束了,这里我们只做了对Modbus TCP

客户端的了解,之后的博文中我会陆续增加Modbus TCP服务器,modbus 485协议的

主从站,还有在硬件上如何实现modbus通讯等一系列内容敬请关注,同时,由于本人

也是出于学习目的,希望博文中有任何不足的地方都请大家提出,我也学习改正。


你可能感兴趣的:(Modbus)