实际工作中如何用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)
相关推荐
小蜗牛慢慢爬行几秒前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
goTsHgo29 分钟前
在 Spring Boot 的 MVC 框架中 路径匹配的实现 详解
spring boot·后端·mvc
waicsdn_haha41 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
打鱼又晒网42 分钟前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
Q_19284999061 小时前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
良许Linux1 小时前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
求知若饥1 小时前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
左羊1 小时前
【代码备忘录】复杂SQL写法案例(一)
后端
gb42152872 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶2 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot