# SmartVisionMES **Repository Path**: hopefully-2023/SmartVisionMES ## Basic Information - **Project Name**: SmartVisionMES - **Description**: 基于 .NET 8 的工业视觉检测与MES一体化平台 | WPF + ASP.NET Core 前后端分离 | OpenCvSharp4 8种算法 | Modbus TCP PLC通信 | JWT认证 | LiveCharts2 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 6 - **Created**: 2026-06-05 - **Last Updated**: 2026-09-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SmartVision MES — 智能视觉检测与MES管理系统 基于 .NET 8 的工业视觉检测与 MES 一体化平台,采用 WPF + ASP.NET Core 前后端分离架构。 ## ✨ 功能特性 ### 🔐 用户与权限 - JWT Token 认证(HMAC-SHA256) - 三级角色权限:管理员 / 工程师 / 操作员 - 用户增删改查、密码重置、启用/禁用 - API 级别角色授权,删除操作仅限管理员 - 全局异常处理中间件 ### 📊 生产看板 - 今日产量/合格数/不良数/合格率实时统计(数据库查询) - 设备状态监控(PLC、相机、帧率、CPU、内存) - 7 日产量趋势 LiveCharts2 柱状图(中文字体) - 最近报警列表 - 30 秒自动刷新 ### 🔬 视觉检测 - **8 种算法引擎**(基于 OpenCvSharp4 真实实现): - 灰度化(`Cv2.CvtColor`) - 二值化(`Cv2.Threshold`) - Blob 分析(`Cv2.FindContours` + 面积过滤 + 标注) - 边缘检测(`Cv2.Canny` + 绿色叠加) - 缺陷检测(轮廓分类:气泡/划痕/异物,彩色边框标注) - 模板匹配(`Cv2.MatchTemplate` CCoeffNormed) - 尺寸测量(最小外接矩形 + 最小外接圆直径) - OCR 字符区域检测(Otsu + 轮廓过滤) - 管线架构(`IAlgorithmStep` 接口 + `InspectionPipeline` 执行器) - ROI 感兴趣区域支持 - 形态学开运算预处理 - Halcon 引擎架构(`IVisionEngine` 策略模式 + `VisionEngineFactory`) - 算法参数面板(勾选启用/禁用、调节阈值) - 实时摄像头画面(OpenCvSharp4 `VideoCapture` DirectShow) - 检测结果叠加显示(OK/NG 标签、缺陷标记框) - 缺陷详情列表(类型、面积、坐标、宽高) - NG 图片自动保存 - 产品阈值联动(`MaxDefectCount`、`DefectAreaThreshold`) ### 📋 工单管理 - 工单生命周期:创建 → 启动 → 暂停 → 完成 → 取消 → 删除 - 状态筛选(全部/待开始/进行中/已完成/已取消) - 模糊查询(工单号/产品/操作员/状态,实时搜索 + 按钮触发) - 良品/不良品计数自动更新(检测时联动工单) - 进度条显示(良品数/目标数) - 删除按钮仅管理员可见 ### 📦 产品管理 - 产品增删改查 - 产品参数配置(二值化阈值、缺陷面积、最大缺陷数、匹配分数) - 启用/禁用切换(点击 CheckBox 即切换) - 产品切换联动检测参数 - 删除按钮仅管理员可见 ### 🚨 报警中心 - 四级报警:信息 / 警告 / 错误 / 严重(中文显示) - 报警筛选(全部/未确认/已确认) - 报警确认功能(确认后行变半透明) - 未确认数量统计卡片 ### 🖥️ 设备监控 - PLC 设备状态(连接状态、IP、端口、心跳、读写次数) - 工业相机状态(连接状态、分辨率、帧率、触发模式) - 系统资源监控(CPU/内存百分比,真实进程数据) - 设备状态中文显示(在线/离线/错误/维护中) ### 📈 统计分析 - 汇总卡片(今日总检测、总合格数、进行中工单) - 良率趋势 LiveCharts2 柱状图(tooltip 中文正常) - 检测记录列表(结果列显示中文"合格/不良") ### 📡 PLC 通信(Modbus TCP) - 基于 NModbus 库的真实 Modbus TCP 通信 - 心跳检测 + 自动重连 - 读取/写入保持寄存器(`ReadHoldingRegistersAsync` / `WriteSingleRegisterAsync`) - 读取/写入线圈(`ReadCoilsAsync` / `WriteSingleCoilAsync`) - 可配置寄存器地址映射(`PlcRegisterMap`) - 触发-结果闭环(`WaitForTriggerAsync` + `WriteResultAsync`) - API 启动时自动连接 PLC(`PlcHostedService` 后台服务) - SlaveException 不触发断连(区分功能码不支持 vs 连接断开) ### 📤 导出报表 - Excel 导出(ClosedXML):检测记录表格,带样式表头 - PDF 导出(QuestPDF):A4 报表含统计摘要 + 检测记录明细 + 页码 ### 🔄 实时推送(SignalR) - 检测结果实时推送 - 设备状态变更推送 - 报警信息推送 - 看板数据刷新推送 - 自动重连 ## 🛠️ 技术栈 | 层级 | 技术 | 版本 | |------|------|------| | 运行时 | .NET | 8.0 | | 语言 | C# | 12 | | 桌面客户端 | WPF + MVVM(CommunityToolkit.Mvvm) | 8.0 | | 后端 | ASP.NET Core Web API + SignalR | 8.0 | | 数据库 | SQL Server + EF Core | 8.0 | | 微 ORM | Dapper | 2.1.66 | | 视觉算法 | OpenCvSharp4(8 种算法引擎) | 4.10.0 | | PLC 通信 | NModbus(Modbus TCP) | 3.0.81 | | 图表 | LiveCharts2(SkiaSharp WPF) | 2.0.0-rc3.3 | | Excel 导出 | ClosedXML | 0.102.3 | | PDF 导出 | QuestPDF | 2024.3.0 | | 日志 | Serilog | 8.0.0 | | 认证 | JWT(Microsoft.AspNetCore.Authentication.JwtBearer) | 8.0.0 | | API 文档 | Swagger(Swashbuckle) | 6.5.0 | ## 🚀 快速开始 ### 环境要求 - .NET 8 SDK - SQL Server(Express 或更高版本) - Visual Studio 2022(推荐) ### 一键启动 ```bash # 双击 start.bat 一键启动 API + WPF 客户端 start.bat ``` ### 手动启动 ```bash # 1. 还原依赖 dotnet restore # 2. 构建 dotnet build # 3. 启动 Web API(端口 5088) dotnet run --project SmartVisionMES.Web --urls "http://localhost:5088" # 4. 启动 WPF 客户端(新终端) dotnet run --project SmartVisionMES.WPF ``` ### 在 Visual Studio 中启动 - 打开 `SmartVisionMES.slnx` - 将 `SmartVisionMES.WPF` 设为启动项目 - 按 F5(WPF 会自动启动 API) - 或配置「多个启动项目」同时启动 Web + WPF ### 默认账号 - 用户名: `admin` - 密码: `123456` ### 测试账号 - 用户名: `operator1` - 密码: `test123` - 角色: 操作员(无删除权限) ## 📁 项目结构 ``` SmartVisionMES/ ├── SmartVisionMES.Models/ # 实体/DTO/枚举(零依赖) │ ├── Entities/Entities.cs # 7 个实体:User, Product, WorkOrder, │ │ # InspectionRecord, AlarmRecord, │ │ # DeviceStatusRecord, InspectionScheme │ ├── DTOs/DTOs.cs # 12 个 DTO │ └── Enums/Enums.cs # 8 个枚举 │ ├── SmartVisionMES.Core/ # 业务逻辑层 │ ├── Interfaces/ # 服务接口 + 仓储接口 + IJwtTokenService │ └── Services/ # 服务实现(User, Product, WorkOrder, │ # Inspection, Alarm, Device) │ ├── SmartVisionMES.Data/ # 数据访问层 │ ├── DbContext/ # EF Core 上下文(7 DbSet + 种子数据) │ ├── Repositories/ # 6 个仓储实现(泛型基类 + 专用) │ └── Migrations/ # EF Core 迁移(启动时自动执行) │ ├── SmartVisionMES.Vision/ # 视觉算法引擎 │ ├── Algorithms/Algorithms.cs # 8 种算法步骤实现 │ ├── Pipeline/ # 管线引擎 + 上下文 + 接口 │ └── Engines/ # 策略模式(OpenCV / Halcon / Factory) │ ├── SmartVisionMES.Hardware/ # 硬件通信 │ ├── PLC/ # Modbus TCP 管理器 + 寄存器映射 │ └── Camera/ # 工业相机管理器(框架) │ ├── SmartVisionMES.Web/ # ASP.NET Core Web API │ ├── Controllers/ # 7 个 API 控制器(27 个端点) │ ├── Hubs/ # SignalR Hub + 通知服务 │ ├── Middleware/ # 全局异常处理中间件 │ ├── Services/ # JWT 服务 + PLC 后台服务 │ └── Program.cs # DI 配置 + 中间件管道 │ ├── SmartVisionMES.WPF/ # WPF 桌面客户端 │ ├── Views/ # 10 个视图 │ ├── ViewModels/ # MainViewModel(MVVM) │ ├── Dialogs/ # 3 个弹窗(用户/产品/工单) │ ├── Converters/ # 8 个值转换器 │ └── Services/ # API 客户端 + 相机 + SignalR │ └── .github/workflows/ # CI/CD(构建 + 密钥扫描 + AppSettings 扫描) ``` ## 📊 API 接口 ### 认证 `/api/auth` [无需登录] | 方法 | 接口 | 说明 | |------|------|------| | POST | `/api/auth/login` | 登录,返回 JWT Token | ### 产品 `/api/products` [Admin/Engineer] | 方法 | 接口 | 说明 | |------|------|------| | GET | `/api/products` | 获取所有产品 | | GET | `/api/products/active` | 获取启用的产品 | | GET | `/api/products/{id}` | 获取单个产品 | | POST | `/api/products` | 新增产品 | | PUT | `/api/products/{id}` | 更新产品 | | DELETE | `/api/products/{id}` | 删除产品 🔒Admin | | POST | `/api/products/{id}/toggle-active` | 切换启用状态 | ### 工单 `/api/workorders` [需登录] | 方法 | 接口 | 说明 | |------|------|------| | GET | `/api/workorders` | 获取工单(支持 `?status=` 筛选) | | GET | `/api/workorders/active` | 获取当前进行中工单 | | GET | `/api/workorders/{id}` | 获取单个工单 | | POST | `/api/workorders` | 创建工单 | | POST | `/api/workorders/{id}/start` | 启动工单 | | POST | `/api/workorders/{id}/complete` | 完成工单 | | POST | `/api/workorders/{id}/cancel` | 取消工单 | | POST | `/api/workorders/{id}/count?isGood=` | 更新良品/不良品计数 | | DELETE | `/api/workorders/{id}` | 删除工单 🔒Admin | ### 检测 `/api/inspection` [需登录] | 方法 | 接口 | 说明 | |------|------|------| | GET | `/api/inspection` | 获取检测记录(分页) | | POST | `/api/inspection` | 保存检测记录 | | GET | `/api/inspection/{id}` | 获取单条记录 | | GET | `/api/inspection/dashboard` | 看板统计数据 | | GET | `/api/inspection/daily-yield` | 每日产量趋势 | ### 报警 `/api/alarms` [需登录] | 方法 | 接口 | 说明 | |------|------|------| | GET | `/api/alarms` | 获取报警列表(支持筛选) | | POST | `/api/alarms/{id}/acknowledge` | 确认报警 | ### 设备 `/api/devices` [需登录] | 方法 | 接口 | 说明 | |------|------|------| | GET | `/api/devices` | 获取所有设备状态(含实时 PLC) | | GET | `/api/devices/{name}` | 获取单个设备状态 | ### 用户 `/api/users` 🔒Admin | 方法 | 接口 | 说明 | |------|------|------| | GET | `/api/users` | 获取用户列表 | | POST | `/api/users` | 创建用户 | | PUT | `/api/users/{id}` | 更新用户信息 | | POST | `/api/users/{id}/reset-password` | 重置密码 | | POST | `/api/users/{id}/toggle-active` | 启用/禁用用户 | ### SignalR Hub `/hubs/smartvision` | 方向 | 事件 | 说明 | |------|------|------| | 客户端→服务端 | `JoinDeviceGroup` | 订阅设备更新 | | 客户端→服务端 | `LeaveDeviceGroup` | 取消订阅 | | 服务端→客户端 | `InspectionResult` | 推送检测结果 | | 服务端→客户端 | `DeviceStatus` | 推送设备状态 | | 服务端→客户端 | `Alarm` | 推送报警 | | 服务端→客户端 | `DashboardUpdate` | 推送看板刷新 | ## 🔧 配置说明 ### 数据库连接 编辑 `SmartVisionMES.Web/appsettings.json`: ```json { "ConnectionStrings": { "DefaultConnection": "Server=YOUR_SERVER;Database=SmartVisionMES;Trusted_Connection=True;TrustServerCertificate=True;Encrypt=False" } } ``` ### PLC 配置(Modbus TCP) ```json { "Plc": { "IpAddress": "127.0.0.1", "Port": 502, "SlaveId": 1, "HeartbeatIntervalMs": 2000 } } ``` ### JWT 配置 ```json { "JwtSettings": { "SecretKey": "YOUR_SECRET_KEY_HERE", "Issuer": "SmartVisionMES", "Audience": "SmartVisionMES", "ExpirationHours": 8 } } ``` ## 🏗️ 系统架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ WPF Desktop Client │ │ ┌──────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 10 Views │ │ MainViewModel │ │ 3 Services │ │ │ │ 3 Dialogs│ │ (MVVM CommTk) │ │ -ApiService │ │ │ │ 8 Convts │ │ │ │ -CameraService │ │ │ └──────────┘ └──────────────────┘ │ -SignalRService │ │ │ └────────┬─────────┘ │ ├───────────────────────────────────────────────┼─────────────┤ │ HTTP/JWT WebSocket(SignalR) │ │ ├──────────────────┬────────────────────────────┼─────────────┤ │ ASP.NET Core │ │ │ │ ┌────────────┐ │ ┌────────────────────┐ │ │ │ │ 7 Controllers│ │ │ SignalR Hub │ │ │ │ │ 27 Endpoints │ │ │ /hubs/smartvision │ │ │ │ └────────────┘ │ └────────────────────┘ │ │ │ ┌────────────┐ │ │ │ │ │ Middleware │ │ │ │ │ │ -Exception │ │ │ │ │ │ -JWT Auth │ │ │ │ │ │ -Serilog │ │ │ │ │ └────────────┘ │ │ │ ├──────────────────┼────────────────────────────┼─────────────┤ │ Core Services │ Data Layer (EF Core) │ Hardware │ │ ┌────────────┐ │ ┌────────────────────┐ │ ┌────────┐ │ │ │ User │ │ │ SmartVisionDbContext│ │ │PLC │ │ │ │ Product │ │ │ 7 DbSets │ │ │Modbus │ │ │ │ WorkOrder │ │ │ Auto-migration │ │ │TCP │ │ │ │ Inspection │ │ └────────┬───────────┘ │ └────────┘ │ │ │ Alarm │ │ │ │ ┌────────┐ │ │ │ Device │ │ │ │ │Camera │ │ │ └────────────┘ │ │ │ │(sim) │ │ │ │ ▼ │ └────────┘ │ │ │ ┌────────────────────┐ │ │ │ │ │ SQL Server │ │ │ │ │ └────────────────────┘ │ │ └──────────────────┴────────────────────────────┴─────────────┘ ``` ## 📝 开发日志 - 2026-06-05: 项目初始化,完成基础架构 - 2026-06-05: 实现 8 种视觉算法引擎(OpenCvSharp4 真实实现) - 2026-06-05: 完成中文化,修复多项 UI 问题 - 2026-06-05: 实现 Excel/PDF 导出功能(ClosedXML + QuestPDF) - 2026-06-05: 完善检测记录保存和工单自动关联 - 2026-06-05: PLC Modbus TCP 真实通信(NModbus)+ 触发闭环 - 2026-06-05: Halcon 引擎架构(IVisionEngine 策略模式) - 2026-06-05: LiveCharts2 统计图表 + 真实系统指标 - 2026-06-05: JWT 认证 + 角色授权(Admin/Engineer/Operator) - 2026-06-05: 全局异常处理中间件 + Serilog 结构化日志 - 2026-06-05: NG 图片自动保存 + PDF 报表导出 - 2026-06-05: 用户管理支持编辑角色 - 2026-06-05: 工单管理模糊查询(工单号/产品/操作员/状态) - 2026-06-05: WPF 客户端自动启动 API - 2026-06-05: 代码审查修复(工单计数、枚举转换器、缺陷重复计数等) - 2026-06-06: 设备状态中文显示(在线/离线/错误) - 2026-06-06: PLC 自动连接(PlcHostedService 后台服务) - 2026-06-06: UI 全面优化(对话框高度、窗口适配、按钮对齐、表格整齐) - 2026-06-06: 产品管理增加删除和启用切换 - 2026-06-06: 工单/产品删除按钮仅 Admin 可见(客户端+服务端双重校验) - 2026-06-06: 产品阈值联动检测参数 - 2026-06-06: GitHub Actions CI/CD(构建 + 密钥扫描) ## ⚠️ 已知限制 | 组件 | 状态 | 说明 | |------|------|------| | 工业相机 SDK | 框架就绪 | `CameraManager` 为 TODO 框架,实际使用 WPF `CameraService`(OpenCvSharp VideoCapture) | | Halcon 引擎 | 架构演示 | `HalconEngine` 需 `USE_HALCON` 编译符号,当前为接口+注释 | | OCR 字符识别 | 区域检测 | 仅检测文字区域轮廓,未集成 Tesseract 等 OCR 引擎 | | 密码哈希 | SHA256 | 生产环境建议使用 BCrypt/PBKDF2 | ## 📄 许可证 MIT License ## 👨‍💻 作者 - Gitee: [hopefully-2023/SmartVisionMES](https://gitee.com/hopefully-2023/c-sharp-demo)