C#上位机+MQTT汽车产线实战:120+设备毫秒级采集+看板远程监控

张开发
2026/4/21 22:12:18 15 分钟阅读

分享文章

C#上位机+MQTT汽车产线实战:120+设备毫秒级采集+看板远程监控
一、项目背景上个月接了个天津本地汽车座椅厂的活他们之前用的是西门子WinCC但是有两个痛点一是WinCC太贵120设备的授权费加起来快20万二是只能在车间中控室看老板出差想远程看实时数据和产量报表还要加VPN和额外的Web授权又得花一笔。客户预算只有5万要求120设备PLC、扫码枪、传感器、拧紧枪数据采集延迟不超过100ms车间本地看板实时显示产量、合格率、设备状态老板手机/电脑Web端远程看不需要VPN数据存本地SQL Server保留3年支持简单的报警推送微信/邮件我当时想这不就是C#上位机MQTT的完美场景吗WinCC能干的C#MQTT免费组件基本都能搞定而且成本低、扩展性强。二、整体架构设计先给你看架构图这个架构我在3个汽车零部件项目里用过非常稳定。远程监控层本地服务器层边缘采集层车间设备层西门子S7-1200欧姆龙CP1H台达DVP-ES3扫码枪温度传感器拧紧枪树莓派4B MQTT客户端树莓派4B MQTT客户端树莓派4B MQTT客户端EMQX BrokerC#上位机服务端SQL Server 2022C# WPF本地看板Vue3 Element Plus Web看板企业微信应用消息SMTP邮件2.1 为什么选这个架构边缘采集层用树莓派4B代替工业网关成本只有工业网关的1/10而且支持Python/C#/Node.js开发灵活。120设备分成3组每组40台左右用3个树莓派采集避免单点故障。MQTT协议轻量级、低延迟、支持QoS服务质量非常适合工业场景。QoS选1保证消息至少送达一次不会丢数据。EMQX Broker开源免费的MQTT Broker支持百万级连接性能比Mosquitto好很多而且自带Web管理界面方便调试。C#上位机WPF做本地看板界面美观、响应快服务端用ASP.NET Core Web API跨平台以后可以直接部署到Linux服务器上。远程监控用内网穿透工具比如花生壳企业版一年才几百块把Web API暴露到公网不需要VPN老板手机/电脑直接访问域名就行。三、核心功能实现3.1 边缘采集层树莓派Python树莓派上用Python写采集程序因为Python有现成的库比如pymodbusModbus TCP/RTU、snap7西门子S7、paho-mqttMQTT客户端开发速度快。给你看个简化的西门子S7-1200采集MQTT发布的代码逻辑# 伪代码不是完整源码importsnap7importpaho.mqtt.clientasmqttimporttime# 连接PLCplcsnap7.client.Client()plc.connect(192.168.1.10,0,1)# 连接MQTT Brokerclientmqtt.Client()client.connect(192.168.1.100,1883,60)whileTrue:# 读取DB1数据块db_dataplc.db_read(1,0,100)# 解析数据产量、合格率、设备状态productionsnap7.util.get_int(db_data,0)pass_ratesnap7.util.get_real(db_data,2)statussnap7.util.get_bool(db_data,6,0)# 封装成JSONpayload{device_id:PLC_001,device_name:座椅骨架焊接PLC,production:production,pass_rate:pass_rate,status:status,timestamp:time.time()}# 发布到MQTT主题client.publish(factory/line1/plc,json.dumps(payload),qos1)time.sleep(0.05)# 50ms采集一次扫码枪、传感器、拧紧枪的采集逻辑类似只是用的库不一样。扫码枪用串口库pyserial拧紧枪如果是Modbus TCP的话用pymodbus如果是专用协议的话找厂家要协议文档自己写解析。3.2 本地服务器层C#3.2.1 MQTT订阅数据存储C#服务端用MQTTnet库订阅EMQX的主题然后把数据存到SQL Server 2022里。MQTTnet是.NET平台最好用的MQTT库开源免费支持异步。给你看个简化的订阅存储逻辑// 伪代码不是完整源码usingMQTTnet;usingMQTTnet.Client;usingSystem.Data.SqlClient;usingSystem.Text.Json;// 连接SQL ServervarconnectionStringServer192.168.1.100;DatabaseFactoryDB;User Idsa;Password123456;;varconnectionnewSqlConnection(connectionString);connection.Open();// 创建MQTT客户端varfactorynewMqttFactory();varclientfactory.CreateMqttClient();// 连接EMQXvaroptionsnewMqttClientOptionsBuilder().WithTcpServer(192.168.1.100,1883).WithClientId(CSharp_Server).Build();awaitclient.ConnectAsync(options);// 订阅主题awaitclient.SubscribeAsync(factory/line1/#,MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce);// 处理收到的消息client.ApplicationMessageReceivedAsyncasynce{varpayloadEncoding.UTF8.GetString(e.ApplicationMessage.Payload);vardataJsonSerializer.DeserializeDeviceData(payload);// 存到SQL ServervarsqlINSERT INTO DeviceData (DeviceId, DeviceName, Production, PassRate, Status, Timestamp) VALUES (DeviceId, DeviceName, Production, PassRate, Status, Timestamp);varcommandnewSqlCommand(sql,connection);command.Parameters.AddWithValue(DeviceId,data.DeviceId);command.Parameters.AddWithValue(DeviceName,data.DeviceName);command.Parameters.AddWithValue(Production,data.Production);command.Parameters.AddWithValue(PassRate,data.PassRate);command.Parameters.AddWithValue(Status,data.Status);command.Parameters.AddWithValue(Timestamp,DateTimeOffset.FromUnixTimeSeconds(data.Timestamp).DateTime);awaitcommand.ExecuteNonQueryAsync();};3.2.2 WPF本地看板WPF本地看板用LiveCharts.Wpf库做实时图表界面美观、响应快。看板显示产线总产量、今日产量、今日合格率120设备的实时状态绿色运行黄色待机红色故障最近1小时的产量趋势图最近10条报警记录给你看个设备状态卡片的XAML代码逻辑!-- 伪代码不是完整源码 -- ItemsControl ItemsSource{Binding DeviceList} ItemsControl.ItemsPanel ItemsPanelTemplate WrapPanel / /ItemsPanelTemplate /ItemsControl.ItemsPanel ItemsControl.ItemTemplate DataTemplate Border Width120 Height80 Margin5 CornerRadius5 Background{Binding Status, Converter{StaticResource StatusToColorConverter}} StackPanel VerticalAlignmentCenter HorizontalAlignmentCenter TextBlock Text{Binding DeviceName} FontSize12 ForegroundWhite TextWrappingWrap TextAlignmentCenter/ TextBlock Text{Binding StatusText} FontSize14 ForegroundWhite FontWeightBold Margin0,5,0,0/ /StackPanel /Border /DataTemplate /ItemsControl.ItemTemplate /ItemsControl3.3 远程监控层Vue3Element PlusWeb看板用Vue3Element Plus开发通过ASP.NET Core Web API获取数据。内网穿透用花生壳企业版把Web API的5000端口暴露到公网老板手机/电脑直接访问https://xxx.oicp.net:5000就行。Web看板显示的内容和本地看板差不多只是多了一个历史数据查询功能老板可以查询任意时间段的产量、合格率、设备状态。四、项目成果这个项目花了3周时间完成总成本不到4万3个树莓派4B8G3×8002400花生壳企业版1年600SQL Server 2022 Express免费其他组件开源免费开发费用35000上线后运行了1个月非常稳定数据采集延迟平均50ms最高不超过80ms没有丢过一条数据老板远程看数据非常流畅不需要VPN报警推送及时设备故障后10秒内就能收到微信消息客户非常满意说以后再上其他产线还用这个方案。五、实战踩坑总结树莓派的电源一定要用好的一开始用的是普通的5V2A电源树莓派经常死机后来换成5V3A的工业电源就再也没死机过。MQTT的QoS选1就够了QoS2虽然保证消息只送达一次但性能开销大延迟高。工业场景下QoS1足够了即使偶尔重复收到一条消息存数据库的时候加个唯一索引就行。SQL Server的索引一定要建对一开始没建索引查询历史数据的时候非常慢后来在DeviceId和Timestamp字段上建了联合索引查询速度提升了100倍以上。内网穿透工具一定要用企业版免费版的花生壳速度慢、不稳定而且有流量限制。企业版的速度快、稳定没有流量限制一年才几百块非常划算。

更多文章