编辑
2026-04-22
C#
00

目录

📌 上节回顾
💡 核心知识讲解
场景一:设备数据采集与实时监控
场景二:生产计数与效率统计
场景三:报警管理与消息推送
场景四:质量数据追溯
场景五:能耗监测与分析
场景六:与MES/ERP系统对接
💻 VS2026 操作步骤
📋 完整代码示例
🏭 工业实战小案例
⚠️ 避坑提醒
「这几个坑,我替你踩过了」
📝 本节总结

车间主任走过来,指着屏幕说:"这个报警,能不能自动发到我手机上?"

你点点头说"没问题",转身打开电脑,盯着桌面发了5分钟呆——不知道从哪里开始。

这个场景,是不是有点熟悉?

其实,这就是一个标准的C#工业小工具能解决的需求。今天这篇,我们不讲概念,直接带你看C#在工厂里到底在干什么活。


📌 上节回顾

「上一节我们学了工业软件的分类,掌握了上位机、MES、SCADA、ERP各自的定位和分工方法。今天在这个基础上,我们进一步学习C#在这些系统里的真实落地案例。」


💡 核心知识讲解

C# 在工厂里,到底在跑什么?

很多人学C#,第一反应是"做网站"或者"写游戏"。但在制造业,C#其实是上位机开发的绝对主力语言。

据行业统计,90%以上的Windows工控上位机,底层都是用C# + .NET开发的。你平时在车间里看到的那些操作界面,大概率就是C#写的。

下面我们按场景来看,C#在工厂里具体能干哪些事。


场景一:设备数据采集与实时监控

注塑车间里,每台注塑机都有温度、压力、锁模力等几十个参数。

以前的做法是:操作工每小时手动抄一次表,填到纸质表格上,再由班长汇总到Excel。

用C#之后:程序通过 OPC UA(一种设备和软件之间互相"说话"的标准协议)或 Modbus TCP(工业设备间常用的通信协议,像工厂里的"普通话")直接读取PLC数据,每秒刷新一次,实时显示在屏幕上,超标自动变红报警。

「效果:一个工程师写一周代码,替代了三个巡检员的日常抄表工作。」


场景二:生产计数与效率统计

冲压线上,每冲一个零件,PLC就发一个脉冲信号。

C#程序监听这个信号,自动累计产量,计算当班完成率,对比计划数,不够就在大屏上亮黄灯提示。

班长不用再去现场数零件,手机上就能看实时进度。

对比项传统方式C#程序方式
数据更新频率每小时手动每秒自动
统计准确率约85%(人工误差)接近100%
人力投入每班1~2人0人

场景三:报警管理与消息推送

焊接线上,某台机器过热,以前的报警方式是:现场蜂鸣器响,等操作工发现,再电话通知维修。

C#程序接入报警信号后,可以:

  • 弹出操作界面报警窗口
  • 自动记录报警时间和持续时长
  • 通过企业微信API或短信接口,把报警信息推送给设备主管

「关键点:报警从"现场才能知道"变成了"随时随地都能知道"。」


场景四:质量数据追溯

汽车零件生产线,每个零件都要有"身份证"——记录它是哪台机器、哪个班次、哪个模具生产的。

C#程序在零件下线时,自动读取生产参数,生成二维码,写入数据库。出了质量问题,扫码就能追溯到具体的生产批次和工艺参数。

这套系统,本质上就是一个 WPF(Windows桌面应用开发框架,做出来的界面好看又流畅)+ SQL Server 的组合应用。


场景五:能耗监测与分析

光伏组件生产车间,用电成本是大头。

C#程序接入电表数据,按工序、按设备、按班次统计用电量,生成日报、月报,帮工厂找出耗电异常的设备。

某工厂用这套系统,三个月内发现了两台"暗中偷电"的老旧空压机,一年省下了20多万的电费。


场景六:与MES/ERP系统对接

C#写的上位机,不只是孤立地运行在现场。

它可以把采集到的生产数据,通过 RESTful API(系统之间传数据的标准方式,像快递单一样规范)或数据库直连的方式,推送给MES(制造执行系统)或ERP(企业资源计划系统)。

这样,生产数据就从"现场孤岛"变成了"全厂共享"。


💻 VS2026 操作步骤

这一节我们先感受一下,用VS2026新建一个工业监控项目是什么体验。完整的安装配置在下一节讲,这里只做预览。

Step 1 打开 VS2026,选择「新建项目」。

在搜索框输入 WPF,选择 WPF 应用(.NET),点击「下一步」。

image.png

Step 2 项目名称填写有工业语义的名称,例如:InjectionMonitor(注塑监控)。

框架选择 .NET 10,点击「创建」。

VS2026 Copilot 辅助:创建完成后,Copilot 会自动分析项目结构,在右侧面板弹出「推荐入门操作」,包括添加 NuGet 包、配置 MVVM 框架等建议,点击即可一键执行。

Step 3 打开 MainWindow.xaml,在设计器里拖入一个 TextBlock 控件。

在属性面板里设置字体大小为 36,颜色为红色,文本内容改为 温度:--°C

image.png

VS2026 Copilot 辅助:选中控件后,Copilot 会在属性面板旁边显示「工业控件推荐」,可以一键替换为带动画效果的仪表盘控件。

Step 4F5 运行,你会看到一个简洁的窗口,显示红色的温度占位文字。

这就是你的第一个工业监控界面雏形。

🎯 Vibe Coding Prompt 写法示例:

如果你想让 Copilot 帮你直接生成一个温度监控界面,可以这样写 Prompt:

帮我生成一个WPF窗口, 包含一个实时显示温度的TextBlock, 温度超过80度时文字变红, 低于80度时文字显示绿色, 数据每秒刷新一次,初始值为25.0°C。

image.png

image.png

image.png

Copilot 会直接生成 XAML 和 ViewModel 代码,你只需要检查逻辑是否符合需求。


📋 完整代码示例

这段代码实现了一个注塑机温度实时模拟监控界面:温度值每秒自动变化,超过阈值时界面颜色变红报警。

MainWindow.xaml

xml
<Window x:Class="InjectionMonitor.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="注塑机温度监控" Height="300" Width="480" Background="#1E1E2E"> <Grid> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> <!-- 标题标签 --> <TextBlock Text="1号注塑机 · 料筒温度" FontSize="18" Foreground="#AAAACC" HorizontalAlignment="Center" Margin="0,0,0,12"/> <!-- 温度显示主控件 --> <TextBlock x:Name="TempDisplay" FontSize="64" FontWeight="Bold" Foreground="#00FF88" HorizontalAlignment="Center"/> <!-- 报警状态标签 --> <TextBlock x:Name="AlarmLabel" FontSize="16" HorizontalAlignment="Center" Margin="0,16,0,0"/> </StackPanel> </Grid> </Window>

MainWindow.xaml.cs

csharp
using System; using System.Windows; using System.Windows.Media; using System.Windows.Threading; namespace InjectionMonitor { public partial class MainWindow : Window { // 报警温度阈值(单位:摄氏度) private const double AlarmThreshold = 80.0; // 模拟温度初始值 private double deviceTemp = 65.0; // 定时器:每秒刷新一次数据 private readonly DispatcherTimer refreshTimer; // 随机数生成器,模拟温度波动 private readonly Random tempSimulator = new(); public MainWindow() { InitializeComponent(); // 初始化定时刷新器 refreshTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; refreshTimer.Tick += OnTimerTick; refreshTimer.Start(); } // 定时器回调:更新模拟温度并刷新界面 private void OnTimerTick(object? sender, EventArgs e) { // 模拟温度随机波动(±3°C) double fluctuation = (tempSimulator.NextDouble() - 0.5) * 6.0; deviceTemp = Math.Clamp(deviceTemp + fluctuation, 50.0, 95.0); // 刷新温度显示 TempDisplay.Text = $"{deviceTemp:F1} °C"; // 根据是否超过报警阈值切换颜色和提示 if (deviceTemp >= AlarmThreshold) { // 超温:红色报警 TempDisplay.Foreground = new SolidColorBrush(Colors.OrangeRed); AlarmLabel.Text = "⚠ 温度过高!请检查冷却系统"; AlarmLabel.Foreground = new SolidColorBrush(Colors.OrangeRed); } else { // 正常:绿色显示 TempDisplay.Foreground = new SolidColorBrush( Color.FromRgb(0x00, 0xFF, 0x88)); AlarmLabel.Text = "● 运行正常"; AlarmLabel.Foreground = new SolidColorBrush(Colors.LightGreen); } } } }

运行后,你会看到一个深色背景的监控窗口,温度数字每秒跳动一次。当模拟温度爬升超过80°C时,数字从绿色变为橙红色,下方同步出现"⚠ 温度过高"的报警提示。这就是工业监控界面最核心的交互逻辑——数据驱动界面,界面反映状态。

image.png


🏭 工业实战小案例

场景任务: 汽车冲压车间需要一个小工具,统计当班的冲压产量,并在完成率低于90%时高亮提示班长。

思路拆解:

  • 用一个整型变量 productionCount 记录已完成数量。
  • 设定计划产量 planTarget,计算完成率。
  • 完成率低于阈值时,进度条颜色变黄。
  • 点击"冲压 +1"按钮模拟每次产出(实际项目中替换为PLC信号监听)。
  • 界面用 WinForms 快速实现,适合老工厂电脑(XP/Win7兼容性好)。

image.png

csharp
// Form1.cs — 冲压产量统计工具(WinForms 版本) // NuGet 依赖:无(纯 .NET 10 内置库) using System; using System.Drawing; using System.Windows.Forms; namespace StampingCounter { public partial class Form1 : Form { // 计划产量(班次目标) private const int PlanTarget = 500; // 完成率报警阈值(低于此值高亮提示) private const double LowRateThreshold = 0.9; // 当前冲压产量计数 private int productionCount = 0; public Form1() { InitializeComponent(); UpdateDisplay(); } // 冲压 +1 按钮点击事件(实际接PLC信号时替换此入口) private void BtnStamp_Click(object sender, EventArgs e) { productionCount++; UpdateDisplay(); } // 刷新界面显示 private void UpdateDisplay() { double completionRate = (double)productionCount / PlanTarget; // 更新产量和完成率标签 lblCount.Text = $"已完成:{productionCount} / {PlanTarget} 件"; lblRate.Text = $"完成率:{completionRate:P1}"; // 完成率低于阈值时,标签变黄警示 lblRate.ForeColor = completionRate < LowRateThreshold ? Color.DarkOrange : Color.Green; // 更新进度条 progressBar.Value = Math.Min(productionCount, PlanTarget); progressBar.ForeColor = completionRate < LowRateThreshold ? Color.Orange : Color.LimeGreen; } } }

Form1.Designer.cs(关键控件部分)

csharp
// 以下为 Designer 自动生成的关键控件初始化代码 private void InitializeComponent() { this.lblCount = new System.Windows.Forms.Label(); this.lblRate = new System.Windows.Forms.Label(); this.progressBar = new System.Windows.Forms.ProgressBar(); this.btnStamp = new System.Windows.Forms.Button(); // 进度条设置 this.progressBar.Maximum = 500; this.progressBar.Size = new System.Drawing.Size(360, 28); this.progressBar.Location= new System.Drawing.Point(20, 100); // 冲压按钮 this.btnStamp.Text = "冲压 +1(模拟)"; this.btnStamp.Size = new System.Drawing.Size(160, 48); this.btnStamp.Location = new System.Drawing.Point(20, 150); this.btnStamp.Click += new System.EventHandler(this.BtnStamp_Click); this.Controls.AddRange(new System.Windows.Forms.Control[] { lblCount, lblRate, progressBar, btnStamp }); this.Text = "冲压产量统计"; this.Size = new System.Drawing.Size(420, 260); } private System.Windows.Forms.Label lblCount; private System.Windows.Forms.Label lblRate; private System.Windows.Forms.ProgressBar progressBar; private System.Windows.Forms.Button btnStamp;

运行后,每次点击"冲压 +1"按钮,产量自动累加,进度条实时更新。当完成率低于90%时,完成率数字和进度条同步变橙色,班长一眼就能看出进度落后。

image.png


⚠️ 避坑提醒

「这几个坑,我替你踩过了」

坑一:定时器在子线程更新UI

❌ 错误做法:用 System.Threading.Timer 直接修改 TextBlock.Text

✅ 正确做法:用 DispatcherTimer,或在回调里加 Dispatcher.Invoke(() => { ... })

📌 原因:WPF/WinForms的UI控件只能在主线程(UI线程)上操作,跨线程直接改会直接抛异常,程序崩溃。


坑二:温度阈值写死在代码里

❌ 错误做法:if (deviceTemp >= 80.0)(魔法数字直接写在逻辑里)

✅ 正确做法:private const double AlarmThreshold = 80.0;(提取为具名常量)

📌 原因:工厂里不同产品、不同季节阈值不一样,写死了改起来要翻遍整个文件,出错概率极高。


坑三:忘记处理窗口关闭时的定时器

❌ 错误做法:窗口关闭后定时器还在跑,持续占用资源甚至报错

✅ 正确做法:在 Window_Closing 事件里加 refreshTimer.Stop();

📌 原因:定时器是独立运行的,窗口关了它不会自动停,老师傅都被这个坑过。


📝 本节总结

「学完本节,你掌握了:」

C#在工厂里能干的6类真实工作——从设备数据采集、产量统计、报警推送,到质量追溯、能耗分析,再到与MES/ERP系统对接,每一类都有对应的实际场景。你也写出了第一段工业风格的C#代码,看到了数据驱动界面的基本原理,并且知道了3个初学者必踩的经典坑。

从今天开始,"C#能干什么"这个问题,你已经有了自己的答案。下一节装上VS2026,你就可以把这些代码真正跑起来了。


📖 本文是《C# 工业数字化应用开发专家》系列第 003 节

上一节:【工业软件的分类:上位机、MES、SCADA、ERP 概览】

下一节:【Visual Studio 2026 安装与激活(含 Copilot 配置)】(明天更新)

💬 你在工厂里遇到过哪些"要是有个程序就好了"的场景?

欢迎在评论区说说你的需求,也许下一篇案例就来自你的留言。

🔔 还没关注的同学记得点击关注,系列课程持续更新,学完这420节,从工厂小白到工业软件开发专家,我们一起走。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!