news 2026/4/25 16:55:28

C# WPF上位机系统:MVVMLight框架下的PLC通讯与伺服控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# WPF上位机系统:MVVMLight框架下的PLC通讯与伺服控制

采用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.ToolkitExcel导出、高级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发送的字节流数据经以下流程处理后供界面展示:

  1. 从通信缓冲区中按偏移量提取指定长度的字节数据(如压力值占4字节,偏移量30);
  2. 根据数据类型进行转换(字节数组→浮点数/整数/布尔值),必要时进行高低字节反转;
  3. 格式化数据(如保留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轴速度设定、实际速度监控及当前位置显示;
  • 提供手动移动功能,可通过界面输入移动距离,或点击画布指定目标位置;
  • 实时绘制伺服电机运动轨迹,通过自定义MyCanvasMyBezier组件实现位置可视化。
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线程更新界面,避免跨线程访问异常;
  • 单例模式:S7PlcServiceGlobalOperation等核心类采用双重检查锁定单例模式,确保全局唯一实例。

(三)灵活的数据适配

  • 支持多种数据类型转换(字节、位、整数、浮点数),适配西门子PLC的S7协议数据格式;
  • 支持不同Excel版本导出,满足不同用户的使用习惯;
  • 报警信息通过XML配置,无需修改代码即可扩展报警类型。

五、部署与配置说明

(一)环境要求

  • 操作系统:Windows 7及以上;
  • .NET Framework:4.7.2及以上;
  • 无需额外安装数据库(SQLite为嵌入式数据库)。

(二)配置修改

  1. PLC连接配置:修改GlobalOperation类中的Connect方法参数,将IP地址改为目标PLC的IP(本地测试可改为127.0.0.1);
  2. 报警配置:编辑systemData\WarningInfo.xml文件,添加或修改报警描述信息;
  3. 数据库路径:默认数据库路径为DataBase/myDB.db,可在SQLHelp类中修改连接字符串。

(三)编译与运行

  1. 还原NuGet包:项目依赖的组件通过NuGet管理,编译前需先还原包;
  2. 编译项目:使用Visual Studio 2017及以上版本编译解决方案;
  3. 运行程序:直接运行Carlden.SiemensPLC工程的输出exe文件,无需额外配置即可启动。

六、总结

本上位机系统通过C# WPF与MVVMLight框架的结合,实现了与西门子PLC的高效通信和工业生产的全流程管理。系统具备实时数据监控、设备精准控制、报警及时响应、数据安全存储等核心功能,同时采用模块化设计,具备良好的扩展性和维护性。通过Sharp7通信组件、LiveCharts可视化工具及SQLite数据库的协同工作,确保了系统的稳定性和易用性,可广泛应用于自动化生产线、设备监控等工业场景。

采用C#WPF语言设计的上位机,与西门子plc通讯,采用MVVMLight框架。 实时显示报警信息,实时趋势图显示,生产数据自动保存到数据库。 实现伺服控制,手动IO控制。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 16:52:34

10分钟搞定QQ签名服务:Windows一键搭建终极指南

10分钟搞定QQ签名服务:Windows一键搭建终极指南 【免费下载链接】Qsign Windows的一键搭建签名api 项目地址: https://gitcode.com/gh_mirrors/qs/Qsign 还在为QQ机器人签名API的复杂配置而烦恼吗?你只需要10分钟,就能拥有一个稳定可靠…

作者头像 李华
网站建设 2026/4/25 16:52:33

期刊论文 AI 赋能新范式:虎贲等考 AI,让投稿更规范、高效、易录用

在科研成果发表竞争愈发激烈的当下,一篇高质量期刊论文,不仅依赖扎实的研究内容,更离不开规范结构、精准文献、专业图表、标准格式的全方位支撑。然而,期刊写作与投稿的重重难题,长期困扰着硕博研究生、高校教师与科研…

作者头像 李华
网站建设 2026/4/25 16:51:58

晨芯阳HC8330,60V, 0.6A, 1.6MHz, 同步,降压直流/直流转换IC

HC8330是一款宽输入范围,易于使用的同步降压稳压器,它可以输出最大0.6A的电流。HC8330采用电流模式控制,提供快速的负载瞬态反应。HC8330具有4.5V 到60V的宽范围输入电压,能应用于大范围电压波动的场合。关断模式下,HC…

作者头像 李华
网站建设 2026/4/25 16:50:19

Strongswan 实现ipsec ikev1 证书pubkey认证

一. Openssl生成证书 (1)CA证书 1. 生成 CA 私钥(4096位 RSA) openssl genrsa -out caKey.pem 40962. 生成自签名 CA 证书(有效期10年) openssl req -x509 -new -key caKey.pem -days 3650 -out caCert.pem…

作者头像 李华
网站建设 2026/4/25 16:49:19

如何在Apple Silicon Mac上运行Windows应用?Whisky轻量级方案详解

如何在Apple Silicon Mac上运行Windows应用?Whisky轻量级方案详解 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 想在Mac上使用Windows专属软件但又不愿安装笨重的虚拟机…

作者头像 李华
网站建设 2026/4/25 16:48:18

COMSOL 5.6集群计算实战:手把手教你用Slurm命令行提交多核任务

COMSOL 5.6集群计算实战:Slurm命令行高效任务提交指南 对于需要处理复杂多物理场仿真或大规模参数化扫描的研究人员来说,图形界面操作往往无法满足高效计算的需求。本文将详细介绍如何通过Slurm作业管理系统,在云平台上以命令行方式提交COMSO…

作者头像 李华