79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
import threading
|
|
from threading import Thread
|
|
import time
|
|
import menu_utils as utils
|
|
from comm_device import class_comm_device
|
|
from print_color import *
|
|
|
|
class class_comm_master_thread(Thread):
|
|
thread_object_id = 0
|
|
CHECK_INTERVAL = 0.05 # 检查间隔(秒)
|
|
MAX_FAIL_TIME = 5 # 最大失败时间(秒)
|
|
|
|
def __init__(self,
|
|
device_comm_object_list=None,
|
|
thread_name="device"):
|
|
super().__init__()
|
|
self.stop_request = False
|
|
self.device_comm_object_list = device_comm_object_list if device_comm_object_list is not None else []
|
|
|
|
if thread_name is None:
|
|
thread_name = "device" + str(class_comm_master_thread.thread_object_id)
|
|
class_comm_master_thread.thread_object_id += 1
|
|
|
|
self.thread_name = thread_name
|
|
|
|
def close(self):
|
|
self.stop_request = True
|
|
|
|
def run(self):
|
|
print_inform_msg(f"{self.thread_name} modbus 主线程启动")
|
|
|
|
total_fail_time = 0
|
|
base_time = time.time()
|
|
|
|
while not self.stop_request:
|
|
comm_success_count = 0
|
|
total_comm_count = 0
|
|
|
|
for device in self.device_comm_object_list:
|
|
try:
|
|
if device.comm_active:
|
|
success_count, comm_count = device.device_comm_cycle()
|
|
comm_success_count += success_count
|
|
total_comm_count += comm_count
|
|
except Exception as err:
|
|
print_error_msg(err)
|
|
|
|
cur_time = time.time()
|
|
|
|
if comm_success_count > 0:
|
|
total_fail_time = 0
|
|
elif total_comm_count > 0:
|
|
total_fail_time += cur_time - base_time
|
|
base_time = cur_time
|
|
|
|
if total_fail_time >= self.MAX_FAIL_TIME:
|
|
self.reconnect_devices()
|
|
total_fail_time = 0
|
|
|
|
time.sleep(self.CHECK_INTERVAL)
|
|
|
|
print_error_msg(f"{self.thread_name} modbus 主线程停止")
|
|
|
|
def reconnect_devices(self):
|
|
"""重新连接所有设备的协议"""
|
|
for device in self.device_comm_object_list:
|
|
try:
|
|
device.protocol.close()
|
|
except Exception as err:
|
|
print_error_msg(f"关闭协议时出错: {err}")
|
|
|
|
for device in self.device_comm_object_list:
|
|
try:
|
|
device.protocol.open(device.protocol.mode)
|
|
except Exception as err:
|
|
print_error_msg(f"重新打开协议时出错: {err}")
|
|
|
|
print_warning_msg("与保护器连接超时, 重新进行连接")
|