由于感觉上一次写的篇幅过长,所以新开一贴,继续介绍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通讯等一系列内容敬请关注,同时,由于本人

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


初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)的更多相关文章

  1. 计算机网络通信TCP/IP协议浅析 网络发展简介(二)

    本文对计算机网络通信的原理进行简单的介绍 首先从网络协议分层的概念进行介绍,然后对TCP.IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket   分层的 ...

  2. TCP/IP源码(59)——TCP中的三个接收队列

    http://blog.chinaunix.net/uid-23629988-id-3482647.html TCP/IP源码(59)——TCP中的三个接收队列  作者:gfree.wind@gmai ...

  3. TCP/IP协议族之链路层(二)

    TCP/IP学习记录,如有错误请指正,谢谢!!! TCP/IP协议族之链路层(二) 链路层是最底层协议,主要有三个目的: 1. 为IP模块发送和接收IP数据报 2. 为ARP模块发送ARP请求和接收A ...

  4. 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用

     图解 TCP/IP  第六章 TCP与UDP   笔记6.1 传输层的作用   传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...

  5. TCP/IP解析(一):TCP/IP的工作方式

    本文包括下面内容: 1.TCP/IP协议系统 2.OSI模型 3.数据包 4.TCP/IP的交互方式 1.TCP/IP模型的协议层 分为四层: 网络訪问层:提供与物理网络连接的接口.依据硬件的物理地址 ...

  6. linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解

    最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...

  7. TCP/IP学习笔记:TCP传输控制协议(一)

    1 TCP的服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向用户提供一种面向连接的,可靠地字节流服务.两个使用TCP的应用,在彼此交换数据之前必须先建立一个TCP连接,在一个TCP连接中 ...

  8. -1-7 java 网络编程基本知识点 计算机网络 TCP/IP协议栈 通信必备 tcp udp

    计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来, 在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. 网络编程 ...

  9. TCP/IP知识总结(TCP/IP协议族读书笔记二)

    接下来,总结一下网络层的协议,IP,ARP,RARP,ICMP,IGMP.当我们在网络传输的过程中,把分组交付到主机或路由器需要两级地址:物理地址和逻辑地址.而且我们需要能够把物理地址映射成为相应的逻 ...

随机推荐

  1. Http标准协议Android网络框架——NoHttp

    NoHttp详细文档:http://doc.nohttp.net NoHttp公益测试接口:http://api.nohttp.net 支持与RxJava完美结合.支持一句话切换底层为OkHttp,支 ...

  2. python getopt学习记录

    有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的).在C语言里,m ...

  3. HDFS删除并清空回收站

    删除文件并放入回收站: hdfs dfs -rm -f /path 删除文件不放入回收站: hdfs dfs -rm -f -skipTrash /path 清空回收站: hdfs dfs -expu ...

  4. Storm sql 简单测试

    准备工作: 1.安装Kafka,启动,以及创建相应的topic 1.启动kafka bin/kafka-server-start.sh config/server.properties > /d ...

  5. java中map的应用

    map是键值对的集合接口,需要存储两个字段有联系的字段时可以使用这个. 1.查找字符串数组重复次数最多的字符串的重复次数 思路:使用map键值对存储,key值存数字符串,value存储出现的次数 Ma ...

  6. Laravel之目录结构

    一.根目录 新安装的 Laravel 应用包含许多文件夹:• app 目录包含了应用的核心代码:• bootstrap 目录包含了少许文件用于框架的启动和自动载入配置,还有一个cache 文件夹用于包 ...

  7. 常用的二种修改mysql最大连接数的方法

    方法一:进入MYSQL安装目录 打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100   修改为 max_connections=1000 服务里重起MY ...

  8. Ant Design Mobile 使用 rc-form

    引入: import { createForm } from 'rc-form'; 步骤一:绑定 form // 将form表单的api绑定到props,便于调用 const EditHeaderWr ...

  9. 设计模式之十八:桥接模式(Bridge)

    桥接模式: 将抽象部分和它的实现部分相分离开来,以使它们能够单独地变化. UML图: 主要包含: Abstraction:定义了抽象部分的接口.操作一个实现部分对象的引用. RefinedAbstra ...

  10. STL学习笔记(迭代器类型)

    迭代器类型 迭代器是一种“能够遍历某个序列内的所有元素”的对象.它可以透过与一般指针一致的接口来完成自己的工作. 不同的迭代器具有不同的”能力“(行进和存取能力) Input迭代器 Input迭代器只 ...