实际工作中如何用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)
相关推荐
A尘埃几秒前
SpringBoot的数据访问
java·spring boot·后端
yang-23072 分钟前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code7 分钟前
(Django)初步使用
后端·python·django
代码之光_198014 分钟前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端
编程老船长27 分钟前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
IT果果日记1 小时前
DataX+Crontab实现多任务顺序定时同步
后端
SizeTheMoment1 小时前
初识HTTP协议
网络·网络协议·http
姜学迁2 小时前
Rust-枚举
开发语言·后端·rust
爱学习的小健3 小时前
MQTT--Java整合EMQX
后端
北极小狐3 小时前
Java vs JavaScript:类型系统的艺术 - 从 Object 到 any,从静态到动态
后端