基于之前的半导体贴片机上位机框架和视觉系统优化,本篇将继续扩展框架,专注于视觉算法的进一步优化、任务调度与视觉系统的深度整合、并发性能提升、以及更完善的测试用例和扩展性支持。
代码基于 C#、.NET Core 8.0 和 WinForms,使用 OpenCvSharp 进行图像处理,延续模块化设计,充分运用并发工具(如 ConcurrentQueue、Parallel)、异步编程(async/await)、多线程同步(SemaphoreSlim)和死锁预防策略。
以下内容分为多部分,详细输出完整的代码实现、测试用例和配置说明。
篇一:框架扩展目标与设计更新扩展目标
- 视觉与任务调度整合:将视觉系统识别结果(如元件位置、角度)直接用于任务调度,优化贴装精度和效率。
- 并发性能优化:通过 Parallel 和 Task 优化多任务并行处理,提升视觉处理与任务执行的吞吐量。
- 鲁棒性增强:增加视觉系统异常重试机制和动态调整策略,适应复杂生产场景。
- 可扩展性:支持多视觉算法并行运行、动态切换摄像头和任务优先级管理。
- 死锁预防:进一步强化锁排序、超时机制和异步优先策略,确保系统稳定性。
- 测试覆盖:提供更全面的单元测试和集成测试,验证视觉与任务调度的协作。
设计更新
- 任务调度与视觉联动:
- 视觉系统输出位置校正数据,实时更新 TaskInfo 的贴装坐标。
- 使用 ConcurrentDictionary 存储任务状态,支持多任务并发。
- 并发优化:
- 引入 Task.Factory 动态分配任务线程,优化 CPU 使用。
- 使用 BlockingCollection 替代 ConcurrentQueue,支持更灵活的任务队列管理。
- 模块扩展:
- 添加 IVisionAlgorithmFactory 工厂接口,动态创建视觉算法实例。
- 支持多摄像头并行处理,适配复杂贴片机场景。
- 配置升级:
- 支持动态加载多算法配置和摄像头参数。
- 增加任务优先级和调度策略配置。
项目结构更新
SMTUpperComputer/
├── SMTUpperComputer.Core/
│ ├── Models/
│ │ ├── VisionData.cs # 视觉数据模型
│ │ └── TaskInfo.cs # 任务模型(更新支持校正数据)
│ ├── Services/
│ │ ├── VisionProcessingService.cs # 视觉处理服务(支持多算法)
│ │ ├── TaskSchedulerService.cs # 任务调度服务(与视觉联动)
│ │ ├── Algorithms/
│ │ │ ├── TemplateMatchingAlgorithm.cs # 模板匹配
│ │ │ ├── SiftAlgorithm.cs # SIFT 算法
│ │ │ └── VisionAlgorithmFactory.cs # 算法工厂
│ ├── Interfaces/
│ │ ├── IVisionProcessingService.cs # 视觉服务接口
│ │ ├── ITaskScheduler.cs # 任务调度接口
│ │ └── IVisionAlgorithmFactory.cs # 算法工厂接口
│ ├── Utilities/
│ │ ├── VisionUtils.cs # 视觉工具
│ │ └── TaskUtils.cs # 任务工具
├── SMTUpperComputer.UI/
│ ├── Forms/
│ │ ├── MainForm.cs # 主窗体(添加任务监控)
│ │ └── VisionForm.cs # 视觉窗体
├── SMTUpperComputer.Tests/
│ ├── UnitTests/
│ │ ├── VisionAlgorithmTests.cs # 算法测试
│ │ └── TaskSchedulerTests.cs # 调度测试
│ ├── IntegrationTests/
│ │ └── VisionTaskIntegrationTests.cs # 视觉与调度集成测试
├── SMTUpperComputer.Config/
│ └── appsettings.json # 更新配置
篇二:配置文件更新appsettings.json支持多算法、多摄像头和任务调度配置:json
{
"Communication": {
"IpAddress": "127.0.0.1",
"Port": 8080,
"TimeoutSeconds": 5
},
"Machine": {
"MaxSpeed": 1000,
"MaxComponents": 10000
},
"Vision": {
"Cameras": [
{
"Index": 0,
"Resolution": { "Width": 1280, "Height": 720 },
"ROIRect": { "X": 100, "Y": 100, "Width": 1080, "Height": 520 },
"FrameRate": 30
},
{
"Index": 1,
"Resolution": { "Width": 1920, "Height": 1080 },
"ROIRect": { "X": 200, "Y": 200, "Width": 1520, "Height": 680 },
"FrameRate": 60
}
],
"Algorithms": [
{
"Name": "TemplateMatching",
"TemplatePath": "templates/element1.png",
"Threshold": 0.9
},
{
"Name": "SIFT",
"TemplatePath": "templates/element2.png",
"FeatureCount": 500,
"MatchThreshold": 0.8
}
],
"ActiveAlgorithm": "TemplateMatching"
},
"TaskScheduler": {
"MaxConcurrentTasks": 4,
"RetryCount": 3,
"PriorityLevels": [
{ "Level": 1, "DelayMs": 100 },
{ "Level": 2, "DelayMs": 200 }
]
}
}
篇三:核心代码实现以下是更新后的核心模块代码,包含视觉与任务调度的整合、并发优化和算法工厂。
1. 数据模型更新(SMTUpperComputer.Core/Models)
TaskInfo.cs更新支持视觉校正数据:csharp
namespace SMTUpperComputer.Core.Models
{
public class TaskInfo
{
public string TaskId { get; set; } // 任务ID
public string PCBType { get; set; } // PCB类型
public List<ComponentPosition> Positions { get; set; } // 初始贴装坐标
public List<ComponentPosition> CorrectedPositions { get; set; } // 视觉校正后的坐标
public int Priority { get; set; } // 任务优先级
public bool IsCompleted { get; set; } // 任务完成状态
}
public class ComponentPosition
{
public double X { get; set; }
public double Y { get; set; }
public double Angle { get; set; }
public string ComponentType { get; set; }
}
}
2. 算法工厂(SMTUpperComputer.Core/Services/Algorithms)
IVisionAlgorithmFactory.cscsharp
using SMTUpperComputer.Core.Interfaces;
namespace SMTUpperComputer.Core.Services.Algorithms
{
public interface IVisionAlgorithmFactory
{
IVisionAlgorithm CreateAlgorithm(string algorithmName);
}
}
VisionAlgorithmFactory.cscsharp
using Microsoft.Extensions.Configuration;
using SMTUpperComputer.Core.Interfaces;
using SMTUpperComputer.Core.Utilities;
namespace SMTUpperComputer.Core.Services.Algorithms
{
public class VisionAlgorithmFactory : IVisionAlgorithmFactory
{
private readonly IConfiguration _configuration;
private readonly ILogger _logger;
public VisionAlgorithmFactory(IConfiguration configuration, ILogger logger)
{
_configuration = configuration;
_logger = logger;
}
public IVisionAlgorithm CreateAlgorithm(string algorithmName)
{
int configIndex = algorithmName == "TemplateMatching" ? 0 : 1;
switch (algorithmName)
{
case "TemplateMatching":
var templateAlgo = new TemplateMatchingAlgorithm(_logger);
templateAlgo.Initialize(_configuration, configIndex.ToString());
return templateAlgo;
case "SIFT":
var siftAlgo = new SiftAlgorithm(_logger);
siftAlgo.Initialize(_configuration, configIndex.ToString());
return siftAlgo;
default:
throw new InvalidOperationException($"Unsupported algorithm: {algorithmName}");
}
}
}
}
3. 更新视觉处理服务(SMTUpperComputer.Core/Services)VisionProcessingService.cs支持多摄像头和动态算法:csharp
using OpenCvSharp;
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using SMTUpperComputer.Core.Interfaces;
using SMTUpperComputer.Core.Models;
using SMTUpperComputer.Core.Utilities;
using System.Collections.Generic;
namespace SMTUpperComputer.Core.Services
{
public class VisionProcessingService : IVisionProcessingService
{
private readonly IConfiguration _configuration;
private readonly ILogger _logger;
private readonly IVisionAlgorithmFactory _algorithmFactory;
private readonly ConcurrentDictionary<int, VideoCapture> _captures = new ConcurrentDictionary<int, VideoCapture>();
private readonly ConcurrentQueue<(int CameraIndex, byte[] ImageData)> _imageQueue = new ConcurrentQueue<(int, byte[])>();
private readonly CancellationTokenSource _cts = new CancellationTokenSource();
private readonly SemaphoreSlim _proce


433

被折叠的 条评论
为什么被折叠?



