zoukankan      html  css  js  c++  java
  • 初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)

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

    原创 2016年08月26日 23:06:56

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

    书接上回

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

    请求与响应格式

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

    发送数据为:
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x6B, 0x00, 0x03
     
    程序如下:
    [csharp] view plain copy
     
    1. private void send03_Click(object sender, EventArgs e)  
    2. {  
    3.     byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x6C, 0x00, 0x03 };  
    4.     newclient.Send(data);  
    5. }  



    接收数据为:
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x06, 0x02, 0x2B, 0x00,0x00,0x00,0x64
     
    程序如下:
     
    [csharp] view plain copy
     
    1. public void showMsg03(string msg)  
    2. {  
    3.     //在线程里以安全方式调用控件  
    4.     if (receive0x01.InvokeRequired)  
    5.     {  
    6.         MyInvoke _myinvoke = new MyInvoke(showMsg03);  
    7.         receive0x03.Invoke(_myinvoke, new object[] { msg });  
    8.     }  
    9.     else  
    10.     {  
    11.         receive0x03.AppendText(msg);  
    12.     }  
    13. }  

    我们再来看一下Modbus Slave设置
     
     
     
     
    我们再看一下Wireshark截取封包
     
    Modbus TCP请求
     
     
    Modbus TCP响应
     
     
    我们的软件所收到的数据
     
     
     
    4)、05(0x05)功能码--------写单个线圈
     
    十六进制值0XFF00请求线圈为ON。十六进制值0X0000请求线圈为OFF。
     
    其它所有值均为非法的,并且对线圈不起作用。
     
    请求与应答PDU
     
    这是一个请求写线圈173 为ON 的实例:
     
     
     
     
    发送数据为;
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0xAD, 0xFF, 0x00
    程序如下:
     
    [csharp] view plain copy
     
    1. private void send05_Click(object sender, EventArgs e)  
    2. {  
    3.     byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0xAD, 0xFF, 0x00 };  
    4.     newclient.Send(data);  
    5. }  

    接收数据为:
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x02, 0x03,0xAD, 0xFF, 0x00
    程序如下:
     
    [csharp] view plain copy
     
    1. public void showMsg05(string msg)  
    2. {  
    3.     //在线程里以安全方式调用控件  
    4.     if (receive0x05.InvokeRequired)  
    5.     {  
    6.         MyInvoke _myinvoke = new MyInvoke(showMsg05);  
    7.         receive0x05.Invoke(_myinvoke, new object[] { msg });  
    8.     }  
    9.     else  
    10.     {  
    11.         receive0x05.AppendText(msg);  
    12.     }  
    13. }  

    我们再来看一下Modbus Slave设置
     
     
     
    我们再看一下Wireshark截取封包
     
    Modbus TCP请求
     
    Modbus TCP响应
     
     
    我们的软件所收到的数据
     
     
     

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

    请求与应答PDU

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

    发送数据为;
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, 0x01, 0x00, 0x03

    程序如下:

    [csharp] view plain copy
     
    1. private void send06_Click(object sender, EventArgs e)  
    2. {  
    3.     byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, 0x01, 0x00, 0x03 };  
    4.     newclient.Send(data);  
    5. }  


    接收数据为:
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00,0x01, 0x00, 0x03
    程序如下:
     
    [csharp] view plain copy
     
    1. <span style="font-size:14px;">public void showMsg06(string msg)  
    2. {  
    3.     //在线程里以安全方式调用控件  
    4.     if (receive0x06.InvokeRequired)  
    5.     {  
    6.         MyInvoke _myinvoke = new MyInvoke(showMsg06);  
    7.         receive0x06.Invoke(_myinvoke, new object[] { msg });  
    8.     }  
    9.     else  
    10.     {  
    11.         receive0x06.AppendText(msg);  
    12.     }  
    13. }</span>  

    我们再来看一下Modbus Slave设置
     
     
     
     
    我们再看一下Wireshark截取封包
     
    Modbus TCP请求
     
     
    Modbus TCP响应
     
     
     
    6)、15 (0x0F) 写多个线圈

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

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

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

    请求与应答PDU

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

    发送数据为;
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x0F, 0x00, 0x14, 0x00, 0x0A,0x02,0xCD,0x01
     
    程序如下:

    [csharp] view plain copy
     
    1. <span style="font-size:14px;">private void send0F_Click(object sender, EventArgs e)</span>  
    [csharp] view plain copy
     
    1. <span style="font-size:14px;">{  
    2.     byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x0F, 0x00, 0x14, 0x00, 0x0A, 0x02, 0xCD, 0x01 };  
    3.     newclient.Send(data);  
    4. }</span>  

    接收数据为:
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x0F, 0x00,0x14,0x00, 0x0A

    程序如下:

    [csharp] view plain copy
     
    1. <span style="font-size:14px;">public void showMsg0F(string msg)  
    2. {  
    3.     //在线程里以安全方式调用控件  
    4.     if (receive0x0F.InvokeRequired)  
    5.     {  
    6.         MyInvoke _myinvoke = new MyInvoke(showMsg0F);  
    7.         receive0x0F.Invoke(_myinvoke, new object[] { msg });  
    8.     }  
    9.     else  
    10.     {  
    11.         receive0x0F.AppendText(msg);  
    12.     }  
    13. }</span>  

    我们再来看一下Modbus Slave设置

    我们再看一下Wireshark截取封包
     
    Modbus TCP请求

    Modbus TCP响应

    我们的软件所收到的数据

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

    请求与应答PDU

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

    发送数据为;
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x010, 0x00, 0x02, 0x00, 0x02, 0x04,0x00,0x0A,0x01,0x02
     
    程序如下:
     
    [csharp] view plain copy
     
    1. <span style="font-size:14px;">private void send10_Click(object sender, EventArgs e)  
    2. {  
    3.     byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x10, 0x00, 0x02, 0x00, 0x02, 0x04, 0x00,0x0A,0x01, 0x02 };  
    4.     newclient.Send(data);  
    5. }</span>  

    接收数据为:
     
    0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x10, 0x00,0x02, 0x00, 0x02
     
    程序如下:
     
    [csharp] view plain copy
     
    1. public void showMsg10(string msg)  
    2. {  
    3.     //在线程里以安全方式调用控件  
    4.     if (receive0x10.InvokeRequired)  
    5.     {  
    6.         MyInvoke _myinvoke = new MyInvoke(showMsg10);  
    7.         receive0x10.Invoke(_myinvoke, new object[] { msg });  
    8.     }  
    9.     else  
    10.     {  
    11.         receive0x10.AppendText(msg);  
    12.     }  
    13. }  

    我们再来看一下Modbus Slave设置
     

    我们再看一下Wireshark截取封包
     
    Modbus TCP请求
     
     
    Modbus TCP响应
     
     
    我们的软件所收到的数据
     
     
     
    至此,我们对Modbus协议的初步认识就到此结束了,这里我们只做了对Modbus TCP
     
    客户端的了解,之后的博文中我会陆续增加Modbus TCP服务器,modbus 485协议的
     
    主从站,还有在硬件上如何实现modbus通讯等一系列内容敬请关注,同时,由于本人
     
    也是出于学习目的,希望博文中有任何不足的地方都请大家提出,我也学习改正。
    本文源自: http://www.cnblogs.com/dathlin/p/7885368.html 
    HK
  • 相关阅读:
    win10 uwp 弹起键盘不隐藏界面元素
    win10 uwp 存放网络图片到本地
    win10 uwp 存放网络图片到本地
    sublime Text 正则替换
    sublime Text 正则替换
    win10 uwp 绘图 Line 控件使用
    win10 uwp 绘图 Line 控件使用
    AJAX 是什么?
    什么是 PHP SimpleXML?
    PHP XML DOM:DOM 是什么?
  • 原文地址:https://www.cnblogs.com/HarryK4952/p/14461725.html
Copyright © 2011-2022 走看看