1121
This commit is contained in:
172
core/system.py
172
core/system.py
@ -2,7 +2,6 @@
|
||||
import threading
|
||||
import time
|
||||
import cv2
|
||||
from config.settings import Settings
|
||||
from core.state import SystemState
|
||||
from hardware.relay import RelayController
|
||||
from hardware.inverter import InverterController
|
||||
@ -11,31 +10,32 @@ from hardware.RFID.rfid_service import rfid_service
|
||||
from vision.camera import DualCameraController
|
||||
from vision.detector import VisionDetector
|
||||
from feeding.controller import FeedingController
|
||||
from service.mould_service import app_web_service
|
||||
from config.settings import app_set_config
|
||||
|
||||
|
||||
class FeedingControlSystem:
|
||||
def __init__(self, settings: Settings):
|
||||
self.settings = settings
|
||||
def __init__(self):
|
||||
self.state = SystemState()
|
||||
|
||||
# 初始化硬件控制器
|
||||
self.relay_controller = RelayController(
|
||||
host=settings.relay_host,
|
||||
port=settings.relay_port
|
||||
host=app_set_config.relay_host,
|
||||
port=app_set_config.relay_port
|
||||
)
|
||||
|
||||
self.inverter_controller = InverterController(self.relay_controller)
|
||||
self.transmitter_controller = TransmitterController(self.relay_controller)
|
||||
|
||||
# 初始化视觉系统
|
||||
self.camera_controller = DualCameraController(settings.camera_configs)
|
||||
self.camera_controller = DualCameraController(app_set_config.camera_configs)
|
||||
|
||||
self.vision_detector = VisionDetector(settings)
|
||||
self.vision_detector = VisionDetector()
|
||||
|
||||
# 初始化RFID控制器
|
||||
self.rfid_controller = rfid_service(
|
||||
host=settings.rfid_host,
|
||||
port=settings.rfid_port
|
||||
host=app_set_config.rfid_host,
|
||||
port=app_set_config.rfid_port
|
||||
)
|
||||
# 初始化下料控制器
|
||||
self.feeding_controller = FeedingController(
|
||||
@ -45,8 +45,7 @@ class FeedingControlSystem:
|
||||
self.vision_detector,
|
||||
self.camera_controller,
|
||||
self.rfid_controller,
|
||||
self.state,
|
||||
settings
|
||||
self.state
|
||||
)
|
||||
|
||||
|
||||
@ -56,6 +55,7 @@ class FeedingControlSystem:
|
||||
self.visual_control_thread = None
|
||||
self.alignment_check_thread = None
|
||||
self.lower_feeding_thread = None
|
||||
self.led_thread = None
|
||||
|
||||
def initialize(self):
|
||||
"""初始化系统"""
|
||||
@ -63,12 +63,12 @@ class FeedingControlSystem:
|
||||
|
||||
# 设置摄像头配置
|
||||
# self.camera_controller.set_config(
|
||||
# camera_type=self.settings.camera_type,
|
||||
# ip=self.settings.camera_ip,
|
||||
# port=self.settings.camera_port,
|
||||
# username=self.settings.camera_username,
|
||||
# password=self.settings.camera_password,
|
||||
# channel=self.settings.camera_channel
|
||||
# camera_type=app_set_config.camera_type,
|
||||
# ip=app_set_config.camera_ip,
|
||||
# port=app_set_config.camera_port,
|
||||
# username=app_set_config.camera_username,
|
||||
# password=app_set_config.camera_password,
|
||||
# channel=app_set_config.camera_channel
|
||||
# )
|
||||
|
||||
# # 初始化摄像头
|
||||
@ -78,30 +78,33 @@ class FeedingControlSystem:
|
||||
# 加载视觉模型
|
||||
# if not self.vision_detector.load_models():
|
||||
# raise Exception("视觉模型加载失败")
|
||||
if not self.settings.debug_feeding:
|
||||
if not self.check_device_connectivity():
|
||||
raise Exception("设备连接失败")
|
||||
self.camera_controller.start_cameras()
|
||||
|
||||
self.check_device_connectivity()
|
||||
|
||||
# self.camera_controller.start_cameras()
|
||||
# if not app_set_config.debug_feeding:
|
||||
# 启动系统监控(要料,破拱)线程
|
||||
self.start_monitoring()
|
||||
self.start_monitoring()
|
||||
# 启动视觉控制(角度、溢出)线程
|
||||
# self.start_visual_control()
|
||||
|
||||
# 启动视觉控制(角度、溢出)线程
|
||||
self.start_visual_control()
|
||||
|
||||
# 启动对齐检查线程
|
||||
self.start_alignment_check()
|
||||
# 启动对齐检查线程
|
||||
# self.start_alignment_check()
|
||||
|
||||
# 启动下料线程
|
||||
self.start_lower_feeding()
|
||||
#LED屏
|
||||
# self.start_led()
|
||||
|
||||
print("控制系统初始化完成")
|
||||
|
||||
def start_monitoring(self):
|
||||
"""启动系统监控"""
|
||||
self.state.running = True
|
||||
print('振动和要料监控线程启动')
|
||||
self.monitor_thread = threading.Thread(
|
||||
target=self._monitor_loop,
|
||||
daemon=True
|
||||
daemon=True,
|
||||
name='monitor'
|
||||
)
|
||||
self.monitor_thread.start()
|
||||
|
||||
@ -109,7 +112,7 @@ class FeedingControlSystem:
|
||||
"""监控循环"""
|
||||
while self.state.running:
|
||||
try:
|
||||
self.feeding_controller.check_upper_material_request()
|
||||
# self.feeding_controller.check_upper_material_request()
|
||||
self.feeding_controller.check_arch_blocking()
|
||||
time.sleep(1)
|
||||
except Exception as e:
|
||||
@ -117,9 +120,11 @@ class FeedingControlSystem:
|
||||
|
||||
def start_visual_control(self):
|
||||
"""启动视觉控制"""
|
||||
print('视觉控制线程启动')
|
||||
self.visual_control_thread = threading.Thread(
|
||||
target=self._visual_control_loop,
|
||||
daemon=True
|
||||
daemon=True,
|
||||
name='visual_control'
|
||||
)
|
||||
self.visual_control_thread.start()
|
||||
|
||||
@ -132,37 +137,79 @@ class FeedingControlSystem:
|
||||
if current_frame is not None:
|
||||
# 执行视觉控制逻辑
|
||||
self.feeding_controller.visual_control(current_frame)
|
||||
time.sleep(self.settings.visual_check_interval)
|
||||
time.sleep(app_set_config.visual_check_interval)
|
||||
except Exception as e:
|
||||
print(f"视觉控制循环错误: {e}")
|
||||
time.sleep(self.settings.visual_check_interval)
|
||||
time.sleep(app_set_config.visual_check_interval)
|
||||
|
||||
def start_alignment_check(self):
|
||||
"""启动对齐检查"""
|
||||
print('对齐检查线程启动')
|
||||
self.alignment_check_thread = threading.Thread(
|
||||
target=self._alignment_check_loop,
|
||||
daemon=True
|
||||
daemon=True,
|
||||
name='align_check'
|
||||
)
|
||||
self.alignment_check_thread.start()
|
||||
|
||||
def _alignment_check_loop(self):
|
||||
"""对齐检查循环"""
|
||||
loc_align_status=False
|
||||
loc_before_status=None
|
||||
while self.state.running:
|
||||
try:
|
||||
if self.state._lower_feeding_stage == 4: # 等待对齐阶段
|
||||
if self.state.lower_feeding_stage == 4: # 等待对齐阶段
|
||||
current_frame = self.camera_controller.get_single_latest_frame()
|
||||
if current_frame is not None:
|
||||
self.state.vehicle_aligned = self.vision_detector.detect_vehicle_alignment(current_frame)
|
||||
self.state.vehicle_aligned = self.alignment_check_status()
|
||||
if self.state.vehicle_aligned:
|
||||
# loc_count+=1
|
||||
print("检测到模具车对齐")
|
||||
else:
|
||||
print("模具车未对齐")
|
||||
else:
|
||||
print('未检测到图像')
|
||||
time.sleep(self.settings.alignment_check_interval)
|
||||
# time.sleep(app_set_config.alignment_check_interval)
|
||||
# loc_align_status=self.alignment_check_status()
|
||||
# if loc_align_status and not loc_before_status:
|
||||
# print("模具车由未对齐到对齐")
|
||||
# self.state.vehicle_aligned=True
|
||||
# elif not loc_align_status and loc_before_status:
|
||||
# print("模具车由对齐到未对齐")
|
||||
# self.state.vehicle_aligned=False
|
||||
|
||||
# if loc_before_status!=loc_align_status:
|
||||
# loc_before_status=loc_align_status
|
||||
|
||||
except Exception as e:
|
||||
print(f"对齐检查循环错误: {e}")
|
||||
time.sleep(self.settings.alignment_check_interval)
|
||||
finally:
|
||||
time.sleep(app_set_config.alignment_check_interval)
|
||||
|
||||
|
||||
def alignment_check_status(self)->bool:
|
||||
"""对齐检查循环"""
|
||||
loc_aligned=False
|
||||
loc_count=0
|
||||
for i in range(4):
|
||||
try:
|
||||
current_frame = self.camera_controller.get_single_latest_frame()
|
||||
if current_frame is not None:
|
||||
loc_aligned = self.vision_detector.detect_vehicle_alignment(current_frame)
|
||||
if loc_aligned:
|
||||
loc_count+=1
|
||||
print("检测到模具车对齐")
|
||||
else:
|
||||
loc_count=0
|
||||
print("模具车未对齐")
|
||||
time.sleep(app_set_config.alignment_check_interval)
|
||||
except Exception as e:
|
||||
print(f"对齐检查循环错误: {e}")
|
||||
time.sleep(app_set_config.alignment_check_interval)
|
||||
|
||||
if loc_count>=3:
|
||||
loc_aligned=True
|
||||
else:
|
||||
loc_aligned=False
|
||||
return loc_aligned
|
||||
|
||||
def start_lower_feeding(self):
|
||||
"""启动下料流程"""
|
||||
@ -177,7 +224,34 @@ class FeedingControlSystem:
|
||||
"""启动下料流程"""
|
||||
while self.state.running:
|
||||
self.feeding_controller.start_feeding()
|
||||
time.sleep(self.settings.lower_feeding_interval)
|
||||
time.sleep(app_set_config.lower_feeding_interval)
|
||||
|
||||
|
||||
|
||||
def start_led(self):
|
||||
"""启动LED流程"""
|
||||
self.led_thread = threading.Thread(
|
||||
target=self._start_led,
|
||||
name="LED",
|
||||
daemon=True
|
||||
)
|
||||
self.led_thread.start()
|
||||
|
||||
def _start_led(self):
|
||||
"""启动LED流程"""
|
||||
while self.state.running:
|
||||
led_info = app_web_service.get_pouring_led()
|
||||
if led_info and self.state.current_artifact:
|
||||
if self.state.current_artifact.MouldCode==led_info.MouldCode:
|
||||
|
||||
led_info.RingTypeCode=self.state.current_artifact.RingTypeCode
|
||||
led_info.UpperWeight=self.state._upper_weight
|
||||
led_info.LowerWeight=self.state._lower_weight
|
||||
led_info.VibrationFrequency=self.state._mould_frequency
|
||||
|
||||
#发送到LED屏
|
||||
|
||||
time.sleep(app_set_config.led_interval)
|
||||
|
||||
def check_device_connectivity(self) -> bool:
|
||||
"""检查关键设备连接状态"""
|
||||
@ -194,15 +268,15 @@ class FeedingControlSystem:
|
||||
return False
|
||||
|
||||
# 尝试读取变频器一个寄存器(测试连接)
|
||||
test_result = self.relay_controller.modbus_client.read_holding_registers(
|
||||
address=0x00,
|
||||
count=1,
|
||||
slave=self.inverter_controller.config['slave_id']
|
||||
)
|
||||
# test_result = self.relay_controller.modbus_client.read_holding_registers(
|
||||
# address=0x00,
|
||||
# count=1,
|
||||
# slave=self.inverter_controller.config['slave_id']
|
||||
# )
|
||||
|
||||
if isinstance(test_result, Exception):
|
||||
print("变频器连接测试失败")
|
||||
return False
|
||||
# if isinstance(test_result, Exception):
|
||||
# print("变频器连接测试失败")
|
||||
# return False
|
||||
|
||||
# 检查下料斗变送器连接
|
||||
test_weight = self.transmitter_controller.read_data(2)
|
||||
|
||||
Reference in New Issue
Block a user