采用C#WPF语言设计的上位机,与西门子plc通讯,采用MVVMLight框架。 实时显示报警信息,实时趋势图显示,生产数据自动保存到数据库。 实现伺服控制,手动IO控制。
一、项目概述
本项目是一款基于C# WPF技术开发的上位机系统,采用MVVMLight框架实现架构设计,核心功能是与西门子PLC进行高效通信,提供工业生产过程中的数据监控、设备控制、报警管理及数据存储等一站式解决方案。系统基于.NET Framework 4.7.2开发,采用SQLite作为本地数据库,无需复杂配置即可单机运行,同时支持多种数据格式转换、实时可视化及手动操作控制,适用于工业自动化生产场景。
二、技术架构与依赖组件
(一)核心技术栈
| 技术类别 | 具体技术/框架 | 应用场景 |
|---|---|---|
| 开发语言 | C# | 全项目代码开发 |
| 界面框架 | WPF | 上位机可视化界面构建 |
| 架构模式 | MVVM | 通过MVVMLight实现视图与逻辑分离 |
| 通信组件 | Sharp7、S7netplus | 与西门子PLC进行底层通信 |
| 数据库 | SQLite | 生产数据、配置信息本地存储 |
| ORM框架 | EntityFramework 6 | 数据库操作封装 |
| 图表可视化 | LiveCharts.Wpf | 实时趋势图绘制 |
| 工具组件 | NPOI、Extended.Wpf.Toolkit | Excel导出、高级UI控件支持 |
(二)项目结构
项目包含两个核心工程:Carlden.SiemensPLC(上位机主工程)和PlcService(PLC通信服务工程),整体目录结构遵循MVVM架构规范,具体如下:
Carlden.SiemensPLC/ ├─ Base/ // 基础组件(命令、通知、转换器等) ├─ ConvertBase/ // 数据格式转换工具(字节、位、整数转换) ├─ DAL/ // 数据访问层(数据库、Excel、XML操作) ├─ Model/ // 数据模型(产品数据、报警信息等) ├─ MyClass/ // 自定义控件(画布、贝塞尔曲线绘制) ├─ View/ // 视图层(界面布局与控件) ├─ ViewModel/ // 视图模型层(业务逻辑处理) └─ PlcService/ // PLC通信服务(独立工程)三、核心功能模块详解
(一)PLC通信模块
1. 通信原理与实现
基于Sharp7组件实现西门子PLC的S7协议通信,通过PlcService工程封装通信逻辑,采用单例模式确保通信连接的唯一性和稳定性。核心通信类S7PlcService提供连接、断开、数据读写等基础功能:
- 连接机制:支持指定PLC的IP地址、机架号(Rack)和槽号(Slot)建立连接,默认连接地址为
192.168.0.102,可修改为127.0.0.1本地测试; - 数据读取:通过后台线程循环读取PLC的DB块数据(默认读取DB1块,长度276字节),读取频率为10ms/次,确保数据实时性;
- 数据写入:支持M区和DB区的位写入(如控制IO点)及字节数组写入(如参数配置),通过锁机制保证写入操作的线程安全。
2. 关键代码示例
// PLC连接实现 public async void Connect(string Address, int Rack, int Slot) { await Task.Run(()=> { try { if (_plcClent != null) { while (!_plcClent.Connected) { int result = _plcClent.ConnectTo(Address, Rack, Slot); if (result == 0) { new Thread(() => RefreshValues()) { IsBackground = true }.Start(); } Thread.Sleep(500); } } } catch (Exception) { ; } }); } // 循环读取PLC数据 private void RefreshValues() { while (true) { lock (mLock) { if (_plcClent.Connected) { byte[] buffer = new byte[276]; _plcClent.DBRead(1, 0, buffer.Length, buffer); SendDataEvent?.Invoke(buffer); // 触发数据接收事件 Thread.Sleep(10); } } } }(二)数据处理与转换模块
1. 数据转换工具
ConvertBase目录提供三类核心数据转换工具,适配PLC数据格式与上位机显示需求:
- Bit类:实现字节与位数组的相互转换、位状态读取与修改(如判断某个IO点是否激活);
- ByteArray类:提供字节数组的动态管理(添加、清空、批量处理);
- Int类:实现16位整数与字节数组的转换,支持高低字节反转,适配西门子PLC的字节序。
2. 数据解析流程
PLC发送的字节流数据经以下流程处理后供界面展示:
- 从通信缓冲区中按偏移量提取指定长度的字节数据(如压力值占4字节,偏移量30);
- 根据数据类型进行转换(字节数组→浮点数/整数/布尔值),必要时进行高低字节反转;
- 格式化数据(如保留3位小数)后更新到视图模型的属性,通过
INotifyPropertyChanged通知界面刷新。
(三)可视化监控模块
1. 实时趋势图显示
基于LiveCharts.Wpf组件实现4类数据的实时趋势图绘制,支持动态数据刷新与历史数据滚动:
- 数据1:0-100的整数型数据(如转速);
- 数据2:-100-100的整数型数据(如偏差值);
- 数据3:0.00-10.00的浮点型数据(如压力);
- 数据4:布尔型数据(如设备运行状态)。
趋势图默认保留最近10条数据,超出部分自动移除,确保界面流畅性。
2. 生产数据实时展示
通过DataGrid控件展示生产过程中的关键数据,包括产品条码、压力值、厚度、检测结果及时间戳,数据实时同步自PLC,同时自动保存到本地数据库。
(四)设备控制模块
1. 伺服控制
通过ParamSetViewModel实现伺服电机的参数配置与运动控制:
- 支持X/Y轴速度设定、实际速度监控及当前位置显示;
- 提供手动移动功能,可通过界面输入移动距离,或点击画布指定目标位置;
- 实时绘制伺服电机运动轨迹,通过自定义
MyCanvas和MyBezier组件实现位置可视化。
2. 手动IO控制
ManualViewModel提供IO点的手动控制功能,通过鼠标按下/松开事件实现IO点的激活与关闭:
- 鼠标按下时向PLC写入"1",激活对应IO点;
- 鼠标松开时写入"0",关闭IO点;
- 实时同步IO点状态到界面,通过颜色变化(绿色=激活,灰色=未激活)直观展示。
(五)报警管理模块
1. 报警信息读取
通过XmlHelper读取XML配置文件中的报警描述信息,支持报警类型的灵活配置。
2. 实时报警监测与展示
MinitorViewModel实时监测PLC发送的报警状态位,当检测到报警时:
- 记录报警信息与发生时间,存储到字典中;
- 通过委托将报警数据传递给
MessageShow类,更新界面报警列表; - 支持报警状态的实时刷新,报警解除后自动从列表中移除。
(六)数据存储与导出模块
1. 数据库存储
采用SQLite数据库存储生产数据,ProductServices类封装数据库操作:
- 数据插入:生产数据实时写入
Product表,包含条码、压力、厚度、检测结果及时间; - 数据查询:支持按时间范围查询历史生产数据,返回结果集供界面展示。
2. Excel导出
通过ExcelHelper类实现历史数据的Excel导出功能:
- 支持导出为.xls(Excel 2003)、.xlsx(Excel 2007+)及.csv格式;
- 自动格式化Excel表格(表头样式、边框、列宽自适应),支持首行冻结与筛选;
- 导出过程计时,返回导出耗时。
(七)界面交互与导航模块
1. 主界面控制
MainWindow作为主容器,支持窗口最大化、最小化、关闭及皮肤切换功能,通过MVVMLight的Messenger实现视图与视图模型的通信。
2. 页面导航
MainViewModel提供页面切换功能,支持在监控视图、手动控制视图、IO状态视图、参数设置视图及历史数据视图之间快速切换,通过反射机制动态创建视图实例。
四、关键技术亮点
(一)MVVM架构设计
通过MVVMLight框架实现严格的关注点分离:
- 视图(View):仅负责界面展示,不包含业务逻辑;
- 视图模型(ViewModel):处理业务逻辑,通过
INotifyPropertyChanged通知界面更新; - 模型(Model):定义数据结构,封装数据属性;
- 命令(CommandBase):实现界面操作与业务逻辑的解耦,支持按钮点击、鼠标事件等绑定。
(二)线程安全设计
- 通信模块:采用锁机制(
lock)确保PLC数据读写操作的线程安全; - 数据更新:通过
Application.Current.Dispatcher.BeginInvoke在UI线程更新界面,避免跨线程访问异常; - 单例模式:
S7PlcService、GlobalOperation等核心类采用双重检查锁定单例模式,确保全局唯一实例。
(三)灵活的数据适配
- 支持多种数据类型转换(字节、位、整数、浮点数),适配西门子PLC的S7协议数据格式;
- 支持不同Excel版本导出,满足不同用户的使用习惯;
- 报警信息通过XML配置,无需修改代码即可扩展报警类型。
五、部署与配置说明
(一)环境要求
- 操作系统:Windows 7及以上;
- .NET Framework:4.7.2及以上;
- 无需额外安装数据库(SQLite为嵌入式数据库)。
(二)配置修改
- PLC连接配置:修改
GlobalOperation类中的Connect方法参数,将IP地址改为目标PLC的IP(本地测试可改为127.0.0.1); - 报警配置:编辑
systemData\WarningInfo.xml文件,添加或修改报警描述信息; - 数据库路径:默认数据库路径为
DataBase/myDB.db,可在SQLHelp类中修改连接字符串。
(三)编译与运行
- 还原NuGet包:项目依赖的组件通过NuGet管理,编译前需先还原包;
- 编译项目:使用Visual Studio 2017及以上版本编译解决方案;
- 运行程序:直接运行
Carlden.SiemensPLC工程的输出exe文件,无需额外配置即可启动。
六、总结
本上位机系统通过C# WPF与MVVMLight框架的结合,实现了与西门子PLC的高效通信和工业生产的全流程管理。系统具备实时数据监控、设备精准控制、报警及时响应、数据安全存储等核心功能,同时采用模块化设计,具备良好的扩展性和维护性。通过Sharp7通信组件、LiveCharts可视化工具及SQLite数据库的协同工作,确保了系统的稳定性和易用性,可广泛应用于自动化生产线、设备监控等工业场景。
采用C#WPF语言设计的上位机,与西门子plc通讯,采用MVVMLight框架。 实时显示报警信息,实时趋势图显示,生产数据自动保存到数据库。 实现伺服控制,手动IO控制。