乐于分享
好东西不私藏

从零写 WinForms 工控软件,实现 PLC 数据显示、设备启停控制

从零写 WinForms 工控软件,实现 PLC 数据显示、设备启停控制
在工业自动化领域,上位机软件是连接操作人员与底层设备的核心桥梁。WinForms 凭借其开发效率高、部署简单、兼容性强的特点,至今仍是工控上位机开发的主流选择之一。本文将从零开始,手把手带你搭建一套完整的 WinForms 工控上位机软件,实现 PLC 数据实时采集显示与设备启停控制。

一、技术选型与核心方案

1.1 技术栈说明

  • UI 框架
    :WinForms(.NET 6 /.NET 8,推荐 .NET 6+ 长期支持版)
  • 通信协议
    :Modbus TCP(工业界通用标准,几乎所有 PLC 均支持)
  • 通信库
    :NModbus4(成熟稳定的开源 Modbus 库)
  • 数据刷新
    :定时轮询 + 跨线程安全更新 UI
1.2 功能目标
  • PLC 连接管理(连接 / 断开 / 状态显示)
  • 保持寄存器数据实时读取与数值显示
  • 线圈读写实现设备启停控制
  • 通信异常捕获与重连机制
  • 工业级界面分区布局

二、环境准备与项目创建

2.1 安装 NuGet 包

创建 WinForms 项目后,通过 NuGet 安装核心依赖:

2.2 PLC 测试环境

如果没有真实 PLC,可使用 Modbus Slave 或 Modbus Poll 模拟从站设备,IP 设置为 127.0.0.1,端口默认 502,从站地址设为 1


三、界面布局设计

遵循工控软件分区布局原则,将界面划分为四大区域:

区域
位置
功能
连接配置区
顶部
IP 地址、端口、从站地址、连接 / 断开按钮
数据监控区
中部左侧
实时数据显示(温度、压力、转速等)
设备控制区
中部右侧
设备启停按钮、运行状态指示灯
日志状态栏
底部
操作日志、通信状态提示
使用 Panel 控件配合 Dock 属性进行分区,确保窗口拉伸时布局不乱。

四、核心代码实现

4.1 全局变量定义

4.2 PLC 连接管理

4.3 数据定时轮询读取

使用 Timer 控件定时读取 PLC 寄存器数据,通过 Invoke 跨线程安全更新 UI:

4.4 设备启停控制(写线圈)

通过写入线圈(Coil)实现设备启停,功能码 05:

4.5 状态指示灯更新
4.6 断开连接与资源释放


五、工业级优化要点

5.1 线程安全

所有跨线程 UI 更新必须通过 Invoke 或 BeginInvoke,禁止直接在后台线程操作控件属性,否则会引发不可预知的异常。

5.2 异常重连机制

生产环境建议增加断线自动重连:检测到通信异常后,每隔 3 秒尝试重连一次,重连成功后恢复数据采集。

5.3 双缓冲防闪烁

数据频繁刷新时界面容易闪烁,在窗体构造函数中开启双缓冲:

5.4 数据类型转换

实际项目中 PLC 寄存器通常存储 16 位整数,浮点数需要占用两个寄存器(高低字组合)。可使用 BitConverter 进行转换:


六、运行效果说明

程序启动后,输入 PLC 的 IP 地址与端口号,点击「连接」按钮建立通信。连接成功后,系统自动以 500ms 周期刷新实时数据,界面上温度、压力、转速等数值实时跳动。

右侧控制区点击「启动」按钮,PLC 对应线圈置位,设备开始运行,状态指示灯变为绿色;点击「停止」按钮,线圈复位,设备停机,指示灯变灰。底部日志区实时记录所有操作与通信状态,便于排查问题。


七、扩展方向

在此基础上,可进一步扩展以下功能:

  • 历史数据存储(SQLite / SQL Server)
  • 趋势曲线图表(使用 Chart 控件)
  • 报警弹窗与报警记录
  • 用户权限管理
  • 参数配方管理
  • 报表导出打印

源码

关注评论或回复【888】得:《WinForms工控上位机全套源码(单项目完整版+15套实战项目)》