用python与汇川H3U PLC建立连接以及读写寄存器 Python与PLC踩坑实录 modbus tcp

使用python将计算机与汇川H3U plc建立通信,使用子代的modbus tcp协议进行连接;

准备工作:需要install:modbus_tk,即

pip install modbus_tk

直接上代码吧,封装好的功能,可以直接使用:

import time
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcp


def connect_plc(host):
    master = modbus_tcp.TcpMaster(host=host)
    master.set_timeout(5.0)
    return master

# 读取plc某一位寄存器的值
def read_plc(master, address):
    try:
        data = master.execute(1, cst.READ_HOLDING_REGISTERS, address, 1)
        return data[0]
    except Exception as e:
        time.sleep(0.003)
        read_plc(master, address)

#往plc某一位寄存器中写值
def write_plc(master, address, value):
    try:
        master.execute(1, cst.WRITE_SINGLE_REGISTER, address, output_value=value)
    except Exception as e:
        time.sleep(0.003)
        write_plc(master, address, value)

Over!

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个使用线程池连接多个 Modbus TCP 设备并实现读写Python 代码示例: ```python import threading import queue import time from pymodbus.client.sync import ModbusTcpClient # 定义 Modbus TCP 设备的 IP 地址和端口 devices = [ {'ip': '192.168.1.100', 'port': 502}, {'ip': '192.168.1.101', 'port': 502}, {'ip': '192.168.1.102', 'port': 502}, # 可以添加更多的设备信息 ] # 定义 Modbus TCP 寄存器地址和数量 register_address = 0 # 寄存器地址 register_count = 10 # 寄存器数量 # 定义线程池大小和任务队列 max_workers = 5 # 线程池大小 task_queue = queue.Queue() # 任务队列 # 定义读写函数 def read_write_registers(ip, port): try: client = ModbusTcpClient(ip, port) client.connect() # 读取寄存器 result = client.read_holding_registers(register_address, register_count) if result.isError(): print(f"读取寄存器失败:{result}") else: print(f"读取寄存器成功:{result.registers}") # 写入寄存器 result = client.write_register(register_address, 1234) if result.isError(): print(f"写入寄存器失败:{result}") else: print("写入寄存器成功") client.close() except Exception as e: print(f"连接设备 {ip}:{port} 失败:{e}") # 往任务队列中添加任务 for device in devices: task_queue.put(device) # 创建线程池并提交任务 with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: while not task_queue.empty(): device = task_queue.get() ip = device['ip'] port = device['port'] executor.submit(read_write_registers, ip, port) time.sleep(0.1) # 为了避免过多的连接,可以加入适当的延时 # 等待所有任务完成 executor.shutdown(wait=True) ``` 这个代码使用了 Python 内置的 `concurrent.futures` 模块来创建线程池,并往任务队列中添加任务。对于每个任务,它会连接对应的 Modbus TCP 设备,并读写寄存器。在读写寄存器时,它使用了 `pymodbus` 库提供的函数来实现。 在实际使用时,你需要根据自己的实际情况来修改代码中的设备信息、寄存器地址和数量,以及线程池大小等参数。同时,你也需要确保你的 Modbus TCP 设备正常工作,并且网络连接稳定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值