.NET 8 工业级C#上位机架构:YOLO视觉+PLC控制一体化实战
最近半年一直在做汽车零部件产线的升级改造把原来分开的视觉检测系统和PLC控制系统整合成了一套一体化上位机。之前的架构是Python写YOLO检测C#写PLC控制两个系统通过TCP通信不仅延迟高经常超过200ms而且数据不同步出了问题排查起来非常麻烦。这次我们全面升级到.NET 8重新设计了一套工业级架构实现了视觉检测和PLC控制的深度融合。目前系统已经在产线稳定运行3个月1000个PLC点位采集延迟稳定在15ms以内YOLOv8n检测帧率32FPS误检率低于0.5%。今天把这套架构完整分享出来包括分层设计、核心模块实现、稳定性保障和踩坑记录希望能给做工业上位机的朋友一些参考。一、为什么选择.NET 8做工业上位机很多人觉得工业上位机用.NET Framework 4.8就够了没必要升级到.NET 8。但实际用下来.NET 8在工业场景下的优势非常明显特别是性能和稳定性方面。原生AOT编译可以把程序编译成单个exe文件不需要安装.NET运行时部署非常方便而且启动速度快了5倍以上。内存管理优化Span和Memory的广泛应用大幅减少了内存拷贝对于高频的PLC通信和图像处理来说性能提升非常显著。异步IO性能提升.NET 8的Socket异步IO性能比.NET 6提升了30%以上支持更多的并发连接。长期支持.NET 8是LTS版本支持到2027年对于工业软件来说长期支持非常重要。跨平台支持可以部署在Windows、Linux和国产化系统上满足未来的国产化需求。二、整体分层架构设计这套架构采用了经典的分层架构同时针对工业场景做了大量优化核心原则是高内聚、低耦合、可扩展、易维护。下面是完整的分层架构图横切关注点表示层 WPF/MVVM应用服务层 流程编排领域层 业务逻辑基础设施层 外部交互分级日志系统全局异常处理权限管理配置管理每个层的职责严格划分表示层负责用户界面和交互包括数据展示、参数设置、报警提示等。我们用WPF开发利用MVVM模式实现界面和逻辑的完全分离。应用服务层协调领域层和基础设施层实现业务流程比如检测流程、生产流程、数据上报流程等。这一层不包含任何业务逻辑只负责流程编排。领域层包含核心业务逻辑和领域模型比如产品模型、检测标准模型、设备状态模型等。这一层是整个系统的核心不依赖任何外部框架。基础设施层负责与外部系统的交互包括PLC通信、工业相机通信、数据库访问、文件操作等。这一层实现了领域层定义的所有接口。三、核心模块实现细节3.1 设备通信抽象层工业现场最头疼的问题就是设备品牌多协议不统一。我们用接口隔离原则抽象了所有设备的公共接口这样可以方便地替换不同品牌的设备不需要修改上层业务逻辑。设备通信抽象层的类图如下IDevicestring DeviceIdstring DeviceNamebool IsConnectedConnect() : boolDisconnect() : voidHeartbeat() : boolIPlcDeviceReadBool(string address) : boolReadInt16(string address) : shortReadFloat(string address) : floatWriteBool(string address, bool value) : boolICameraDeviceStartCapture() : voidStopCapture() : voidGetFrame() : ImageSetExposure(int value) : voidSiemensS71200Connect() : boolReadBool(string address) : boolHikvisionCameraStartCapture() : voidGetFrame() : Image这样设计的好处是如果以后客户要换成三菱PLC只需要实现IPlcDevice接口上层业务逻辑不需要做任何修改。之前我们做过一个项目客户中途要求把西门子PLC换成欧姆龙只用了一天时间就完成了替换。3.2 高性能PLC通信模块PLC通信是工业上位机的核心性能直接影响整个系统的实时性。之前我们用过很多第三方Modbus库比如NModbus但是在大批量读取的时候内存泄漏非常严重连续运行一周内存就会涨到几个G。所以最后决定基于.NET 8的Socket自己实现Modbus TCP和S7协议用Memory和Span处理数据完全避免了内存拷贝。核心的批量读取代码如下publicasyncTaskDictionarystring,objectBatchReadAsync(ListAddressItemaddresses){varbatchesMergeContinuousAddresses(addresses);varresultsnewDictionarystring,object();foreach(varbatchinbatches){varbufferMemorybyte.Allocate(batch.ByteCount);await_stream.ReadAsync(buffer);varspanbuffer.Span;foreach(variteminbatch.Items){results[item.Address]ParseValue(span.Slice(item.Offset,item.Length),item.DataType);}}returnresults;}优化后1000个点位的批量读取时间稳定在15ms以内比用第三方库快了3倍以上。3.3 YOLO视觉检测流水线视觉检测和PLC控制的一体化是这套架构的最大亮点。一开始我们用的是Python调用YOLO然后通过TCP把结果传给C#但是延迟太高而且Python环境在工业现场很容易出问题。现在我们用ONNX Runtime 1.18加载YOLOv8模型利用.NET 8的原生AOT编译推理速度比Python快了20%以上。为了实现低延迟我们设计了一个管道模式的视觉检测流水线工业相机帧捕获队列图像预处理YOLO推理结果解析PLC控制指令生成PLC执行每个环节都在独立的线程中运行用阻塞队列传递数据实现了生产和消费的解耦。实测在i5-10400 CPU上从相机捕获帧到PLC输出控制信号整个流程的延迟低于50ms完全满足工业现场的实时性要求。3.4 工业级数据持久化工业现场需要存储大量的生产数据和检测数据对数据库的写入性能要求很高。我们用SQLite作为本地数据库结合Dapper ORM实现了高速批量插入。实测每秒可以插入10000条以上的数据完全满足工业数据的高吞吐量要求。四、工业级稳定性保障工业软件和普通软件最大的区别就是稳定性要求极高必须7×24小时不间断运行。我们在架构中加入了多层稳定性保障机制解决了很多工业现场常见的问题。设备自动重连机制采用指数退避算法设备断开后自动重连重连间隔从1秒逐渐增加到30秒避免频繁重连导致设备崩溃。异常隔离机制每个设备和模块都在独立的线程中运行用try-catch包裹所有外部调用一个模块崩溃不会影响整个系统。数据缓存与断点续传本地缓存未上传到MES系统的数据网络恢复后自动上传保证数据不丢失。分级日志系统用Serilog实现分级日志记录Debug、Info、Warn、Error四个级别的日志支持滚动日志和远程日志上传。看门狗机制开发了一个独立的看门狗程序监控主程序的运行状态异常退出后自动重启。五、性能测试与优化我们对系统进行了全面的性能测试测试环境如下工控机i5-104008G内存256G SSDWindows 10 LTSCPLC西门子S7-1214C相机海康威视MV-CA013-20GC模型YOLOv8n.onnx测试结果如下测试项目测试结果1000个PLC点位采集延迟12-18msYOLOv8n单帧推理时间28-32ms端到端延迟相机到PLC42-55ms系统内存占用150-180MBCPU使用率25-35%连续运行72小时内存泄漏5MB从测试结果可以看出系统的性能完全满足工业现场的要求。六、项目实战案例这套架构已经成功应用在某汽车零部件厂的轴承检测产线上。产线原来的系统是Python写的视觉检测和C#写的PLC控制两个系统通过TCP通信端到端延迟超过200ms经常出现漏检和误检。升级到我们的一体化架构后端到端延迟降低到50ms以内误检率从2%降低到0.5%生产效率提高了15%。而且系统的维护成本大幅降低原来需要两个工程师分别维护两个系统现在一个工程师就可以搞定。七、总结与展望这套.NET 8工业级上位机架构实现了YOLO视觉检测和PLC控制的深度融合解决了传统分开架构的延迟高、数据不同步、维护困难等问题。架构采用了分层设计和接口隔离原则具有很好的可扩展性和可维护性可以快速适配不同的工业场景。未来我们会在这套架构的基础上加入AI预测性维护和云边协同功能实现从生产数据采集到智能决策的全流程自动化。