在工业自动化领域,设备数据的可靠采集、处理与上报是构建智能监控系统的基石。面对不同品牌PLC、多样化的通信协议、较高的开发门槛以及复杂的部署环境,开发者常常感到无从下手。是否存在一种工具,能够通过图形化界面轻松配置设备连接,灵活定义数据处理逻辑,并将结果稳定地推送至远程服务器?
本文将详细介绍一个基于WPF的轻量级工业边缘网关项目。它是一个面向工业边缘场景、可配置化的数据采集与转发平台,旨在解决上述痛点。
项目简介
DCS是一个运行在Windows环境下的边缘网关软件,核心功能是连接本地PLC设备(如西门子S7系列)。它通过可视化界面配置设备、数据点位(Tag)和触发流程,并将按条件采集到的数据上报至指定的HTTP服务器。
系统采用模块化设计,核心逻辑与操作系统界面解耦,支持通过标准的JSON配置文件来管理整个项目结构。这种设计使其非常适合部署在局域网内的工控机或边缘服务器上,充当可靠的数据“中转站”。
核心功能
- 设备连接管理:支持基于HSL库的S7协议设备接入,Modbus和OPC UA协议支持正在开发中。
- Tag点位配置:以树形结构组织设备、组与节点,支持无限嵌套分组,节点为最终的数据采集点。
- 条件触发流程:定时轮询Tag数值,当满足预设条件(例如数值在10–20之间)时,自动触发HTTP请求。
- 数据上报机制:将任务上下文中所有相关节点的值打包成字典,通过HTTP POST请求发送给远程服务器。
- 多模式日志:支持文件日志和数据库日志两种模式,便于系统调试与运行审计。
- HTTP服务扩展:内置HTTP服务接口,允许外部程序远程读取或写入Tag值,实现双向通信与控制。
- 跨节点协同:通过“附加Tag”和“附加回写”机制,可以灵活引用其他分组的数据,增强了流程编排的灵活性。

项目特点
- 配置驱动与低代码:最大特点是无需编写代码。用户只需在UI界面中创建设备、定义Tag、设置触发条件,即可完成一套完整的数据采集与上报逻辑。
- 逻辑清晰,易于管理:“宿主节点”的概念清晰界定了任务的上下文范围。所有配置以JSON格式存储,便于进行版本管理和批量部署,这与其他后端 & 架构项目中的配置管理思想相通。
- 轻量专注:不追求大而全的复杂平台,而是牢牢聚焦于“可靠采集 + 按需上报”这一工业边缘核心场景,确保解决方案的简洁与高效。
系统架构说明
软件整体分为四大模块:
- Core:核心运行引擎,包含设备通信、任务调度、条件判断等所有业务逻辑,与UI层完全解耦。
- UI:基于WPF实现的界面层,提供设备管理、Tag配置、任务编辑等可视化交互功能,是前端 & 移动技术在工业桌面应用上的体现。
- Device:设备驱动层,目前已集成HSL库的S7通信实现。
- Server:服务扩展层,当前提供了HTTP服务,未来计划加入OPC UA服务器。
项目底层依赖HSL(High-Speed Library)进行高性能S7通信,使用NLog组件记录日志,配置文件采用清晰易读的标准JSON格式。
界面与功能速览
程序主界面布局直观,主要分为四大功能区:

- 设备连接:用于配置PLC等现场设备的通信参数。支持添加多个设备,并在设备下以树形结构无限嵌套组(Group)和节点(Tag)。
- 日志:配置日志输出方式,支持文件日志和数据库日志,可设置日志级别、存储路径等。
- 服务:扩展服务模块,当前已实现HTTP服务,可通过API远程读写Tag值,便于外部系统集成。
- 定时任务:定义数据采集与处理流程的核心区域。可设置定时轮询指定Tag,并根据条件触发HTTP上报动作。
快速配置指南
1. 创建新项目
点击菜单栏【文件】→【创建】,系统会自动生成初始项目,包含默认的文件日志和HTTP读写服务。
2. 添加设备与Tag
展开“设备连接”节点,点击【添加设备】并选择类型(如test)。在设备下右键选择【新建组】创建分组,在目标组下通过右键【模板】→【创建开工】快速生成一组预设Tag。


3. 配置定时任务
在“定时任务”节点上右键,选择【模板】→【创建开工】,即可生成一个默认任务。该任务会定时轮询其“宿主节点”下的所有一级子节点,并根据每个节点设定的判断条件顺序触发逻辑。

4. 理解“宿主节点”概念
宿主节点是每个定时任务的上下文作用域。触发条件、回写操作默认只能引用该宿主节点下的Tag。如需跨组引用数据,需使用以下扩展机制:
- 附加 Tag:将其他组的Tag值加入HTTP请求参数。
- 附加触发条件:组合其他组的Tag值进行联合判断。
- 附加回写设置:支持从HTTP响应中提取值,或直接读取其他Tag的值回写到设备。

5. 测试HTTP上报
可以运行一个简易的HTTP测试服务器(项目中的test/WebTest目录提供了示例)。示例代码结构清晰,便于对接测试。

6. 启动与验证
保存配置文件后,点击【启动】按钮。打开【工具】→【节点监视器】,在PLC的对应标志位输入模拟值(如10),即可观察触发效果。

所有宿主节点下的一级子节点值会被封装进paramDic参数字典中。如果Tag设置了“参数名称”,该名称将作为键出现在请求体中。
核心代码片段
以下展示了项目中类型转换与值处理的部分核心逻辑:
static S7ValueConvert(){
var basetype = typeof(BaseTypeDefine);
TypeDic = basetype.Assembly.GetTypes().Where(g => basetype.IsAssignableFrom(g))
.Where(g => !g.IsAbstract)
.Select(g => (BaseTypeDefine)Activator.CreateInstance(g)!)
.ToDictionary(g => g.ValueType);
}
public bool CanConvertType(SystemValueTypeEnum source, object param, BaseTagConfig systemConfig, out string err){
err = null;
var totype = ConvertDefaultType(param, null, systemConfig);
if (totype != source)
err = $"无法转换 [{param}]-->[{source}] 失败";
return err == null;
}
public object Convert2Device(object source, NodeRelationship param, BaseTagConfig systemConfig){
var deviceConfig = param.NodeInfo.Get<S7TagConfig>(NodeInfoDefine.CONNECT_OTHER_TAG_CONFIG);
if (!TypeDic.TryGetValue(deviceConfig.DeviceValueType, out var typeHandler))
throw new Exception($"[{deviceConfig.DeviceValueType}]未支持");
return typeHandler.Convert2DeviceValue(source, systemConfig);
}
项目源码与总结
该项目采用C#与WPF开发,结构清晰,核心逻辑集中在Core层,便于理解和二次开发。其设计思路成熟,适用于需要快速部署的工业现场环境。
DCS并非一个通用的工业物联网云平台,而是一个专注、务实、可快速落地的边缘侧工具。它没有复杂的云原生架构,也不强调AI分析,而是踏踏实实地解决了“如何将PLC数据按预设规则可靠传出”这一高频刚需。
对于自动化项目集成、产线数字化改造或工业通信学习而言,它提供了一种低成本和高效的解决方案。如果你正在为设备协议适配或灵活的数据上报逻辑而困扰,这个基于WPF的轻量级边缘网关或许是一个值得尝试的选择。