写不NG流程:添加传送带运行、步进电机移动、线条个数方便后续夹爪的抓取、气动夹爪控制流程
This commit is contained in:
185
main_control.py
185
main_control.py
@ -1,19 +1,19 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
"""
|
||||
# @Time : 2025/12/12 11:05
|
||||
# @Author : reenrr
|
||||
# @File : main_control.py
|
||||
# @Desc : 主控程序
|
||||
'''
|
||||
import multiprocessing # 多进程模块
|
||||
import threading
|
||||
from threading import Event
|
||||
"""
|
||||
import time
|
||||
from EMV.EMV_test import press_sensors_triggered, control_solenoid, global_relay
|
||||
from visual_algorithm.visual_algorithm import flaw_detection
|
||||
import logging
|
||||
import os
|
||||
from conveyor_controller.conveyor_master_controller2_test import conveyor_control
|
||||
from client import IndustrialPCClient
|
||||
from DM.DM_Motor_test import DMMotorController, Control_Type, dm_motor_control
|
||||
|
||||
# ------------ 日志+参数配置 ------------
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
@ -29,59 +29,178 @@ logging.basicConfig(
|
||||
]
|
||||
)
|
||||
|
||||
# ------------全局事件-------------
|
||||
manger = multiprocessing.Manager()
|
||||
conveyor_start_event = manger.Event()
|
||||
# -------------------------- 电机参数配置 --------------------------
|
||||
SLAVE_ID = 0x01
|
||||
MASTER_ID = 0x11
|
||||
PORT = 'COM10'
|
||||
BAUDRATE = 921600
|
||||
|
||||
def start_thread():
|
||||
"""开启各种线程"""
|
||||
global_relay.start_press_sensors_monitor() # 双压传感器监听线程
|
||||
class LineMainControlSystem:
|
||||
"""
|
||||
线条主控系统类
|
||||
"""
|
||||
def __init__(self):
|
||||
"""
|
||||
构造方法:初始化类属性
|
||||
"""
|
||||
# 客户端
|
||||
self.client = IndustrialPCClient(ip='127.0.0.1', port=8888, timeout=10)
|
||||
# 连接服务端
|
||||
if not self.client.connect():
|
||||
return
|
||||
|
||||
def stop_thread():
|
||||
"""关闭各种线程"""
|
||||
global_relay.stop_press_sensors_monitor() # 双压传感器监听线程
|
||||
# 合格线条处理记数
|
||||
self.qualified_line_count = 0
|
||||
self.qualified_trigger_threshold = 5
|
||||
|
||||
# 创建达妙电机实例、参数
|
||||
self.motor_controller = DMMotorController(
|
||||
slave_id=SLAVE_ID,
|
||||
master_id=MASTER_ID,
|
||||
port=PORT,
|
||||
baudrate=BAUDRATE
|
||||
)
|
||||
self.dm_motor_init()
|
||||
|
||||
|
||||
def quality_testing():
|
||||
logging.info("线条开始质量检测:")
|
||||
def dm_motor_init(self):
|
||||
# 切换到位置-速度模式
|
||||
self.motor_controller.switch_control_mode(Control_Type.POS_VEL)
|
||||
|
||||
# 执行质量检测
|
||||
result = flaw_detection({"line_id": "L001", "straightness": 0.95, "noise_ratio": 0.08})
|
||||
if result == "qualified":
|
||||
# 使能电机
|
||||
self.motor_controller.enable_motor()
|
||||
|
||||
# 将电机位置恢复到初始位置(防止断电,电机停在某个位置上)
|
||||
dm_motor_position = self.motor_controller.get_position()
|
||||
logging.info(f"初始位置{dm_motor_position}")
|
||||
# 将位置移动到0位
|
||||
self.motor_controller.control_pos_vel(p_desired=0, v_desired=30)
|
||||
time.sleep(10)
|
||||
|
||||
def start_thread(self):
|
||||
"""开启各种线程"""
|
||||
logging.info("开启各类监听线程")
|
||||
global_relay.start_press_sensors_monitor() # 双压传感器监听线程
|
||||
|
||||
def stop_thread(self):
|
||||
"""关闭各种线程"""
|
||||
logging.info("关闭各类监听线程")
|
||||
global_relay.stop_press_sensors_monitor() # 双压传感器监听线程
|
||||
|
||||
def handle_line(self):
|
||||
try:
|
||||
logging.info("线条开始质量检测:")
|
||||
|
||||
# 执行质量检测
|
||||
result = flaw_detection({"line_id": "L001", "straightness": 0.95, "noise_ratio": 0.08})
|
||||
if result == "qualified":
|
||||
self._handle_qualified_line()
|
||||
elif result == "unqualified":
|
||||
self._handle_unqualified_line()
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"质量检测失败:{e}", exc_info=True)
|
||||
|
||||
finally:
|
||||
# 关闭连接服务端
|
||||
if self.client:
|
||||
self.client.close()
|
||||
logging.info("关闭连接服务端")
|
||||
|
||||
def _handle_qualified_line(self):
|
||||
"""
|
||||
处理合格线条的流程
|
||||
"""
|
||||
result = "合格"
|
||||
logging.info("该线条是否合格:", result)
|
||||
logging.info(f"该线条是否合格:{result}")
|
||||
logging.info("等待线条落到传送带(双压传感器触发)...")
|
||||
|
||||
# 等待时间触发,超时时间设为10秒(避免无限等待)
|
||||
if press_sensors_triggered.wait(timeout=10):
|
||||
press_sensors_triggered.clear()
|
||||
|
||||
logging.info("线条已落到传送带,控制两个传送带向前移动")
|
||||
# 触发传送带启动事件
|
||||
conveyor_start_event.set()
|
||||
# 传送带运行
|
||||
conveyor_control()
|
||||
|
||||
# 验证传送带运行结果
|
||||
press_sensor1_status = global_relay.get_device_status('press_sensor1', 'sensors')
|
||||
press_sensor2_status = global_relay.get_device_status('press_sensor2', 'sensors')
|
||||
if not press_sensor1_status and not press_sensor2_status:
|
||||
logging.info("传送带运行正常,线条已移动")
|
||||
|
||||
self.qualified_line_count += 1
|
||||
logging.info(f"已处理合格线条{self.qualified_line_count}/{self.qualified_trigger_threshold}个")
|
||||
|
||||
# 控制步进电机移动
|
||||
logging.info("控制步进电机移动")
|
||||
success, msg = self.client.send_command("test")
|
||||
if not success:
|
||||
logging.error(f"调用失败:{msg}")
|
||||
else:
|
||||
logging.info("步进电机移动成功")
|
||||
|
||||
# 判断线条个数
|
||||
if self.qualified_line_count >= self.qualified_trigger_threshold:
|
||||
# 舵机、电机相关控制
|
||||
self.qualified_line_count = 0
|
||||
else:
|
||||
logging.warning("传送带运行异常,线条未正常移动,不更新合格计数")
|
||||
else:
|
||||
logging.info("超时警告:线条未落到传送带,请检查")
|
||||
elif result == "unqualified":
|
||||
logging.info("线条未落到传送带,请检查传感器或设备状态")
|
||||
|
||||
def _handle_unqualified_line(self):
|
||||
"""
|
||||
处理不合格线条的流程
|
||||
"""
|
||||
result = "不合格"
|
||||
logging.info("该线条是否合格:", result)
|
||||
logging.info("等待线条落到传送带上")
|
||||
|
||||
# 等待时间触发,超时时间设为10秒(避免无限等待)
|
||||
if press_sensors_triggered.wait(timeout=10):
|
||||
press_sensors_triggered.clear()
|
||||
logging.info("线条已落到传送带")
|
||||
|
||||
# 执行NG动作,控制电磁阀
|
||||
logging.info("进入NG动作")
|
||||
control_solenoid() # 执行NG动作,控制电磁阀
|
||||
control_solenoid() # 执行NG动作,控制电磁阀
|
||||
logging.info("NG动作结束")
|
||||
# logging.info("判断NG线条是否落入肥料区:")
|
||||
|
||||
def gripper_control(self):
|
||||
"""
|
||||
气动夹爪相关控制:达妙电机的移动、舵机的翻转
|
||||
"""
|
||||
# 打开电磁阀3
|
||||
global_relay.open('solenoid_valve3', "devices")
|
||||
|
||||
# 控制达妙电机收缩
|
||||
self.motor_controller.control_pos_vel(p_desired=282.6, v_desired=30) # 450mm 665-215
|
||||
time.sleep(10)
|
||||
|
||||
|
||||
|
||||
|
||||
# -----------对外接口-------------
|
||||
def main_control():
|
||||
logging.info("开启各种线程")
|
||||
start_thread()
|
||||
main_control_system = LineMainControlSystem()
|
||||
|
||||
logging.info("开始摆放线条")
|
||||
try:
|
||||
logging.info("开启各种线程")
|
||||
main_control_system.start_thread()
|
||||
|
||||
# 质量检测
|
||||
quality_testing()
|
||||
while True: # 防止跳出循环
|
||||
logging.info("开始摆放线条")
|
||||
|
||||
# 质量检测
|
||||
main_control_system.handle_line()
|
||||
except KeyboardInterrupt:
|
||||
logging.info("用户手动退出")
|
||||
finally:
|
||||
# 程序退出时,关闭各类线程
|
||||
main_control_system.stop_thread()
|
||||
logging.info("主控程序已正常退出")
|
||||
|
||||
while True: # 防止跳出循环
|
||||
time.sleep(1)
|
||||
|
||||
# ------------测试接口-------------
|
||||
if __name__ == '__main__':
|
||||
|
||||
Reference in New Issue
Block a user