1. 项目概述与核心价值
在工业自动化领域,上位机与PLC的稳定通信是数据采集与监控系统的基础设施。这个项目完整实现了从设备层到信息层的全链路数据流转:通过C#开发的上位机程序与西门子S7系列PLC建立通信,实时采集设备数据并存储到SQL数据库,最终通过数据库报表查询和报警历史功能形成闭环。这套方案特别适合中小型制造企业的设备监控场景,既能满足实时性要求(通信周期可控制在100ms以内),又能提供完整的数据追溯能力。
我曾在某汽车零部件生产线实施过类似系统,实测单台工控机可稳定对接32台S7-1200 PLC,日均处理20万条数据记录。相比传统的组态软件方案,自主开发的C#程序具有更好的扩展性和定制灵活性,比如可以轻松集成MES系统的工单下发功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 通信链路搭建与数据采集
2.1 硬件连接与协议选型
西门子PLC通常支持以下通信方式:
- S7协议(以太网):最常用,支持S7-1200/1500等新型PLC
- MPI/DP(串口):旧型号PLC使用
- OPC UA:跨平台方案但需要额外授权
推荐使用S7NetPlus库(GitHub开源)实现S7协议通信,其优势在于:
csharp复制// 初始化PLC连接
var plc = new Plc(CpuType.S71200, "192.168.0.1", 0, 1);
plc.Open(); // 建立连接
关键参数说明:
- CpuType.S71200:根据实际PLC型号选择
- 第三个参数为机架号(Rack),默认0
- 第四个参数为槽号(Slot),S7-1200通常为1
2.2 数据块(DB)地址映射
西门子PLC的数据通常存储在DB块中,需要预先规划地址映射表:
| PLC地址 | C#变量名 | 数据类型 | 注释 |
|---|---|---|---|
| DB1.DBW0 | MotorSpeed | Int | 电机转速(rpm) |
| DB1.DBD2 | Temperature | Real | 加热温度(℃) |
| DB1.DBX6.0 | RunStatus | Bool | 运行状态 |
读取数据的典型代码:
csharp复制// 批量读取多个变量
var result = plc.ReadBytes(DataType.DataBlock, 1, 0, 10);
int speed = result.GetIntAt(0);
float temp = result.GetRealAt(2);
