学习使用pymodbus模块实现Modbus通讯

python 实现Modebus 通信(pyModbusTCP ) 尽管python 并不实现实时控制应用程序,但是它编写程序实在是太方便了。至少在程序快速成型和验证过程中可以使用Python 来实现,另一方面,Python 强大的数值计算和图形显示能力也能够实现modbus 设备的远程监控,数据采集,甚至AI 训练。注意的是 auto_open和auto_close两个标记,它指明每次请求modbusTCP 时是否会自动打开和关闭TCP/IP 连接。如果auto_close=True 表示每次都会自动关闭连接,经测试,它会引起2秒中的延时。 阅读详情
AI摘要

本文介绍如何使用Pymodbus模块进行Modbus通讯。包括连接设置、读取和写入寄存器的方法,以及处理异常的技巧。

Modbus是一种工业领域广泛使用的通信协议,而PyModbus是一个在Python中实现Modbus通信的库。它支持多种Modbus模式,包括RTU(通过串行线路),ASCII和TCP/IP。

1. 建立通讯

from pymodbus.client import ModbusTcpClient

client = ModbusTcpClient('localhost', port=502)
client.connect()

2. 读取数据

2.1 读取寄存器

Modbus协议定义了几种类型的寄存器,最常见的是保持寄存器和输入寄存器。以下示例展示了如何读取保持寄存器:

response = client.read_holding_registers(address=1, count=10, unit=1)
if not response.isError():
    print("Register Values: ", response.registers)
else:
    print("Failed to read registers")

在这个例子中,read_holding_registers方法用于读取地址为1的起始位置、数量为10的连续寄存器。unit参数表示从哪个单元(即设备ID)读取数据。

注意:pymodbus某个版本已将unit字段改为slave。使用时即使写错也不会报错,注意查看你的pymodbus文档。

3. 写入数据

3.1 写入单个寄存器

要向设备的单个寄存器写入数据,可以使用以下代码:

write_response = client.write_register(address=1, value=25, unit=1)
if not write_response.isError():
    print("Written successfully")
else:
    print("Failed to write register")

这里使用了write_register方法,它接受地址、要写入的值以及目标设备的单元ID。

3.2 写入多个寄存器

如果要写入多个寄存器,可以使用write_registers方法:

values = [20, 40, 60, 80, 100]
write_response = client.write_registers(address=1, values=values, unit=1)
if not write_response.isError():
    print("Multiple registers written successfully")
else:
    print("Failed to write multiple registers")

这里values列表包含了要写入寄存器的值序列。

4. 处理异常

处理Modbus通信过程中可能出现的异常非常重要,可以使用try-except语句捕获这些异常:

from pymodbus.exceptions import ModbusException

try:
    # 尝试执行Modbus操作
    response = client.read_holding_registers(address=1, count=10, unit=1)
except ModbusException as ex:
    print("An error occurred:", str(ex))

5. 数据类型转换

modbus读写数据时的数据类型转换通常是通过struct模块实现的。

读取modbus数据时,常用到以下的数据类型转换关系。

 def _convert_to_float(self, registers):
        if len(registers) != 2:
            print("Invalid register length for float")
            return None
        combined = (registers[0] << 16) + registers[1]
        return struct.unpack(">f", combined.to_bytes(4, byteorder="big"))[0]

    def _convert_to_int32(self, registers):
        if len(registers) != 2:
            print("Invalid register length for int32")
            return None
        combined = (registers[0] << 16) + registers[1]
        return struct.unpack(">i", combined.to_bytes(4, byteorder="big"))[0]

    def _convert_to_uint32(self, registers):
        if len(registers) != 2:
            print("Invalid register length for uint32")
            return None
        combined = (registers[0] << 16) + registers[1]
        return struct.unpack(">I", combined.to_bytes(4, byteorder="big"))[0]

    def _convert_to_int16(self, registers):
        if len(registers) != 1:
            print("Invalid register length for int16")
            return None
        return struct.unpack(">h", struct.pack(">H", registers[0]))[0]

    def _convert_to_uint16(self, registers):
        if len(registers) != 1:
            print("Invalid register length for uint16")
            return None
        return struct.unpack(">H", struct.pack(">H", registers[0]))[0]

写入modbus数据时,常用到以下的数据类型转换关系。

 def _int32_to_registers(self, value):
        packed = struct.pack(">i", value)
        high_register, low_register = struct.unpack(">HH", packed)
        return [high_register, low_register]

    def _uint32_to_registers(self, value):
        packed = struct.pack(">I", value)
        high_register, low_register = struct.unpack(">HH", packed)
        return [high_register, low_register]

    def _uint16_to_register(self, value):
        packed = struct.pack(">H", value)
        register = struct.unpack(">H", packed)[0]
        return [register]

    def _int16_to_register(self, value):
        packed = struct.pack(">h", value)
        register = struct.unpack(">h", packed)[0]
        return [register]
python modbus RTU 需要注意的是,使用 Modbus RTU 通讯时,还需要注意一些串口设置,例如数据位、停止位、校验等。在实际使用时,需要根据具体设备的规格说明来进行设置。在连接时,需要指定一些连接参数,例如设备的地址、端口、波特率等。Modbus RTU 是一种基于串口通讯的 Modbus 协议,它适用于需要长距离和高速传输的场合。在使用 PyModbus 库时,需要根据设备类型(TCP 还是 RTU)来指定不同的。类创建了一个 Modbus RTU 客户端对象,并指定了串口的设备文件名(方法读取了一个保持寄存器的值。 阅读详情

相关推荐

使用 Python 通过 ModbusTCP 连接 PLC(不限品牌 含示例程序)

通过本文的学习,读者将能够掌握使用 Python 与 PLC 进行数据交互的基本技巧,进一步开发出更加智能和灵活的工控系统。通过几行简洁的 Python 代码,我们就可以实现对 PLC 的读写操作,从而实现设备的控制和数据采集。例如,在生产过程中,您可以通过与 PLC 交互来实现批次切换、产品跟踪、设备故障检测和处理等功能,从而提高生产线的效率和灵活性。因此,我们还将提醒读者在使用 Python 连接 PLC 时,注意网络安全风险,并妥善处理异常情况,以确保系统的可靠性和稳定性。

weixin_68789096的博客 5852

python pymodbus库使用教程(以Modbus RTU为例)(read_holding_registers()、read_input_registers())

Modbus是一种工业领域广泛使用的通信协议,而PyModbus是一个在Python中实现Modbus通信的库。它支持多种Modbus模式,包括RTU(通过串行线路),ASCII和TCP/IP。本教程将重点介绍如何使用PyModbus库进行Modbus RTU通信。有时候,标准的Modbus函数不足以满足特定的需求。PyModbus允许创建自定义消息和事务处理器,使得可以扩展协议以适应特殊用例。

Dontla的博客 3万+

pyserial和pymodbus

pyserial:提供与串行设备(如 RS-485 转 USB)进行通讯的基础支持,适合做低层的串行通讯。pymodbus:提供实现 Modbus 协议的支持,适用于与工业设备和传感器之间的通讯,支持 RTU 和 TCP 两种模式。你可以根据需求结合这两个库,首先用 pyserial 打开串行端口,然后用 pymodbus 实现与 Modbus 设备的高层通讯。

万物琴弦存于你的泡沫之中,光锥之外 920

python pymodbus模块详解

摘要: pymodbus是一个Python实现的Modbus协议库,支持TCP和RTU通信模式,适用于工业自动化场景。它提供客户端(主站)和服务器(从站)功能,支持读写线圈、离散输入、保持寄存器等数据类型。核心特性包括同步/异步操作、轻量级设计及跨平台兼容性。安装简单(pip install pymodbus),示例代码展示了TCP客户端读取寄存器、RTU串口通信及服务器搭建等典型用法。高级功能支持异步优化、自定义数据处理,但需注意协议限制(如地址范围、时序要求)和错误处理。适用于PLC、HMI等设备交互,

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 3448

基于pyside2(pyqt5)和pymodbus实现的modbus协议通信界面程序

本次项目python版本环境: python3.10.9所需要的库: PySide2、pymodbus、serial、threading、time1.命令行输入(下载慢的话可使用国内镜像源下载,之前的文章我讲过)2.安装modbus仿真工具,modbus Poll和modbus slave。两个软件都只有几兆,去网上随便一搜就有很多,所以这两个软件还请大家自行下载。3.安装Configure Virtual Serial Port Driver,用来创建虚拟串口。

qq_64192931的博客 2192

pymodbus多设备轮询策略:高效采集方案

深入探讨基于pymodbus的多设备轮询方案,提升工业数据采集效率与稳定性,有效应对高并发场景下的通信挑战,为自动化系统提供可靠支持。

weixin_36382073的博客 1096

python实现RS485通讯

ython 本文章主要用软件层协议modbus实现RS485通讯(python);modbus协议支持RTU,TCP,ASCII通信,其中RTU主要依赖串口通信RS485/RS232,我们在这里主要实现RS485通信想要了解RS485首先要明白串口通讯 串口通讯为全双工通讯,支持同时传输与发送,首先要明确帧格式与波特率, 每帧数据由用户将高低电平组合进行发送,波特率指串口在一秒钟发送的高低电平数,由于串口通讯的高低电平差较小,抗干扰能力差,于是我们用RS485,RS232等不同标准的来将串口信息强化,使其不

qq_46267667的博客 2370

ROS学习篇之通讯(五)-modbusTcp通讯

plc需要和电脑通过网线连接,相互ping对方的ip均可以ping通,两者需要在同一个网段内。ros运行在工控机上,工控机作为上位机,PLC作为执行器,驱动伺服电机运行。192.168.0.5开启服务端的ip,也就是本机的ip。192.168.0.5开启服务端的ip,也就是本机的ip。工控机与PLC的通讯通过ModbusTcp实现。用于创建server, 开启服务。用于读写通讯,交互信息。端口号默认为:502。

qq_43006346的博客 3736

深入掌握pymodbus:构建Python Modbus通信系统的完整指南

pymodbus是一个功能完整的Python Modbus协议栈,为开发者提供了构建工业自动化、物联网和智能家居系统中Modbus通信的完整解决方案。这个开源库不仅支持标准的Modbus协议,还提供了丰富的客户端、服务器和模拟器功能,让Python开发者能够轻松实现设备间的数据交换和控制。 ## 🎯 理解Modbus协议与pymodbus的核心价值 Modbus协议是工业自动化领域最广泛应用

gitblog_00887的博客 736

ModBus TCP通讯连接与调试实战:从工具使用到代码实现

工业通讯协议是连接PLC、传感器与上位机系统的技术基础,其中ModBus协议因其简单可靠,成为工业自动化领域的通用语言。其核心原理是将寄存器读写指令封装成标准报文,通过串行或网络介质传输。ModBus TCP在TCP/IP协议栈上运行,实现了设备间的以太网通讯,技术价值在于解决了异构设备互联与数据采集的标准化问题,广泛应用于SCADA、MES等工业物联网场景。本文聚焦ModBus TCP的实操环节,详细解析如何利用Modbus Slave模拟器和Modbus Poll调试工具,逐步完成网络连通性测试、TCP

weixin_30363285的博客 252

DPABI安装教程

DPABI是是中科院心理研究所严超赣老师团队开发的一款磁共振脑影像数据分析工具包。基于SPM,在安装DPABI之前需要安装好SPM,才能正常使用。SPM的安装方法见文matlab2021a版本条件下安装spm_kidllll的博客-优快云博客 1、下载安装包 下载地址:DPABI: a toolbox for Data Processing & Analysis for Brain Imaging | The R-fMRI Network 2、将下载好的dpabi文件夹移动到matl..

qq_42356925的博客 1万+

MODBUSScan:轻松检测MODBUS设备通讯状态的利器

MODBUSScan:轻松检测MODBUS设备通讯状态的利器 【下载地址】MODBUSScan使用说明 MODBUS Scan 是一款专为 MODBUS RTU 通讯设计的实用工具,旨在帮助用户快速检测和诊断设备通讯状态。通过其高效的快速扫描功能,用户可以轻松识别网络中的设备,并通过详细的通讯数据分析,精准定位问题所在。...

gitblog_06764的博客 1127

HyperLynx(三十一)高速串行总线仿真(三)

(5)选择 “File”→ “Open Touchstone”,打开路径 C:\Adv_HL_Tmg\SERDES_Interface\models,选中connector.s4p,单击打开,如图所示。接下来,找出将要分配模型的S参数连接。(12)单击“Assign”按钮,选择模型类型为“Touchstone models”,在库中选择“connector.s4p”,如图所示。(14)单击“OK”按钮,选中“connector.s4p”这一行,单击“Connection Editor”按钮,如图所示。

小幽余生不加糖 3366

pymodbus使用介绍

点击上方蓝字可直接关注哦,方便下次阅读~ 上次介绍的是Modbus调试助手的使用,这次我们自己使用第三方库实现一些功能。 当我们写程序写的多一些时,自然就会使用第三方库,在使用过程中注意规避掉一些坑即可。 接下来我们使用python的pymodbus库来实现modbus 功能。 运行环境:Ubuntu 14.04、Python2.7 1.下载pymodbus库 ...

Pou光明的博客 5510

华为OD机试 - 开源项目热度榜单(Java 2025 C卷 100分)

H = Wwatch X#watch + Wstar X#star +Wfork X#fork +Wissue X#issue +Wmr X#mr H表示热度值,Wwatch、Wstar、Wfork、Wissue、Wmr分别表示5个统计维度的权重,#watch、#star、#fork、#issue、#mr分别表示5个统计维度的统计值。

学Java,找哪吒 1755

Bev算法在J5平台的部署

支持多种形式的Bev算法:ipmlss时序,以及基于transformer的gkt。

@bangbang的博客 846

基于CCD检测与MODBUS通讯的设备实战分享

CCD检测+MODBUS通讯采用MODBUS压力模拟量通讯+CCD工业相机检测。采用模块化大型系统编程思路,各站能独立运行或者同步运行。已经实际在设备上批量应用。是广大电气工程人员爱好者参考的经典案列。详细注释程序+威纶通6071IP触摸屏组态。嘿,各位电气工程爱好者们!

2508_94216203的博客 1441

linux平台Modbus TCP测试

【代码】linux平台Modbus TCP测试。

无线互联&网络介绍 818

python如何用pymodbus库进行modbus tcp通信

零距离AI可以帮你高效完成AI问答、AI对话、代码生成等开发相关的问题以及解决生活中遇到的各种疑难杂症,还能帮助你进行AI写作、AI绘画等等,提高你的工作学习效率。直接运行该脚本,就可以在本机的503端口创建一台modbus设备了,具体实现暂不深追,我们学习的重点是客户端对modbus变量的读写。使用python解决工业通信问题是一个非常好的选择,python具有丰富的生态,可以轻松解决工业通信的各种问题。这里我们先创建一个虚拟的modbus设备,如果你手里有一个plc或者工业设备,可以直接跳过本节。

Oona_01的博客 753

Claude Code 源码一夜流出:会看热闹的人很多,会读源码的人很少

摘要:Claude Code源码意外泄露后,作者分享了高效的源码学习方法:1)Fork仓库保存代码;2)使用Qoder的Repo Wiki功能生成结构化文档和UML图;3)基于Wiki创建可复用的Skill。这种方法比直接让AI总结代码更系统深入,并推荐了可视化学习项目辅助理解。文章强调实践的重要性,提供了具体工具和操作指南。

720

Java调用YOLOv26全解析:从ONNX模型部署到工业质检实战

本文分享了工业自动化领域使用Java调用YOLOv26进行零件缺陷检测的完整方案。通过YOLOv26s模型结合ONNX Runtime Java部署,误检率和漏检率显著降低(分别从12%降至2.1%,8%降至0.8%)。文章详细介绍了方案选型理由、环境配置避坑指南、ONNX模型导出步骤,以及Maven依赖配置(分CPU/GPU版本)。该方案直接在上位机Java环境中运行,避免了跨语言调用损耗,适合工业质检场景部署,提供了可复用的性能优化和多线程推理实现。

2601_94871597的博客 1108

如何使用Python取代你的HMI,Pymodbus TCP使用解析

本文介绍了如何使用Python的Pymodbus库与PLC进行通信,实现通过程序控制PLC输入信号的方法。

m0_50807424的博客 774

Vue3 - Element Plus上传组件el-upload上传多个文件时,让on-change监听事件仅执行一次并获取最终文件列表方法(开启多选文件并手动上传,拿到文件列表统一循环调用接口上传)

vue3,elementplus,Upload上传,el-upload,文件上传组件,上传组件on-change里执行多次,取消自动上传后change重复执行问题,upload上传多个文件后导致on-change执行多次拿不到最终文件列表,Element-plus的upload组件on-change不断执行怎么办,上传多个文件多次执行调用,上传多个文件时如何只执行一次on-change方法拿到最终的文件列表,vue3elementplus上传组件开启多个上传后导致change方法执行好几次,仅调用一

🏆 前端领域优质创作者 1万+

pymodbus替代Modbus Poll:工业自动化通信的工程化跃迁

Modbus是一种广泛应用于工业现场的串行通信协议,其RTU/TCP模式依赖严格的帧结构、时序控制与异常处理机制。传统GUI工具如Modbus Poll仅支持人工交互调试,缺乏自动重连、定时采集、结构化数据输出等生产级能力。而pymodbus作为Python实现的可编程Modbus协议栈,将协议解析、CRC校验、RS485静默间隔、异常响应等底层逻辑全部暴露为API,天然兼容pandas、Docker、systemd等现代工程生态。结合rs485接线规范、串口权限配置及工业级脚本架构(连接管理+滑动窗口调度

weixin_33404102的博客 229

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Modbus协议了解与简单使用

Modbus 是一种串行通信协议,用于工业自动化系统中的数据传输。它被广泛应用于监控和控制设备。Modbus 协议由 Modicon(现在是施耐德电气的一部分)在 1979 年开发,用于其 PLC(可编程逻辑控制器)中。它是一种开源协议,可以在不同类型的网络和设备中使用。它是用于在电子设备之间的串行线路上传输信息的方法。

小嵌同学的博客 1842

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

用Python3分钟搞定ModbusTCP设备调试(附PyModbus实战代码)

本文介绍如何利用Python和PyModbus库快速搭建ModbusTCP设备调试环境,无需依赖物理PLC硬件。通过构建虚拟从站和智能主站客户端,实现数据读写、协议分析和自动化测试,为工程师提供高效的通讯协议调试解决方案。

garlic的博客 941

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: asyncua模块实现OPC UA通讯
下一篇: PyQt5中如何只使用一个dateEdit控件实现自动选择日期区间功能
草莓仙生
博客等级 码龄8年 2034粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

草莓仙生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值