实际工作中如何用python对接modbus协议

前言

公司业务杂,需要读取硬件设备,然后集成显示到大屏上。对接的设备有温湿度传感器、美的空调中央空调等。这些设备大多采用modbus协议,所以必须掌握。

对该协议不懂的,请到b站上找个视频了解一下,光看文字,你真不一定能看懂。

1. 简单了解

1.1 什么是modbus协议

1.Modbus协议是一种通信协议,用于在工业自动化系统中连接不同设备和控制器。

2.Modbus协议基于主从架构,其中一个设备充当主站(Master),而其他设备则充当从站(Slave)。主站负责发起通信请求,而从站则响应这些请求并提供所需的数据。

  1. Modbus协议可以通过串行通信(如RS-232、RS-485)或以太网进行传输。它使用简单的二进制编码格式,所以分类有 RTU,ASCII,TCP三种协议

以Modbus RTU 通信协议为例,了解一下功能码

功能码

Modbus是一种通信协议,用于在工业自动化系统中实现设备之间的通信。它定义了一组功能码,用于指定通信的目的和操作类型。下面是一些常见的Modbus功能码:

  1. 读取线圈状态(Read Coils):功能码为01,用于读取设备中的线圈(开关量输出)的状态。

  2. 读取输入状态(Read Discrete Inputs):功能码为02,用于读取设备中的输入状态(开关量输入)。

  3. 读取保持寄存器(Read Holding Registers):功能码为03,用于读取设备中的保持寄存器(16位数据)的值。

  4. 读取输入寄存器(Read Input Registers):功能码为04,用于读取设备中的输入寄存器(16位数据)的值。

  5. 写单个线圈(Write Single Coil):功能码为05,用于向设备中的线圈写入单个状态值。

  6. 写单个保持寄存器(Write Single Register):功能码为06,用于向设备中的保持寄存器写入单个值。

  7. 写多个线圈(Write Multiple Coils):功能码为15,用于向设备中的多个线圈写入连续的状态值。

  8. 写多个保持寄存器(Write Multiple Registers):功能码为16,用于向设备中的多个保持寄存器写入连续的值。

1.2 ModbusRTU/ASCIl报文格式粗浅理解

ModbusRTU/ASCIl报文格式:从站地址(设备编号)+功能码+数据+校验

2.以读取温湿度传感器为例

2.1 先判断你用的具体是哪种协议

说明书告诉我们这个传感器采用的是标准的modbus-rtu协议,但是我的工作现场,它需要经过卓岚的modbus网关然后通过以太网接入到服务器。


在网关设置modbus tcp 转rtu,就可以在代码里使用modbus-tcp协议。

但是由于这个网关还接入了青鸟消防等其他不支持modbus协议的设备,所以实际并没有使用任何转换协议 ,而直接使用modbus-rtu是拿不到数据的。

所以在取数据时要用modbus-rtu-overtcp协议才行,可以用软件modbuspoll直接测

2.2 Modbus-TCP和Modbus-RTU 的区别

Modbus是一种通信协议,用于在不同设备之间进行数据传输。Modbus-TCP和Modbus-RTU是Modbus协议的两种不同的物理层实现方式。

2.2.1Modbus-TCP

Modbus-TCP是基于TCP/IP协议的Modbus实现。它使用以太网作为物理层,并通过TCP/IP协议栈进行数据传输。

2.2.2 Modbus-RTU

Modbus-RTU是基于串行通信的Modbus实现,常用于RS-485总线上。

需要注意的是,Modbus-TCP和Modbus-RTU的报文格式存在一些差异,主要是由于物理层的不同。

2.3 python代码实现

通过前文,我们需要选择modbus-rtu-overtcp协议。 所以代码实现很简单,不过先要pip install modbus_tk

py 复制代码
@api_view(['GET'])
def get_humiture(request):
    """获取温湿度"""
    import modbus_tk.modbus_rtu_over_tcp as mt
    #
    import modbus_tk.defines as md
    #
    master = mt.RtuOverTcpMaster("192.168.1.200", 502)#这个端口是默认端口
    #
    master.set_timeout(1.0)
    #功能码(function_code)可以直接写数字,slave就是设备编号,starting_address是开始地址,quantity_of_x是你要读多少个数据
    result= master.execute(slave=2, function_code=md.READ_INPUT_REGISTERS, starting_address=0,quantity_of_x=10)
    data = result
    return DetailResponse(data=data)
相关推荐
Chrikk1 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*1 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue1 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man1 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
customer083 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
石牌桥网管4 小时前
OpenSSL 生成根证书、中间证书和网站证书
网络协议·https·openssl
Yaml44 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
小码编匠5 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#