当前位置: 首页 > news >正文

Python - Modbus测试

python -Modbus测试

前言

本实例中,python版本是python 3.10, 使用的pymodbus安装包进行实现,如没有按照此包,需要先执行如下指令:

pip install pymodbus

Modbus客户端的python实现

Modbus Client的客户端程序,通过如下代码实现:

from pymodbus.client import ModbusTcpClient# 创建客户端实例
client = ModbusTcpClient('localhost', port=5020)# 连接到服务器
client.connect()# 读取线圈的状态
result = client.read_coils(0, 10)
if not result.isError():print(result.bits)# 读取离散输入
result = client.read_discrete_inputs(0, 10)
if not result.isError():print(result.bits)# 读取保持寄存器
result = client.read_holding_registers(0, 10)
if not result.isError():print(result.registers)# 读取输入寄存器
result = client.read_input_registers(0, 10)
if not result.isError():print(result.registers)# 断开连接
client.close()

Modbus服务端的python实现

Modbus Server 的代码实现如下

from pymodbus.server import StartTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSlaveContext, ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer# 创建一个自动递增的寄存器值
def create_auto_increment_block(start_value, size):return ModbusSequentialDataBlock(0, [start_value + i for i in range(size)])# 初始化数据存储
store = ModbusSlaveContext(di=ModbusSequentialDataBlock(0, [0]*100),  # 离散输入co=ModbusSequentialDataBlock(0, [1]*100),  # 线圈#hr=ModbusSequentialDataBlock(0, [17]*100),  # 持续寄存器hr = create_auto_increment_block(0,100),ir=ModbusSequentialDataBlock(0, [5]*100)   # 输入寄存器
)
context = ModbusServerContext(slaves=store, single=True)# 设置身份信息
identity = ModbusDeviceIdentification()
identity.VendorName = 'Pymodbus'
identity.ProductCode = 'PM'
identity.VendorUrl = 'http://github.com/riptideio/pymodbus/'
identity.ProductName = 'Pymodbus Server'
identity.ModelName = 'Pymodbus Server'
identity.MajorMinorRevision = '3.5.0'#设置一个回调函数来处理写操作
def update_hr_write_request(address,value):print(f"持续寄存器{address}接收到写入请求,值为: {value}")def update_ir_write_request(value):print(f"输入寄存器接收到写入请求,值为: {value}")# 获取保持寄存器的数据块
holding_registers = store.getValues(3,0,count=1)
# 由于 getValues 返回的是一个列表,我们需要将回调绑定到数据块本身
print("Initial holding register values:", holding_registers)# 启动服务器
StartTcpServer(context=context, identity=identity, address=("localhost", 5020))
server.serve_forever()

运行测试

通过执行代码- 先启动server,后启动client, 监控程序执行的输出窗口确认执行i情况,输出如下表示执行成功并且实现数据的获取。
服务器端的输出:
Modbus server运行结果
客户端的输出:
Modbus Client运行结果


http://www.mrgr.cn/news/46956.html

相关文章:

  • python 3个线程轮流打印A、B、C
  • Unity的Transform类
  • 蓝桥杯_B组_省赛_2022(用作博主自己学习)
  • 探索 C++ 与 LibUSB:开启 USB 设备交互的奇幻之旅
  • Cesium加载地形
  • JAVA之单例模式
  • 【Java异常】面试官问你Java中的异常,这篇就够了
  • 程序员在AI时代扮演着多重角色:不仅是AI技术的创造者,也是使用者,更是AIGC的贡献者
  • 快速生成单元测试
  • python实现3D立柱图demo
  • HCIA——one
  • 全球商旅新航标,中企出海就选用友BIP超级版
  • 想提升发明专利审查速度有哪些快捷方法?
  • 算法笔记(十五)——BFS 解决拓扑排序
  • 全流程TOUGH系列软件实践技术应用
  • 19.Mybatis映射文件mapper.xml之结果字段重命名、根据日期范围筛选、多表连接查询动态排序
  • HivisionIDPhotos:一键生成完美证件照的AI神器【AIStarter:AI证件照、AI绘画、AI办公...】
  • 安装虚拟机
  • 27Kstar项目:无GPU也能轻松构建本地智能知识库
  • 【Java_EE】Day05 MyBatis注解开发
  • Python | Leetcode Python题解之第467题环绕字符串中唯一的子字符串
  • Dockerfile搭建环境案例
  • npm install报错一堆sass gyp ERR!
  • 解决html2canvas图片模糊不清,超出一页长截图问题
  • python爬虫 - 数据提取
  • 【无人水面艇路径跟随控制10】(Matlab)USV代码阅读:testUSV仿真无人水面艇在一定时间内的运动,使用欧拉法对状态进行积分,并绘制仿真结果