• 初识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
  • 相关阅读:
    黄聪:destoon常用数据库操作(插入、更新、删除、获取一行信息)
    黄聪:wordpress获取当前插件文件所在目录文件夹路径
    黄聪:destoon系统标签调用大全(转)
    黄聪:Destoon供求栏目下旺旺无法正常显示,点击提醒“会员名不存在”
    黄聪:DZ7.2搬家后图片显示为X,无法正常显示
    黄聪:Destoon大文件上传限制,修改设置上限。
    黄聪:WordPress添加“特色图片”功能并调用
    黄聪:Destoon中循环嵌套Loop和php代码结合调用自增长数字
    黄聪:JS+DIV+CSS实现图表、饼状图、折线图功能Highcharts
    黄聪:Destoon模板存放及调用规则
  • 原文地址:https://www.cnblogs.com/HarryK4952/p/14461725.html
Copyright © 2020-2023  润新知