实际工作中如何用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)
相关推荐
程序猿chen8 分钟前
JVM考古现场(二十五):逆熵者·时间晶体的永恒之战(进阶篇)
java·jvm·git·后端·程序人生·java-ee·改行学it
帽儿山的枪手17 分钟前
如何使用socket系统调用创建TCP三次握手呢?
网络协议·tcp/ip·go
细心的莽夫18 分钟前
Elasticsearch复习笔记
java·大数据·spring boot·笔记·后端·elasticsearch·docker
程序员阿鹏28 分钟前
实现SpringBoot底层机制【Tomcat启动分析+Spring容器初始化+Tomcat 如何关联 Spring容器】
java·spring boot·后端·spring·docker·tomcat·intellij-idea
Asthenia04121 小时前
HTTPS 握手过程与加密算法详解
后端
刘大猫261 小时前
Arthas sc(查看JVM已加载的类信息 )
人工智能·后端·算法
Asthenia04121 小时前
操作系统/进程线程/僵尸进程/IPC与PPC/进程大小/进程的内存组成/协程相关/Netty相关拷打
后端
Asthenia04122 小时前
深入解析 MySQL 执行更新语句、查询语句及 Redo Log 与 Binlog 一致性
后端
桃花岛主702 小时前
WebSocket是h5定义的,双向通信,节省资源,更好的及时通信
网络·websocket·网络协议
杨充3 小时前
10.接口而非实现编程
后端