modbus tcp 协议的仿真及pymodbus开发

本文详细介绍了Modbus TCP协议的基础知识,包括协议对象、功能码等,并通过实际仿真实验展示了如何配置Modbus Poll和Modbus Slave。此外,还使用Python的pymodbus库演示了读取Modbus Slave寄存器数据的过程,解析了Modbus TCP数据报文结构。
摘要由CSDN通过智能技术生成

1、Modbus协议

  • Modbus协议操作四个对象
对象含义
线圈PCL的输出位,开关量,在Modbus中可读可写
离散量PLC的输入位,开关量,在Modbus中只读
输入寄存器PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读
保存寄存器PLC中用于输出模拟量信号的寄存器,在Modbuszhong可读可写
  • Modbus 的功能码
功能码含义
0x01读线圈
0x05写单个线圈
0x0F写多个线圈
0x02读离散量输入
0x04读输入寄存器
0x03读保持寄存器
0x06写单个保持寄存器
0x10写多个保持寄存器

2、Modbus Tcp 仿真实验

仿真使用的软件有:
Modbus Poll和Modbus Slave,激活教程在下载文件里面;
下载地址:
链接:https://pan.baidu.com/s/1E-UyaZ4AyVuuLuy7WDVjAA
提取码:vmuy

  • modbus slave 从机寄存器配置

  • 初始化解释
    03对应的输入寄存器
    在这里插入图片描述

  • 首先配置配置Modbus Tcp 协议和502端口

按F3,配置如下,点击ok;

在这里插入图片描述

  • 配置寄存器
    按F8,
    在这里插入图片描述
    按照以上配置完成如下:
    在这里插入图片描述
    以上便是从机配置完成,下面配置主机。
  • Modbus poll 主机配置
    初始换界面
    在这里插入图片描述
  • 首先配置Modbus Tcp协议、端口、Modbus slave IP地址

按F3
在这里插入图片描述
点击ok

  • 配置功能码、寄存器编号、寄存器地址、寄存器数量
    按F8
    在这里插入图片描述
    按照上图配置完成,大功告成。
    在这里插入图片描述
  • 演示
  • 在这里插入图片描述

在这里插入图片描述
点击ok
在这里插入图片描述
成功!!!!!!!!!!!!!!!!!!!

3 、使用pymodbus 类库读取Modbus Slave寄存器数据

功能码含义pymodbus 函数
0x01读线圈def read_coils(self, address, count=1, **kwargs):
0x05写单个线圈def write_coil(self, address, value, **kwargs):
0x0F写多个线圈def write_coils(self, address, values, **kwargs):
0x02读离散量输入def read_discrete_inputs(self, address, count=1, **kwargs):
0x04读输入寄存器def read_input_registers(self, address, count=1, **kwargs):
0x03读保持寄存器def read_holding_registers(self, address, count=1, **kwargs):
0x06写单个保持寄存器def write_register(self, address, value, **kwargs):
0x10写多个保持寄存器def write_registers(self, address, values, **kwargs):

DEMO
配置
在这里插入图片描述

"""
功能:读线圈
时间:2020/11
作者:吕布
邮箱:1071283996@qq.com
"""
from pymodbus.client.sync import ModbusTcpClient
import time
# 配置寄存器IP地址和端口号
client = ModbusTcpClient('Modbus slave IP', port=502, timeout=1)

# 配置 寄存器地址:0、寄存器数量:30、寄存器ID:2;功能码:0x01=read_coils:   操作对象:线圈
def DSY_read_coils():
    request1 = client.read_coils(0, 10, unit=2)
    result1 = request1.bits
    # print(result.bits[0])
    print(result1)
    #    print(result[0])
    time.sleep(1)
if __name__=="__main__":
	DSY_read_coils()

效果:
在这里插入图片描述

4 、modbus tcp数据报文结构

请求:00 00 00 00 00 06 09 03 00 00 00 01

响应:00 00 00 00 00 05 09 03 02 12 34

一次modbus tcp读取保持寄存器的通信分析(省略了ip/tcp头):从左向右分析该数据报文:

请求:

00 00为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文;

00 00表示协议标识符,00 00为modbus协议;

00 06为数据长度,用来指示接下来数据的长度,单位字节;

09为设备地址,用以标识连接在串行线或者网络上的远程服务端的地址。以上七个字节也被称为modbus报文头;

03为功能码,此时代码03为读取保持寄存器数据;

00 00为起始地址;

00 01为寄存器数量,(word数量)。

响应:

00 00为此次通信事务处理标识符,应答报文要求与先前对应的请求保持一致;

00 00为协议标识符,与先前对应的请求保持一致;

00 05为数据长度,用来指示接下来数据的长度,单位字节;

09为设备地址,应答报文要求与先前对应的请求保持一致;

03为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;

02指示接下来数据的字节长度;

12 34为被读取的保持寄存器中的数据值,即要求被读取的地址为00 00的保持寄存器中的数值为1234h。

以上是全部博客,谢谢。
需要全部代码的可以访问:地址

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原味米粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值