C#上位机实战:PLC与检测设备无缝对接,构建产品质量实时判定系统
2026/4/30 10:08:29 网站建设 项目流程


在汽车零部件制造车间摸爬滚打十年,见过太多人工检测的无奈:一条生产线配五六个质检工,一天下来眼睛布满血丝,误判率仍居高不下;客户投诉一来,翻找历史数据全靠纸质记录,追溯过程让人头大。去年牵头做了个项目,用C#开发了一套上位机系统,对接车间的西门子PLC和基恩士视觉检测设备,实现了产品质量的实时判定与数据全追溯,上线后效果超出预期,今天把完整实现过程分享出来。

系统整体架构设计

先上架构图,这套系统我拆成了三层:设备层、通信层和应用层,逻辑清晰,现场维护也方便。

西门子S7-1500 PLC

基恩士视觉相机

三坐标测量仪

OPC UA

C# SDK

串口通信

设备层

通信层

应用层

数据采集模块

实时判定模块

SQL Server存储

WPF UI展示

设备层是车间的硬件核心:PLC负责生产线流转控制,视觉相机拍产品外观缺陷,三坐标测关键尺寸。通信层是桥梁:PLC用OPC UA(比Modbus TCP稳定太多),视觉用厂家SDK,三坐标用老掉牙但靠谱的串口。应用层是大脑:采集、判定、存储、展示一条龙。

PLC对接:从轮询延迟到订阅实时的踩坑

最开始图省事用Modbus TCP,写了个100ms的定时器轮询信号。调试时设备少还好,一上线三条生产线同时跑,延迟直接飙到500ms,产品都流到下工位了,结果还没出来。

后来换成OPC UA,用开源的Opc.Ua库。这里提醒下,OPC UA配置要注意:PLC里先启用服务器,设置安全策略(现场内网我用的None)。上位机代码里创建会话、订阅节点,比轮询香多了:

// OPC UA会话配置varconfig=newApplicationConfiguration{ApplicationName="QualityCheckSystem",ApplicationType=ApplicationType.Client,SecurityConfiguration=newSecurityConfiguration{AutoAcceptUntrustedCertificates=true}};config.Validate(ApplicationType.Client).Wait();// 连接PLC并订阅产品到位信号varendpoint=newEndpointDescription("opc.tcp://192.168.1.100:4840");varsession=Session.Create(config,newConfiguredEndpoint(null,endpoint,EndpointConfiguration.Create(config)),false,"",60000,null,null).Result;varsubscription=newSubscription(session.DefaultSubscription){PublishingInterval=100};varmonitoredItem=newMonitoredItem(subscription.DefaultItem){StartNodeId=newNodeId("ns=2;s=PLC1.ProductInPosition"),AttributeId=Attributes.Value};monitoredItem.Notification+=(item,e)=>{if((bool)(e.NotificationValueasMonitoredItemNotification)?.Value.Value)TriggerDetection();// 产品到位触发检测};subscription.AddItem(monitoredItem);subscription.Create();

换成订阅后延迟降到50ms内,还加了个重连机制:会话断开时自动重连5次,每次间隔10秒,现场跑了半年没掉过链子。

检测设备对接:SDK文档烂?反编译Demo救了命

对接基恩士视觉相机时,厂家给的SDK文档烂到离谱,只有函数参数说明,连个完整示例都没有。我按文档写的代码要么连不上,要么取黑图,折腾两天没进展。

后来急中生智,用dnSpy反编译厂家的Demo程序,一看代码结构清清楚楚,连注释都没删(估计是忘了)。原来连接前要先设IP端口,初始化后等图像就绪事件,触发软触发才能取图:

// 视觉相机对接(反编译Demo后的正确逻辑)varcamera=newKeyenceCamera();camera.SetIPAddress("192.168.1.101");camera.SetPort(8080);if(!camera.Init())thrownewException("相机初始化失败");camera.ImageReady+=(sender,e)=>{varresult=e.DetectionResult;// 包含缺陷数、位置ProcessDetectionResult(result);};voidTriggerDetection()=>camera.SoftTrigger();

三坐标对接就简单了,串口发"MEASURE"命令,返回CSV格式的测量数据,直接Split解析就行,老协议但稳得一批。

数据同步与实时判定:时间戳+产品ID是绝配

数据上来后遇到的最大问题是同步:PLC信号、视觉结果、三坐标数据,怎么确定是同一个产品的?

我用了时间戳+产品ID的组合:PLC产品到位时生成唯一ID(时间+序列号),发给上位机;上位机带这个ID分别触发视觉和三坐标;设备返回结果时也带上ID,完美对齐。

判定逻辑不复杂,但要细:比如关键尺寸要求10.00±0.05mm,超出就NG;视觉缺陷不能超2个,否则直接判废。结果通过OPC UA发回PLC,控制推料杆把不合格品推到返修区。

上张数据处理的流程图,更直观:

三坐标视觉相机上位机PLC三坐标视觉相机上位机PLC产品到位+ID触发检测+ID触发测量+ID结果+ID数据+ID对齐+判定OK/NG执行动作

UI展示:操作工看简单,管理员看全面

UI用WPF做的,比WinForms美观,MVVM模式绑定数据也方便。分两个界面:

  • 操作工界面:三个大区域——产品信息、实时数据、判定结果(OK绿NG红),不用操作,看颜色就行。
  • 管理员界面:历史数据查询(时间/型号/结果筛选)、Excel报表导出(合格率、缺陷分布)、阈值设置(改合格范围)。

上线效果与总结

这套系统上线后,质检工从6个减到2个(只负责抽检),误判率从5%降到0.5%,客户投诉少了80%。历史数据追溯更爽,输入产品ID,几秒钟调出所有检测记录。

工业项目做下来,最大的感触是:稳定永远比花哨重要。OPC UA订阅比轮询稳,时间戳同步比复杂算法靠谱,反编译Demo有时候比看文档高效。


👉 点击我的头像进入主页,关注专栏第一时间收到更新提醒,有问题评论区交流,看到都会回。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询