车间主任走过来,指着屏幕说:"这个报警,能不能自动发到我手机上?"
你点点头说"没问题",转身打开电脑,盯着桌面发了5分钟呆——不知道从哪里开始。
这个场景,是不是有点熟悉?
其实,这就是一个标准的C#工业小工具能解决的需求。今天这篇,我们不讲概念,直接带你看C#在工厂里到底在干什么活。
「上一节我们学了工业软件的分类,掌握了上位机、MES、SCADA、ERP各自的定位和分工方法。今天在这个基础上,我们进一步学习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#程序接入报警信号后,可以:
「关键点:报警从"现场才能知道"变成了"随时随地都能知道"。」
汽车零件生产线,每个零件都要有"身份证"——记录它是哪台机器、哪个班次、哪个模具生产的。
C#程序在零件下线时,自动读取生产参数,生成二维码,写入数据库。出了质量问题,扫码就能追溯到具体的生产批次和工艺参数。
这套系统,本质上就是一个 WPF(Windows桌面应用开发框架,做出来的界面好看又流畅)+ SQL Server 的组合应用。
光伏组件生产车间,用电成本是大头。
C#程序接入电表数据,按工序、按设备、按班次统计用电量,生成日报、月报,帮工厂找出耗电异常的设备。
某工厂用这套系统,三个月内发现了两台"暗中偷电"的老旧空压机,一年省下了20多万的电费。
C#写的上位机,不只是孤立地运行在现场。
它可以把采集到的生产数据,通过 RESTful API(系统之间传数据的标准方式,像快递单一样规范)或数据库直连的方式,推送给MES(制造执行系统)或ERP(企业资源计划系统)。
这样,生产数据就从"现场孤岛"变成了"全厂共享"。
这一节我们先感受一下,用VS2026新建一个工业监控项目是什么体验。完整的安装配置在下一节讲,这里只做预览。
Step 1 打开 VS2026,选择「新建项目」。
在搜索框输入 WPF,选择 WPF 应用(.NET),点击「下一步」。

Step 2 项目名称填写有工业语义的名称,例如:InjectionMonitor(注塑监控)。
框架选择 .NET 10,点击「创建」。
VS2026 Copilot 辅助:创建完成后,Copilot 会自动分析项目结构,在右侧面板弹出「推荐入门操作」,包括添加 NuGet 包、配置 MVVM 框架等建议,点击即可一键执行。
Step 3 打开 MainWindow.xaml,在设计器里拖入一个 TextBlock 控件。
在属性面板里设置字体大小为 36,颜色为红色,文本内容改为 温度:--°C。

VS2026 Copilot 辅助:选中控件后,Copilot 会在属性面板旁边显示「工业控件推荐」,可以一键替换为带动画效果的仪表盘控件。
Step 4 按 F5 运行,你会看到一个简洁的窗口,显示红色的温度占位文字。
这就是你的第一个工业监控界面雏形。
🎯 Vibe Coding Prompt 写法示例:
如果你想让 Copilot 帮你直接生成一个温度监控界面,可以这样写 Prompt:
帮我生成一个WPF窗口, 包含一个实时显示温度的TextBlock, 温度超过80度时文字变红, 低于80度时文字显示绿色, 数据每秒刷新一次,初始值为25.0°C。



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
csharpusing 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时,数字从绿色变为橙红色,下方同步出现"⚠ 温度过高"的报警提示。这就是工业监控界面最核心的交互逻辑——数据驱动界面,界面反映状态。

场景任务: 汽车冲压车间需要一个小工具,统计当班的冲压产量,并在完成率低于90%时高亮提示班长。
思路拆解:
productionCount 记录已完成数量。planTarget,计算完成率。
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%时,完成率数字和进度条同步变橙色,班长一眼就能看出进度落后。

坑一:定时器在子线程更新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 许可协议。转载请注明出处!