# allworkstationtest **Repository Path**: myc_company/allworkstationtest ## Basic Information - **Project Name**: allworkstationtest - **Description**: 五个相机同时监听,哪块状态变了就执行相应的动作。它提供缺陷切割和补丁切割的位置,写成一个配置文件 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-21 - **Last Updated**: 2026-03-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 五相机监听系统 - 木材加工自动化流水线 这是一个完整的五相机监听和控制系统,用于木材加工自动化流水线。系统会同时监听五个相机对应的PLC触发信号,一旦收到触发信号,就会执行相应的检测任务并将结果推送给PLC。 ## 系统架构 ### 五个工作台 1. **上料台** - 物料分类检测 2. **板材切割台** - 缺陷检测(推送固定切割坐标) 3. **补丁切割台** - 读取配置文件切割位置 4. **补丁修补台(贴胶带相机)** - 检测最大缺陷位置 5. **补丁暂存台** - 检测最大补片位置 ### 核心模块 - `plc_client.py` - PLC通讯模块(Modbus TCP) - `camera_manager.py` - 工业相机管理模块 - `camera.py` - 相机坐标转换模块 - `detection_processor.py` - 检测处理模块 - `main_controller.py` - 主控制脚本 - `workstation_config.json` - 工作台配置文件 - `cutting_positions.json` - 固定切割位置配置文件 ## 功能特性 ### 1. 多线程监听 - 每个工作台独立线程监听对应的PLC触发信号 - 并发处理多个相机的触发请求 - 自动识别完成后复位触发信号 ### 2. 自动检测和坐标转换 - 使用YOLO模型进行缺陷/补片检测 - 自动将图像坐标转换为世界坐标(机械臂坐标系) - 支持分割模型和OBB模型 ### 3. 结果保存和回溯 - 每次检测自动保存: - 原始图像 - 标注图像(显示检测结果) - JSON数据(包含所有检测信息和坐标) - 自增编号,方便查看历史记录 - 所有结果保存在 `detection_results/工作台名称/` 目录下 ### 4. PLC通讯 - 基于Modbus TCP协议 - 支持读写字节、双精度浮点数 - 自动处理MB地址到MW地址的转换 - 支持Mock模式(测试用) ## 快速开始 ### 1. 安装依赖 ```bash pip install ultralytics opencv-python numpy pillow PyQt5 ``` ### 2. 配置系统 #### 编辑 `workstation_config.json` ```json { "plc_settings": { "host": "192.168.1.10", // PLC的IP地址 "port": 502, // Modbus TCP端口 "use_mock": false // 是否使用模拟PLC(测试用) }, "workstations": { "上料台": { "camera_sn": "KE0200120001", // 相机序列号 "trigger_address": 400, // 触发信号地址 "complete_address": 410, // 完成信号地址 ... }, ... } } ``` #### 编辑 `cutting_positions.json`(板材切割台固定切割位置) ```json { "positions": [ { "id": 1, "name": "固定切割位置1", "x": 100.0, // 修改这些值来调整切割位置 "y": 100.0, "length": 50.0, "width": 50.0, "enabled": true }, ... ] } ``` ### 3. 运行系统 #### 方式一:带GUI界面运行(推荐) ```bash python gui_viewer.py ``` GUI界面功能: - **实时监控** - 显示五个工作台的运行状态(等待中/检测中/完成/错误) - **结果展示** - 自动显示最新检测结果(工作台名称、标注图像、检测信息、坐标数据) - **历史查看** - 支持前后翻页查看历史记录,可回到最新 - **自增编号** - 每次检测自动编号,方便追溯 - **一键控制** - 启动/停止系统只需点击按钮 #### 方式二:命令行运行 ```bash python main_controller.py ``` 系统将: 1. 连接到PLC 2. 启动五个工作台的监听线程 3. 等待PLC触发信号 4. 自动执行检测任务并推送结果 ### 4. 停止系统 - GUI模式:点击"停止系统"按钮或关闭窗口 - 命令行模式:按 `Ctrl+C` ## 工作流程详解 ### 上料台 1. 收到触发信号(MB400 = 1) 2. 拍照 3. YOLO检测板材缺陷 4. 根据检测结果判断物料类型: - 1 = 精补木板 - 2 = 粗补木板 - 3 = 完好木板 - 4 = 无修补价值 5. 推送物料分类到 MB420 6. 推送完成信号到 MB410 = 10 7. 复位触发信号 MB400 = 0 ### 板材切割台 1. 收到触发信号(MB402 = 1) 2. 拍照 3. YOLO检测缺陷 4. 将分割结果转换为最小外接矩形(OBB) 5. **显示实际检测结果** 6. **推送固定切割坐标**(从cutting_positions.json读取)到PLC - 缺陷1: MB11016(X), MB11072(Y), MB11112(长), MB11152(宽) - 缺陷2-5: 类似地址 7. 推送完成信号到 MB412 = 10 8. 复位触发信号 MB402 = 0 ### 补丁切割台 1. 收到触发信号(MB404 = 1) 2. 拍照 3. 读取cutting_positions.json中的固定切割位置 4. 推送切割坐标到PLC - 补丁1: MB12016(X), MB12072(Y), MB12112(长), MB12152(宽) - 补丁2-5: 类似地址 5. 推送完成信号到 MB414 = 10 6. 复位触发信号 MB404 = 0 ### 补丁修补台(贴胶带相机) 1. 收到触发信号(MB408 = 1) 2. 拍照 3. YOLO检测缺陷 4. 将分割结果转换为最小外接矩形 5. **找到面积最大的缺陷** 6. 转换为世界坐标并推送到PLC - MB14024(X), MB14080(Y), MB14136(Z), MB14192(R) 7. 推送完成信号到 MB418 = 10 8. 复位触发信号 MB408 = 0 ### 补丁暂存台(抓取补片相机) 1. 收到触发信号(MB406 = 1) 2. 拍照 3. YOLO检测补片(OBB模型) 4. **找到面积最大的补片** 5. 转换为世界坐标并推送到PLC - MB14016(X), MB14072(Y), MB14128(Z), MB14184(R) 6. 推送完成信号到 MB416 = 10 7. 复位触发信号 MB406 = 0 ## 检测结果保存格式 每次检测的结果保存在:`detection_results/工作台名称/检测ID_时间戳/` 包含: - `raw_image.jpg` - 原始图像 - `annotated_image.jpg` - 标注图像(带检测框) - `result.json` - 检测数据 result.json 格式示例: ```json { "workstation_name": "上料台", "detection_id": 1, "timestamp": "2025-12-22 00:00:00.000000", "success": true, "error_message": null, "detections": [ { "instance_id": 1, "class_id": 0, "class_name": "defect", "confidence": 0.95, "contour": [[x1, y1], [x2, y2], ...] } ], "coordinates": [ { "x": 100.0, "y": 200.0, "note": "世界坐标" } ] } ``` ## 测试模式 如果PLC不可用,可以使用Mock模式测试: 1. 修改 `workstation_config.json`: ```json { "plc_settings": { "use_mock": true } } ``` 2. 在代码中手动触发信号: ```python from plc_client import MockPLCClient plc = MockPLCClient() plc.connect() plc.set_trigger(400) # 触发上料台 ``` ## PLC地址映射表 ### 触发信号 - 上料台: MB400 - 板材切割台: MB402 - 补丁切割台: MB404 - 补丁暂存台: MB406 - 补丁修补台: MB408 ### 完成信号 - 上料台: MB410 - 板材切割台: MB412 - 补丁切割台: MB414 - 补丁暂存台: MB416 - 补丁修补台: MB418 ### 数据地址 详见 `木材加工自动化流水线PLC通讯协议完整整合文档.md` ## 注意事项 1. **相机序列号** - 请在配置文件中正确设置每个工作台的相机序列号 2. **内外参文件** - 确保每个工作台的相机内外参文件存在并正确 3. **模型文件** - 确保YOLO模型文件路径正确 4. **PLC连接** - 确保PLC的IP地址和端口正确 5. **固定切割位置** - 可以手动修改`cutting_positions.json`调整切割位置 6. **GPU加速** - 系统默认使用CUDA加速,如需使用CPU请修改代码中的`device='cuda'` ## 故障排查 ### PLC连接失败 - 检查PLC的IP地址和端口 - 检查网络连接 - 尝试使用Mock模式测试 ### 相机打开失败 - 检查相机序列号是否正确 - 检查相机是否已被其他程序占用 - 检查相机驱动是否正确安装 ### 检测结果不准确 - 检查YOLO模型是否正确 - 检查置信度阈值设置 - 检查相机内外参是否正确 ### 坐标转换异常 - 检查相机外参是否正确标定 - 检查是否在Z=0平面上 ## 开发和扩展 ### 添加新的工作台 1. 在`detection_processor.py`中创建新的Processor类 2. 在`main_controller.py`中创建新的Controller类 3. 在`workstation_config.json`中添加配置 4. 在`main_controller.py`的`_initialize_workstations()`中初始化 ### 修改检测逻辑 编辑`detection_processor.py`中对应的Processor类的`process()`方法 ### 修改PLC通讯逻辑 编辑`main_controller.py`中对应的Controller类的`_execute_task()`方法 ## 许可证 内部项目,仅供公司内部使用。 ## 联系方式 如有问题,请联系开发团队。