在汽车零部件制造车间摸爬滚打十年,见过太多人工检测的无奈:一条生产线配五六个质检工,一天下来眼睛布满血丝,误判率仍居高不下;客户投诉一来,翻找历史数据全靠纸质记录,追溯过程让人头大。去年牵头做了个项目,用C#开发了一套上位机系统,对接车间的西门子PLC和基恩士视觉检测设备,实现了产品质量的实时判定与数据全追溯,上线后效果超出预期,今天把完整实现过程分享出来。
系统整体架构设计
先上架构图,这套系统我拆成了三层:设备层、通信层和应用层,逻辑清晰,现场维护也方便。
设备层是车间的硬件核心: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,控制推料杆把不合格品推到返修区。
上张数据处理的流程图,更直观:
UI展示:操作工看简单,管理员看全面
UI用WPF做的,比WinForms美观,MVVM模式绑定数据也方便。分两个界面:
- 操作工界面:三个大区域——产品信息、实时数据、判定结果(OK绿NG红),不用操作,看颜色就行。
- 管理员界面:历史数据查询(时间/型号/结果筛选)、Excel报表导出(合格率、缺陷分布)、阈值设置(改合格范围)。
上线效果与总结
这套系统上线后,质检工从6个减到2个(只负责抽检),误判率从5%降到0.5%,客户投诉少了80%。历史数据追溯更爽,输入产品ID,几秒钟调出所有检测记录。
工业项目做下来,最大的感触是:稳定永远比花哨重要。OPC UA订阅比轮询稳,时间戳同步比复杂算法靠谱,反编译Demo有时候比看文档高效。
👉 点击我的头像进入主页,关注专栏第一时间收到更新提醒,有问题评论区交流,看到都会回。