最近在给工厂做工控系统控制,使用的是西门子的S7系列的PLC,索性直接用wpf prism sharp7写了一个s7 plc的调试工具,改工具实现了I区(输入)、Q区(输出)、M区(位存储)和DB区(数据块)的地址读写与监控,软件中的功能已在生产环境中实战过,今天我把这款调试工具分享出来咱们共同学习一下。
一、技术栈
1、.NET 8.0程序运行框架
2、WPF 桌面UI框架
3、Prism MVVM框架
4、Sharp7 S7协议通信
该项目采用单项目结构,所有代码集中在 src/SiemensPlcDebugTool/ 目录下,无需多项目引用或复杂的构建脚本。
二、Sharp7 —— S7通讯的核心
1 什么是Sharp7?
Sharp7 是一个纯C#实现的S7协议通信库,它通过 TCP/IP直接与西门子S7系列PLC通信,无需依赖任何原生DLL或COM组件,真正做到了开箱即用。
支持PLC型号包括:S7-200、S7-300、S7-400、S7-1200、S7-1500 等主流系列。
核心通信逻辑封装在PlcService类中。该类内部维护了一个S7Client实例:
public class PlcService : IPlcService, IDisposable { private readonly S7Client _client = new(); private bool _disposed; public bool IsConnected => _client.Connected; public event EventHandler<ConnectionStateChangedEventArgs>? ConnectionStateChanged; }2. 连接流程
连接PLC的典型流程在 ConnectAsync 方法中:
public async Task ConnectAsync(PlcConnectionConfig config) { ConnectionStateChanged?.Invoke(this, new(ConnectionState.Connecting)); _client.ConnTimeout = config.ConnectTimeoutMs; _client.RecvTimeout = config.ReadTimeoutMs; _client.SendTimeout = config.WriteTimeoutMs; int result = await Task.Run(() => _client.ConnectTo(config.IpAddress, config.Rack, config.Slot)); if (result == 0) { ConnectionStateChanged?.Invoke(this, new(ConnectionState.Connected)); } else { var errorMsg = GetErrorMessage(result); ConnectionStateChanged?.Invoke(this, new(ConnectionState.Error, errorMsg)); throw new PlcException(result, $"连接失败: {errorMsg}"); } }三、S7协议中的PLC地址体系
1、 地址区域
西门子PLC的内存分为多个区域,Sharp7通过 S7Area枚举来区分:
I ---- S7Area.PE ----输入映像区
Q ---- S7Area.PA ----输出映像区
M ---- S7Area.MK ---- 位存储区
DB ---- S7Area.DB ---- 数据块
2、 地址解析器 PlcAddressParser
项目中一个亮点是PlcAddressParser,它负责将工程师习惯的地址字符串(如 I0.0、QW2、MD100、DB1.DBX0.0)解析为结构化的PlcAddress对象。
解析器使用两条正则表达式来覆盖两种地址格式
// DB 区域地址: DB{number}.DB{X|B|W|D}{byteAddr}[.{bitOffset}] private static readonly Regex DbAddressRegex = new( @"^DB(\d+)\.(DBX|DBB|DBW|DBD)(\d+)(?:\.(\d+))?$", RegexOptions.IgnoreCase | RegexOptions.Compiled); // I/Q/M 区域地址: {I|Q|M}[{B|W|D}]{byteAddr}[.{bitOffset}] private static readonly Regex AreaAddressRegex = new( @"^(I|Q|M)(B|W|D)?(\d+)(?:\.(\d+))?$", RegexOptions.IgnoreCase | RegexOptions.Compiled);地址格式约定:
无后缀(如 I0)→ 字节类型(Byte)
后缀 B(如 IB0)→ 字节类型(Byte)
后缀 W(如 QW2)→ 字类型(Word,2字节)
后缀 D(如 MD100)→ 双字类型(DWord,4字节)
带位偏移(如 I0.0)→ 位类型(Bit)
DB块中的 DBX → 位类型,DBB → 字节,DBW → 字,DBD → 双字
四、技术架构深度解析
1 MVVM与Prism.DryIoc
项目采用 Prism 框架来实现MVVM模式,使用 DryIoc作为依赖注入容器。Prism是WPF生态中最成熟的MVVM框架之一,提供了 BindableBase、DelegateCommand、IContainerRegistry等基础设施。
DI注册在 App.xaml.cs 中完成:
protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterSingleton<IPlcService, PlcService>(); containerRegistry.RegisterSingleton<PlcAddressParser>(); containerRegistry.RegisterSingleton<LoggerService>(); containerRegistry.Register<MainViewModel>(); containerRegistry.Register<MainWindow>(); }
SiemensPlcDebugTool是一个典型的工业调试工具,技术选型务实而精准。通过 Sharp7 实现了与西门子PLC的可靠通信,利用 Prism 构建了清晰可维护的WPF桌面界面。如有需要想了解WPF+工业通信,可以下载参考。
五、资源下载
以下地址提供完整的项目源码与西门子s7的技术文档,欢迎点赞、收藏、下载交流,点击分享内容即可下载
夸克网盘分享