Qwen2.5-0.5B显存不足?低成本GPU优化方案让利用率提升150%

核心内容摘要

破解技术工具本地化难题:Masa模组全攻略
【2026年版|必收藏】大语言模型入门详解:小白也能看懂的原理与工作机制

SAP ABAP环境搭建避坑指南:如何用二手服务器+SSD低成本搭建稳定练习环境?

采用C#WPF语言设计的上位机与西门子plc通讯采用MVVMLight框架。

实时显示报警信息实时趋势图显示生产数据自动保存到数据库。

实现伺服控制手动IO控制。

项目基础信息与技术框架本项目是一套基于C# WPF开发的西门子PLC上位机系统核心目标是实现与西门子PLC的通信交互同时提供实时监控、设备控制、数据存储与报警管理等功能。

系统采用MVVMLight框架搭建架构遵循MVVM设计模式基于.NET Framework

4.

2开发集成SQLite嵌入式数据库无需额外配置整体为单机运行模式无需客户端部署。

采用C#WPF语言设计的上位机与西门子plc通讯采用MVVMLight框架。

实时显示报警信息实时趋势图显示生产数据自动保存到数据库。

实现伺服控制手动IO控制。

从代码结构来看项目包含两个核心工程Carlden.SiemensPLC上位机主工程负责界面展示、业务逻辑与数据处理和PlcServicePLC通信服务工程负责底层通信协议封装总计78个代码文件模块划分清晰各文件职责明确。

核心工程与关键文件功能解读一PlcService工程PLC通信核心该工程仅含S7PlcService.cs一个核心文件基于Sharp7组件实现西门子PLC的S7协议通信采用单例模式确保通信连接的唯一性与稳定性。

单例实例管理通过GetInstance方法创建全局唯一的通信实例使用双重检查锁定机制lock关键字保证多线程环境下的线程安全避免重复创建连接对象。

PLC连接逻辑Connect方法通过异步任务Task.Run循环尝试与PLC建立连接需传入PLC的IP地址、机架号Rack和槽号Slot。

连接成功后启动后台线程执行RefreshValues方法连接失败时每500毫秒重试一次。

数据读写操作- 数据读取RefreshValues方法在连接状态下循环读取PLC的DB1块数据从偏移量0开始读取长度276字节读取间隔10毫秒通过SendDataEvent事件将读取到的字节数组传递给上层业务模块。

- 数据写入提供两类写入方法一是WriteBit和DBWriteBit用于写入位状态如控制IO点的通断二是DBWrite用于写入字节数组如伺服参数配置均通过lock机制确保写入操作的线程安全。

二Carlden.SiemensPLC工程上位机主程序该工程是上位机的核心按功能划分为基础组件、数据转换、数据访问、数据模型、自定义控件、视图与视图模型七大模块各模块功能如下

Base模块基础组件支撑CommandBase.cs实现ICommand接口封装界面命令逻辑通过DoExecute委托绑定按钮点击、鼠标操作等界面交互事件是MVVM模式中视图与视图模型解耦的关键。

GlobalOperation.cs全局操作类同样采用单例模式。

在构造函数中初始化S7PlcService实例调用Connect方法建立与PLC的连接默认IP为

192.

168.

102可根据“说明.txt”改为

127.

0.

1用于本地测试并订阅SendDataEvent事件接收PLC数据再通过自身的SendDataEvent将数据传递给其他业务模块。

IOStateConvert.cs实现IValueConverter接口将IO点的布尔状态true/false转换为界面显示的颜色激活时为石灰绿Brushes.LimeGreen未激活时为灰色Brushes.Gray用于IO状态监控界面的直观展示。

MessengerExtension.cs对MVVMLight框架的Messenger类进行扩展简化消息的发送与注册流程支持泛型数据传递方便不同模块间的通信如主界面与视图模型间的窗口控制指令传递。

NotifyPropertyBase.cs实现INotifyPropertyChanged接口提供RaisePropertyChanged方法用于属性变更通知Set方法用于统一处理属性赋值与通知逻辑是所有视图模型类的基类确保界面能实时响应数据变化。

ConvertBase模块数据格式转换Bit.cs提供字节与位数组的相互转换、位状态读取与修改功能。

例如ToArray方法将PLC返回的字节数组转换为布尔型位数组用于解析IO状态GetValue方法读取指定字节中某一位的状态SetBit和ClearBit方法用于修改指定位的状态。

ByteArray.cs封装字节数组的动态管理功能提供Add添加单个字节或字节数组、Clear清空数组等方法方便处理PLC通信中的字节数据。

Int.cs实现16位整数与字节数组的转换支持高低字节反转适配西门子PLC的字节序提供FromByteArray字节数组转整数、ToByteArray整数转字节数组等方法用于处理PLC中的整数型数据。

DAL模块数据访问层ExcelHelper.cs负责将生产数据导出为Excel文件支持.xls、.xlsx、.csv三种格式。

通过SaveToExcel方法将ProductModel列表转换为DataTable再创建对应的Excel工作簿与工作表设置表头样式黄色背景、居中对齐、边框和内容样式支持列宽自适应、首行筛选与冻结最后通过文件流写入指定路径。

Helper/SQLHelp.cs封装SQLite数据库的基础操作提供Update执行增删改SQL语句、GetSingleResult获取单一查询结果、GetReader获取结果集读取器方法连接字符串指定数据库路径为“DataBase/myDB.db”无需额外配置数据库服务。

ProductServices.cs针对生产数据的数据库操作封装AddData方法将生产数据条码、压力、厚度等插入Product表QueryData方法根据起始时间与结束时间查询指定时间段的生产数据返回ProductModel列表供界面展示。

XmlHelper.cs读取XML配置文件中的报警信息通过ReadXML方法加载“systemData/WarningInfo.xml”文件解析其中的报警描述内容返回字符串列表为报警管理模块提供配置数据。

Model模块数据模型定义MessageShow.cs管理报警信息的展示逻辑。

在构造函数中获取MinitorViewModel实例订阅其SendData委托接收报警数据包含报警信息与时间的字典再通过UI线程Application.Current.Dispatcher.BeginInvoke更新WarningList集合ObservableCollection用于绑定报警列表界面。

ProductModel.cs定义生产数据模型包含序号Id、条码BarCode、压力Pressure、厚度Thickness、检测结果TestResult、时间Time六个属性对应数据库Product表的字段与界面展示的数据结构。

WarningModel.cs定义报警信息模型包含序号Id、报警内容Message、报警时间AlarmTime三个属性用于封装单条报警数据绑定报警列表界面。

MyClass模块自定义可视化控件MyBezier.cs自定义UI元素用于绘制贝塞尔曲线实现伺服运动轨迹的可视化。

在构造函数中获取ParamSetViewModel实例订阅其Func委托获取伺服位置数据通过CompositionTarget.Rendering事件实时刷新绘制内容DrawBezier方法绘制轨迹点与连线。

MyCanvas.cs自定义画布控件继承自Canvas内部维护DrawingVisual对象用于绘制图形。

plot方法通过UI线程绘制两点间的连线支持伺服运动路径的实时绘制VisualChildrenCount与GetVisualChild方法确保自定义绘制内容能被WPF渲染系统识别。

View模块界面视图该模块包含多个视图文件均为用户控件UserControl仅负责界面布局与控件绑定无业务逻辑。

例如MinitorView.xaml实时监控界面包含DataGrid控件绑定生产数据与趋势图控件绑定实时数据集合ManualView.xaml手动控制界面包含按钮控件绑定手动IO控制命令ParamsSettingView.xaml伺服参数设置界面包含文本框显示/输入参数、自定义画布展示伺服位置HistoryView.xaml历史数据查询界面包含日期选择控件、查询/导出按钮、DataGrid控件展示查询结果。

各视图的后台代码.xaml.cs仅负责初始化界面将DataGrid等控件的ItemsSource绑定到对应视图模型的集合属性如HistoryView绑定HistoryViewModel的ProductsList。

ViewModel模块业务逻辑核心CalculatorViewModel.cs计算器视图模型处理参数输入逻辑。

通过ButtonClick命令响应计算器按钮点击支持数字、小数点输入以及删除←、清空C、确认、取消操作确认后通过SetValueEvent委托将输入值传递给参数设置模块通过NotifyWindowEnent委托控制计算器窗口的显示/隐藏。

HistoryViewModel.cs历史数据视图模型管理历史数据的查询与导出。

BtnSearch命令触发查询操作先校验起始时间与结束时间的合法性结束时间不能小于开始时间再调用ProductServices的QueryData方法获取数据更新ProductsList集合BtnSave命令调用ExcelHelper的SaveToExcel方法将查询结果导出为Excel。

IOViewModel.csIO状态监控视图模型订阅GlobalOperation的SendDataEvent接收PLC数据从字节数组中提取输入I区与输出O区数据转换为布尔型数组IStatus、OStatus通过属性变更通知更新界面IO状态显示。

MainViewModel.cs主界面视图模型负责页面切换与窗口控制。

TabChangedCommand命令根据传入的视图类型字符串通过反射创建对应的视图实例更新MainContent属性实现页面切换WindowsChanged命令通过Messenger发送窗口控制指令最小化、最大化、关闭、切换皮肤与主窗口MainWindow通信。

ManualViewModel.cs手动控制视图模型获取S7PlcService实例并订阅SendDataEvent接收IO状态数据维护OStatus集合更新界面输出状态。

提供MouseDown与MouseUp命令分别在鼠标按下时向PLC写入“1”激活IO点、鼠标松开时写入“0”关闭IO点。

MinitorViewModel.cs实时监控视图模型是业务逻辑最复杂的模块。

获取S7PlcService实例并订阅SendDataEvent解析PLC数据提取压力、厚度、检测结果、报警状态等更新实时数据属性Data

Data2等与趋势图数据集合Data1Collect等监控报警状态位通过Warning方法整理报警信息调用SendData委托传递给MessageShow当检测到生产数据更新时调用ShowDataGrid方法更新界面DataGrid并调用ProductServices的AddData方法将数据存入数据库。

ParamSetViewModel.cs伺服参数设置视图模型获取S7PlcService实例并订阅SendDataEvent解析PLC中的伺服参数X/Y轴速度、位置等更新对应的属性VelocityX、PointionY等提供MouseClick命令触发计算器输入参数MouseDown/MouseUp命令控制伺服运动ClickEvent方法将目标位置数据写入PLC实现伺服定位控制同时通过Func委托将伺服位置数据传递给MyBezier用于轨迹绘制。

ViewModelLocator.cs视图模型定位器基于依赖注入SimpleIoc管理所有视图模型的实例为视图提供统一的视图模型访问入口。

在构造函数中注册所有视图模型类型通过属性如Main、Minitor暴露视图模型实例方便视图绑定。

核心业务流程一PLC通信与数据流转程序启动时GlobalOperation单例初始化调用S7PlcService的Connect方法建立与PLC的连接连接成功后S7PlcService的RefreshValues方法循环读取PLC数据通过SendDataEvent传递给GlobalOperationGlobalOperation通过自身的SendDataEvent将数据传递给IOViewModel、MinitorViewModel等业务模块各模块解析数据更新对应属性通过NotifyPropertyBase的属性变更通知刷新界面。

二生产数据存储与导出MinitorViewModel解析到生产数据更新检测结果标志位激活时调用ShowDataGrid方法更新界面DataGrid并调用ProductServices的AddData方法将数据插入SQLite数据库用户在HistoryView界面选择时间范围并点击“查询”HistoryViewModel调用ProductServices的QueryData方法获取历史数据更新ProductsList集合界面DataGrid实时展示用户点击“导出”按钮HistoryViewModel调用ExcelHelper的SaveToExcel方法将ProductsList数据导出为Excel文件。

三报警管理程序启动时MinitorViewModel调用XmlHelper的ReadXML方法读取XML中的报警配置信息MinitorViewModel解析PLC的报警状态位通过Warning方法整理当前报警信息包含报警内容与时间通过SendData委托将报警数据传递给MessageShowMessageShow更新WarningList集合报警列表界面实时展示。

部署与配置说明环境要求需安装.NET Framework

4.

2及以上版本无需额外安装数据库SQLite为嵌入式数据库PLC连接配置修改GlobalOperation类构造函数中_s7PlcService.Connect的IP参数将默认的

192.

168.

102改为目标PLC的IP本地测试改为

127.

0.

1编译运行通过Visual Studio还原NuGet包依赖包已在packages.config中定义编译解决方案后运行Carlden.SiemensPLC工程的输出exe文件即可启动程序。

免费p站-免费p站应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123