# DoNetSCADA
**Repository Path**: SSBC/do-net-scada
## Basic Information
- **Project Name**: DoNetSCADA
- **Description**: PLC 数据秒上屏!基于 .NET 的轻量级 SCADA 开源方案(支持能源/供热场景)
- **Primary Language**: C#
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: https://mp.weixin.qq.com/s/VJ1eRaI59NU6JhB-8Al5mw
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-01-22
- **Last Updated**: 2026-01-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[《PLC 数据秒上屏!基于 .NET 的轻量级 SCADA 开源方案(支持能源/供热场景)》](https://mp.weixin.qq.com/s/VJ1eRaI59NU6JhB-8Al5mw)
> 声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!
## 前言
工业自动化领域,SCADA(数据采集与监控系统)是连接物理设备与数字世界的桥梁。尤其在清洁能源、供热、水处理等场景中,实时监控设备状态、远程控制阀门水泵、记录历史数据,已成为保障系统安全高效运行的关键。
本文将推荐一个基于 WinForms 开发的清洁能源 SCADA 系统,虽界面简洁,却功能完整,集成了 PLC 通信、实时数据显示、设备控制、用户管理与历史查询于一体,是一个典型的中小型工业监控应用示例。
## 项目介绍
项目主要用于监控和控制一套供热或锅炉系统。它通过 S7.NET 库与西门子 PLC(如 S7-300/1200/1500)建立通信,读取压力、温度、液位等传感器数据,并允许操作员远程启停水泵、开关阀门。
系统采用 WinForms 开发桌面客户端,支持无边框自定义窗口、用户权限管理、参数配置、数据持久化到 SQL Server,并提供历史数据查询功能,适用于小型供热站、分布式能源站等场景。
## 项目功能
1、PLC 连接管理:支持配置 IP 地址、CPU 类型、机架号、插槽号,一键启动/停止通信。
2、实时数据监控:动态显示进/出水压力与温度、锅炉压力/温度/液位、水罐液位等关键参数,并通过仪表盘、液位控件可视化呈现。
3、设备远程控制:可独立控制进水泵、加水泵、燃气泵、循环泵的启停,以及出水阀的开关。
4、用户权限管理:支持多用户登录,不同角色可分配不同操作权限(当前实现基础增删改查)。
5、历史数据查询:按时间范围查询并展示历史记录,便于故障回溯与能效分析。
6、系统配置持久化:PLC 连接参数保存在本地 ini 文件中,重启后自动加载。
## 项目特点
**轻量实用**:不依赖大型框架,核心逻辑清晰,适合部署在工控机或现场操作站。
**强交互性**:所有设备状态实时刷新,控制操作即时反馈,界面元素(如阀门颜色、LED 指示灯)直观反映系统状态。
**安全防护**:关键操作(如关闭窗体、删除用户、开关阀门)均加入确认提示,防止误操作。
**可维护性强**:代码结构模块化,PLC 通信、数据库操作、UI 更新分离,便于后续扩展(如接入更多设备类型或报警功能)。
**本地化友好**:全中文界面,符合国内工业用户操作习惯。
## 项目技术
1、后端逻辑基于 .NET Framework,使用 C# 编写;
2、UI 层采用 WinForms,配合自定义控件(如 LED 指示灯、仪表盘、液位波形图)提升可视化效果;
3、PLC 通信通过开源库 **S7.Net** 实现,支持西门子 S7 系列;
4、数据存储使用 **SQL Server**,通过 ADO.NET 封装数据访问层;
5、配置信息以 **INI 文件**形式本地存储,简单可靠。
6、整个技术栈成熟稳定,开发门槛低,适合中小型团队快速交付。
## 项目代码
```cs
///
/// 打开PLC连接
///
public void OpenPLC()
{
if (this.s7netlib == null)
{
this.s7netlib = new Plc(CpuType, IPAddress, Rack, Slot);
}
if (!this.s7netlib.IsConnected)
{
this.s7netlib.ReadTimeout = 1000;
this.s7netlib.WriteTimeout = 1000;
this.s7netlib.Open();
}
}
///
/// 关闭PLC连接
///
public void ClosePLC()
{
if (this.s7netlib != null && this.s7netlib.IsConnected)
{
this.s7netlib.Close();
}
}
///
/// 写入单个数据
///
/// 地址
/// 数值
public void WriteDataToPLC(string varAddress,object varValuee)
{
OpenPLC();
lock (this)
{
this.s7netlib.Write(varAddress, varValuee);
}
}
///
/// 从PLC中批量读取数据
///
/// 存储区类型
/// DB号
/// 开始字节地址
/// 读取的数量
/// 返回字节数组
public byte[] ReadDataFromPLC(DataType dataType, int db, int startByteAdr, int count)
{
OpenPLC();
lock (this)
{
byte[] result = this.s7netlib.ReadBytes(dataType, db, startByteAdr, count);
return result;
}
}
```
## 项目效果
主界面以蓝色科技风为主,顶部显示当前登录用户,左侧为设备控制区(带开关按钮),中部为实时数据仪表盘,右侧为状态指示灯和关键参数标签。
启动系统后,PLC 数据每秒刷新一次,仪表指针随之跳动,液位控件动态波动。点击"历史查询"可弹出新窗口,选择时间范围后以表格形式展示历史记录,并自动编号行号。
系统登录

系统主页


历史查询

参数设置

用户管理

## 项目源码
项目源码结构清晰,主要包含以下模块:
- `FrmMain`:主窗体,负责 PLC 连接、数据读取、UI 更新与设备控制。
- `FrmParamSet`:PLC 参数配置窗口,支持修改 IP、CPU 类型等并保存至 ini 文件。
- `FrmUserManage`:用户管理界面,实现增删改查功能。
- `FrmHistoryQuery`:历史数据查询窗口,支持时间范围筛选。
- 服务类:如 `PLCDataService`(封装 S7 通信)、`SqlDataService`(数据库操作)、`PlcInfoService`(配置读写)等。
代码已完整实现异常处理、事件解绑防抖、UI 线程安全更新等工业软件必备细节,具备良好的工程参考价值。
GitHub:https://github.com/ssfffzz/HeatingControlProject
## 总结
能源 SCADA 系统虽未使用前沿 Web 技术或云平台,却牢牢抓住了工业现场的核心需求:**稳定、可靠、易用**。它证明了在特定场景下,WinForms + S7.NET + SQL Server 的组合依然具有强大生命力。
对于学习工业通信、理解 SCADA 架构、或需要快速搭建本地监控系统的开发来说,这是一个极具参考价值的实战项目。
未来可在此基础上增加报警推送、能效分析、多站点聚合等功能,逐步演进为更完整的能源管理平台。
## 关键词
SCADA、WinForms、S7.NET、PLC通信、实时监控、清洁能源、工业自动化、C#、SQL Server、数据可视化