写一个项目上使用的python 线程池modbustcp连接多个不同设备读写
时间: 2024-03-22 21:41:04 浏览: 62
python使用多线程编写tcp客户端程序
下面是一个使用Python线程池和ModbusTCP协议连接多个不同设备进行读写的示例代码:
```python
import threading
from queue import Queue
from pymodbus.client.sync import ModbusTcpClient
# 定义设备信息,每个元素表示一个设备的IP地址和端口号
devices = [("192.168.1.101", 502), ("192.168.1.102", 502), ("192.168.1.103", 502)]
# 定义读写任务队列
task_queue = Queue()
# 定义线程池大小
pool_size = 5
# 定义读取寄存器函数
def read_registers(client, device_info, register_address, register_count):
# 在设备上读取寄存器
result = client.read_holding_registers(register_address, register_count)
# 打印读取结果
print(f"设备{device_info}读取寄存器{register_address}~{register_address + register_count - 1}的值为:{result.registers}")
# 定义写入寄存器函数
def write_registers(client, device_info, register_address, register_values):
# 在设备上写入寄存器
result = client.write_registers(register_address, register_values)
# 打印写入结果
print(f"设备{device_info}写入寄存器{register_address}~{register_address + len(register_values) - 1}的值为:{register_values}")
# 定义任务处理函数
def process_task():
# 从任务队列中获取任务
task = task_queue.get()
# 解析任务参数
device_index, function_code, register_address, register_count_or_values = task
# 获取设备信息
device_info = devices[device_index]
# 创建ModbusTCP客户端
client = ModbusTcpClient(device_info[0], device_info[1])
try:
# 连接设备
client.connect()
# 根据功能码调用相应的函数
if function_code == 3:
# 读取寄存器
read_registers(client, device_info, register_address, register_count_or_values)
elif function_code == 16:
# 写入寄存器
write_registers(client, device_info, register_address, register_count_or_values)
except Exception as e:
print(f"设备{device_info}出现异常:{e}")
finally:
# 关闭连接
client.close()
# 标记任务完成
task_queue.task_done()
# 创建线程池
thread_pool = []
for i in range(pool_size):
thread = threading.Thread(target=process_task)
thread.start()
thread_pool.append(thread)
# 添加读取寄存器任务到队列中
for i in range(len(devices)):
for j in range(3):
task_queue.put((i, 3, j*10, 10))
# 添加写入寄存器任务到队列中
for i in range(len(devices)):
for j in range(2):
task_queue.put((i, 16, j*10, [1, 2, 3]))
# 等待所有任务完成
task_queue.join()
# 停止线程池
for thread in thread_pool:
thread.join()
```
在这个示例中,我们首先定义了三个不同设备的IP地址和端口号,并创建了一个读写任务队列。然后,我们定义了一个`process_task()`函数来处理任务队列中的读写任务。每次从队列中获取一个任务后,我们根据任务参数调用相应的函数来读写寄存器,并在控制台上打印读写结果。最后,我们创建一个线程池,将`process_task()`函数作为线程的执行函数,并将任务添加到任务队列中。当所有任务完成后,我们停止线程池并退出程序。
阅读全文