在工业自动化领域,上位机软件常常需要对接多种品牌、多种协议的 PLC 设备。传统做法是为每台设备硬编码通信参数和数据解析逻辑,一旦设备增减或配置变更,就需要重新编译并发布程序,维护成本高且灵活性差。那么,是否存在一种方式,能让设备接入变得像“搭积木”一样简单呢?
本文将介绍一种基于成熟的 HslCommunication 通信库,通过 XML 配置文件来驱动设备连接与数据采集的方案,它能让 PLC 接入变得可配置、可扩展,甚至可视化。
项目介绍
这是一个开源的 C# 类库,专注于工业设备(尤其是 PLC)的配置管理与数据读取。其设计理念并非重复造轮子,而是深度整合 HslCommunication.dll 的强大通信能力,将设备类型、IP 地址、寄存器地址、数据解析规则等信息抽象为结构化的 XML 配置。
开发者只需维护一份配置文件,即可动态加载任意数量的设备节点,并自动启动数据轮询、解析与分发服务。
项目功能
1、支持多层级设备组织
通过 NodeClass 可以构建“工厂-车间-设备”的树形逻辑结构,便于管理复杂的现场设备层级。
2、灵活的设备配置
支持 Modbus TCP、西门子 S7、三菱 MC 等主流工业协议,并可配置 IP、端口、站号、字节序等关键参数。
3、自定义数据解析规则
通过 RegularNode 可以定义数据块中各字段的名称、偏移量、数据类型(如温度、转速、开关量),从而实现原始字节到具体业务对象的精确映射。
4、内置服务器能力
启动服务后,系统会自动按照预设的 CaptureInterval 间隔轮询设备,并将解析后的数据以 JSON 格式提供给客户端。
5、多后端集成示例
除基础的 SampleServer 外,项目还提供了将数据持久化到 Redis,以及将数据发布为 OPC UA 服务等高级集成场景的示例。
项目说明
这是一个设备及节点配置类库,基于 HslCommunication.dll 深度整合创建,用于实现对 PLC 配置信息的存储、加载和解析,同时支持可配置化的 PLC 数据读取与结果展示。
主要提供的服务器示例如下:
SampleServer
这是一个简单的控制台应用程序,演示了如何启动一个核心服务器。你可以基于此示例,轻松迁移到 WinForm 或 WPF 应用程序中。
RedisServer
此示例演示了如何创建一个服务器,并将读取到的所有数据存入 Redis 中。详细说明见下文。
OpcUaServer
由于 OPC UA 在工业控制领域应用广泛,此处也集成了该示例,采用了最新 1.4.354.0 版本的库实现。主要难点在于数据解析与节点创建,具体可参照下文说明。
可以通过 NuGet 安装核心库:
Install-Package SharpNodeSettings
如何使用
服务器和客户端的构建都围绕一个核心的 XML 配置文件展开。
一个典型的 XML 配置内容示例如下:
<?xml version="1.0" encoding="utf-8"?>
<Settings>
<NodeClass Name="Devices" Description="所有的设备的集合对象">
<NodeClass Name="分厂一" Description="">
<NodeClass Name="车间一" Description="">
<DeviceNode Name="测试空设备" Description="此设备安装在角落,编号0001" DeviceType="0" ConnectTimeOut="2000" CreateTime="2018/8/12 9:26:27" InstallationDate="2018/8/12 9:26:27">
<DeviceRequest Name="数据请求" Description="一次完整的数据请求" Address="0" Length="10" CaptureInterval="1000" PraseRegularCode="B" />
</DeviceNode>
</NodeClass>
<NodeClass Name="车间二" Description="">
<DeviceNode Name="ModbusTcp客户端" Description="这是描述" DeviceType="10" ConnectTimeOut="1000" CreateTime="2018/8/9 19:58:49" InstallationDate="2018/8/9 19:58:49" IpAddress="127.0.0.1" Port="502" Station="1" IsAddressStartWithZero="true" IsWordReverse="false" IsStringReverse="false">
<DeviceRequest Name="数据请求" Description="一次完整的数据请求" Address="0" Length="30" CaptureInterval="1000" PraseRegularCode="ABCD" />
</DeviceNode>
</NodeClass>
</NodeClass>
<NodeClass Name="分厂二" Description="位于西南方">
<NodeClass Name="车间三" Description="">
<DeviceNode Name="测试设备二" Description="这是测试设备二的描述" DeviceType="10" ConnectTimeOut="1000" CreateTime="2018/8/10 23:01:28" InstallationDate="2018/8/10 23:01:28" IpAddress="127.0.0.1" Port="502" Station="1" IsAddressStartWithZero="true" IsWordReverse="false" IsStringReverse="false">
<DeviceRequest Name="数据请求" Description="一次完整的数据请求" Address="100" Length="10" CaptureInterval="500" PraseRegularCode="B" />
</DeviceNode>
</NodeClass>
</NodeClass>
</NodeClass>
<NodeClass Name="Server" Description="所有挂载的服务器">
<ServerNode Name="异形服务器" Description="这是一个异形服务器" CreateTime="2018/8/8 13:29:30" Port="1234" ServerType="2" Password="" />
</NodeClass>
<NodeClass Name="Regular" Description="所有的解析规则的信息">
<RegularNode Name="ABCD" Description="">
<RegularItemNode Name="温度" Description="" Index="0" TypeCode="3" TypeLength="1" />
<RegularItemNode Name="风俗" Description="" Index="2" TypeCode="9" TypeLength="1" />
<RegularItemNode Name="转速" Description="" Index="14" TypeCode="9" TypeLength="1" />
<RegularItemNode Name="机器人关节" Description="" Index="18" TypeCode="9" TypeLength="6" />
<RegularItemNode Name="cvsdf" Description="" Index="42" TypeCode="9" TypeLength="1" />
<RegularItemNode Name="条码" Description="条码信息" Index="6" TypeCode="11" TypeLength="8" />
<RegularItemNode Name="开关量" Description="设备的开关量信息" Index="368" TypeCode="1" TypeLength="8" />
</RegularNode>
<RegularNode Name="B" Description="">
<RegularItemNode Name="温度" Description="" Index="0" TypeCode="3" TypeLength="1" />
<RegularItemNode Name="压力" Description="" Index="2" TypeCode="3" TypeLength="1" />
</RegularNode>
</NodeClass>
</Settings>
只要创建好这个 XML 配置文件,就可以通过调用 SharpNodeServer 来创建服务器应用。它会自动解析配置、生成节点信息,并根据配置内容自动请求设备数据并更新。
创建服务器的核心代码非常简单:
SharpNodeServer sharpNodeServer = new SharpNodeServer();
sharpNodeServer.LoadByXmlFile("settings.xml");
sharpNodeServer.ServerStart(12345);
整个过程主要包含三个步骤:实例化服务器对象、加载 XML 配置文件、启动服务器。请注意:加载配置的操作必须在启动服务器之前完成。
如何查看服务器的数据?
项目内置了一个默认的 SimplifyNet 服务器。更多底层细节可参考相关技术博客。
同时,基于 NetSimplifyClient 实现了一个通用的数据节点查看器,只需指定服务器的 IP 地址和端口即可连接:
SharpNodeSettings.View.FormNodeView form = new SharpNodeSettings.View.FormNodeView("127.0.0.1", 12345);
form.ShowDialog();

如果想访问单个数据点,也可以使用 NetSimplifyClient 的 Demo 工具进行测试。注意:此处请求返回的数据均为序列化后的 JSON 字符串。

手动编写如此复杂的 XML 结构显然是低效且容易出错的。因此,本库贴心地提供了一个可视化的配置工具,可以通过以下代码打开配置窗口:
Form nodeSettings = new SharpNodeSettings.View.FormNodeSetting("settings.xml");
nodeSettings.ShowDialog();
上述代码将打开配置窗口,并加载当前目录下的 settings.xml 文件。
你还可以使用另一种方式,以获取用户配置完成后的 XML 数据,这非常适用于远程配置等场景:
using (SharpNodeSettings.View.FormNodeSetting form = new SharpNodeSettings.View.FormNodeSetting(XElement.Load("settings.xml")))
{
if (form.ShowDialog() == DialogResult.OK)
{
// 配置好的数据信息,在这种方式下可以实现远程配置操作
XElement xElement = form.XmlSettings;
MessageBox.Show("success");
}
else
{
MessageBox.Show("failed");
}
}

在实际开发中,如果你不需要完整的树形结构配置功能,而只是想实现单个 PLC 设备信息的可配置化,也可以通过本组件轻松实现:
SharpNodeSettings.View.FormSelectDevice selectDevice = new View.FormSelectDevice();
if (selectDevice.ShowDialog() == DialogResult.OK)
{
XElement xmlDevice = selectDevice.DeviceXml;
// 设备配置对象可用于存储、网络传输等操作
// 通过 XML 信息创建设备核心对象
SharpNodeSettings.Device.DeviceCore deviceCore = SharpNodeSettings.Util.CreateFromXElement(xmlDevice);
// 示例:读取数据(注意:同类型 PLC 使用方便,不同类型 PLC 地址模型差异较大)
HslCommunication.OperateResult<short> read = deviceCore.ReadWriteDevice.ReadInt16("D100");
}
快速开始
按照以下步骤,你可以快速体验本项目的核心功能:
1. 准备真实或模拟设备
- 真实设备:准备一台西门子 PLC、三菱 PLC、欧姆龙 PLC 或标准的 Modbus TCP 设备。
- 模拟设备:如果没有真实设备,可以下载 Modbus 服务器模拟软件(如 ModbusTcpServer.zip),启动后即可模拟一个 Modbus TCP 从站。
2. 配置 XML 信息
进入项目目录下的 \SharpNodeSettings\XmlFile 文件夹,运行 SharpNodeSettings.Tools.exe 进行可视化配置。目录内已包含部分示例配置,如果仅想快速体验,也可暂时跳过此步骤。
3. 运行 SampleServer
重新生成并运行 SampleServer 项目。
如需查看实时数据,可以同时启动 SharpNodeSettings.NodeView 项目进行连接查看。

4. 运行 RedisServer
- 需要先安装 Redis 服务器(Windows 版下载地址)。
- 推荐搭配可视化工具 RedisDesktopManager 查看数据。
- 重新生成并运行
SharpNodeSettings.RedisServer 项目。SharpNodeSettings.NodeView 仍可用于查看实时数据。

5. 运行 OpcUaServer
重新生成并运行 SharpNodeSettings.OpcUaServer 项目。启动时若提示“是否增加信任证书”,请选择“是”。
随后,可启动 OPC UA Client 示例项目,连接到此服务器查看节点数据。

项目源码
项目已在 Gitee 上开源:
总结
本项目并非一个大而全的工业物联网平台,而是一个精准解决“PLC 配置管理”痛点的轻量级工具库。它将复杂的底层通信细节封装起来,同时将灵活的配置能力交还给开发者。对于中小型工控项目、快速原型开发或需要频繁变更设备接入的场景,它能显著提升开发效率和系统的可维护性。如果你正在使用 HslCommunication 进行上位机开发,不妨尝试用本库来管理你的设备列表——或许你会发现,接入十台不同协议的 PLC,真的只需要修改一个 XML 配置文件。当然,如果项目需要更复杂的服务治理和集成架构,也可以考虑将其作为数据采集层,与更上层的 微服务 或数据中台进行对接。