初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)
来源:互联网 发布:新媒体排版软件 编辑:程序博客网 时间:2024/05/21 03:20
由于感觉上一次写的篇幅过长,所以新开一贴,继续介绍Modbus TCP/IP的初步认识,
书接上回
3)、03(0x03)功能码--------读保持寄存器
请求与响应格式
这是一个请求读寄存器108-110 的实例:
发送数据为:
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设置
我们再看一下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
程序如下:
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设置
我们再看一下Wireshark截取封包
Modbus TCP请求
Modbus TCP响应
我们的软件所收到的数据
5)、06 (0x06)写单个寄存器
请求与应答PDU
这是一个请求将十六进制00 03 写入寄存器2的实例:
发送数据为;
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
程序如下:
<span style="font-size:14px;">public void showMsg06(string msg){ //在线程里以安全方式调用控件 if (receive0x06.InvokeRequired) { MyInvoke _myinvoke = new MyInvoke(showMsg06); receive0x06.Invoke(_myinvoke, new object[] { msg }); } else { receive0x06.AppendText(msg); }}</span>
我们再来看一下Modbus Slave设置
我们再看一下Wireshark截取封包
Modbus TCP请求
Modbus TCP响应
在一个远程设备中,使用该功能码强制线圈序列中的每个线圈为ON 或OFF。
域比特位置中的逻辑“1”请求相应输出为ON。
域比特位置中的逻辑“0”请求相应输出为OFF。
请求与应答PDU
这是一个请求从线圈20 开始写入10 个线圈的实例:
发送数据为;
0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x0F, 0x00, 0x14, 0x00, 0x0A,0x02,0xCD,0x01
程序如下:
<span style="font-size:14px;">private void send0F_Click(object sender, EventArgs e)</span>
<span style="font-size:14px;">{ byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x0F, 0x00, 0x14, 0x00, 0x0A, 0x02, 0xCD, 0x01 }; newclient.Send(data);}</span>
接收数据为:
0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x0F, 0x00,0x14,0x00, 0x0A
程序如下:
<span style="font-size:14px;">public void showMsg0F(string msg){ //在线程里以安全方式调用控件 if (receive0x0F.InvokeRequired) { MyInvoke _myinvoke = new MyInvoke(showMsg0F); receive0x0F.Invoke(_myinvoke, new object[] { msg }); } else { receive0x0F.AppendText(msg); }}</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
程序如下:
<span style="font-size:14px;">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);}</span>
接收数据为:
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设置
我们再看一下Wireshark截取封包
Modbus TCP请求
Modbus TCP响应
我们的软件所收到的数据
至此,我们对Modbus协议的初步认识就到此结束了,这里我们只做了对Modbus TCP
客户端的了解,之后的博文中我会陆续增加Modbus TCP服务器,modbus 485协议的
主从站,还有在硬件上如何实现modbus通讯等一系列内容敬请关注,同时,由于本人
也是出于学习目的,希望博文中有任何不足的地方都请大家提出,我也学习改正。
5 0
- 初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)
- 初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(一)
- 开放的Modbus TCP(二)
- 树莓派 linux下modbus总结(TCP-modbus,RS232-modbus)
- C#使用TCP/IP与ModBus进行通讯
- C#使用TCP/IP与ModBus进行通讯
- C#使用TCP/IP与ModBus进行通讯
- C#使用TCP/IP与ModBus进行通讯
- C#使用TCP/IP与ModBus进行通讯
- C#使用TCP/IP与ModBus进行通讯
- 融合SignalR的ModBus-TCP客户端
- Modbus、Modbus TCP、Modbus RTU和Modbus ASCII的区别
- TCP/IP Modbus消息体格式
- 基于tcp/ip协议的ModBus
- Snort与Modbus TCP
- java modbus tcp 通讯
- modbus TCP 示例报文
- ModBus/TCP协议分析
- 异步请求实现用户名校验是否存在
- Asp.Net MVC 模型(使用Entity Framework创建模型类)
- Salt & Pepper—The Art of Illustrating Texture
- Qt5.5.1中文乱码解决办法
- 《代码大全》读书笔记及随想(day08)
- 初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)
- LeetCode | Distinct Subsequences
- 05 Activity 现场保护
- struts表单乱码的解决方法
- HTML5,CSS3 旋转立方体
- C++编程笔记:二维数组的动态分配与释放
- |Vijos|NOIP2005|动态规划|P1002 过河
- Android Studio中快捷键冲突
- gulp 入门