用 C# 对比上位链路直写・KcpX・KV COM+ Library
用三种方式编写同一个处理——从基恩士 KV 系列 PLC 读取 DM100〜DM102:自己发送上位链路命令、.NET 库 KcpX、基恩士的 KV COM+ Library,并比较各自的代码量、准备工作、支持环境与适用场景。
更新
从 C# 读写基恩士 KV 系列 PLC,大致有三种方法:自己发送上位链路命令、使用 KcpX 这样的库,以及使用基恩士的 KV COM+ Library。
本文用这三种方法编写同一个处理,题目是“从通过以太网连接的 PLC 中,以有符号 16 位读取 DM100〜DM102 共 3 个字”。写出来一比较,就能清楚看到每种方法替你承担了什么、又把什么留给了你。
1. 直接编写上位链路
只使用 .NET 标准的 TcpClient。把在命令格式一文中读过的 RDS DM100.S 3 直接作为 ASCII 字符串发送。
using System.Net.Sockets;
using System.Text;
using var client = new TcpClient();
client.Connect("192.168.0.10", 8501);
using var stream = client.GetStream();
// 从 DM100 起以有符号 16 位(.S)连续读取 3 个字
stream.Write(Encoding.ASCII.GetBytes("RDS DM100.S 3\r"));
// 响应以 CR LF 结尾,读取到此为止
var buffer = new List<byte>();
while (buffer.Count < 2 || buffer[^2] != '\r' || buffer[^1] != '\n')
{
int b = stream.ReadByte();
if (b < 0)
throw new IOException("连接已断开");
buffer.Add((byte)b);
}
string response = Encoding.ASCII.GetString(buffer.ToArray()).TrimEnd('\r', '\n');
// E0〜E6 是错误响应
if (response.Length == 2 && response[0] == 'E')
throw new Exception($"PLC 返回了错误: {response}");
// 以空格分隔返回,例如 "+15025 -25400 +00000"
short[] values = response.Split(' ').Select(short.Parse).ToArray();与需要组装二进制报文的 MC 协议不同,上位链路的命令是可读的字符串,因此代码比较短。即便如此,这段代码也只能处理“以 .S 读取 3 个 DM 字”的情况。真正使用时,还需要自己补充下面这些处理:
- 超出单条命令的点数上限(多数软元件为 1000 点,KV Nano 为 256 点等)时,拆分命令发送
- 将
double、long这类由 4 个字组成一个值的数据,从各个字组装起来 - 处理 R、MR 这类“通道+2 位位编号”的软元件,以及 B、W 这类十六进制编号的软元件
- 拆解定时器・计数器“触点,当前值,设定值”格式的响应
- 没有响应时的超时处理,以及之后的重新连接
要理解命令的内容,这是最好的方法。但如果要嵌入应用程序,就需要自己测试以上所有处理。
2. 使用 KcpX
从 NuGet 添加 KcpX,编写同样的处理。
using KcpXLib;
using KcpXLib.Enums;
using var kcpx = new KcpX("192.168.0.10", 8501);
short[] values = kcpx.BatchRead<short>(Prefix.DM, "100", 3);第 1 节中组装命令与解析响应的工作,由 BatchRead<short> 这一行承担。把类型换成 int 或 double,数据格式(.L 或 .D)的选择与字的组装也由 KcpX 完成。超出点数上限的读取,会按照构造函数 series 中指定的 PLC 系列的上限自动拆分发送。
PLC 返回错误时会抛出 HostLinkException,通过 ErrorCode 属性可以取出错误代码(E0〜E6)。没有响应时会抛出 TimeoutException,使用 TCP 时会关闭连接,以免把迟到的旧响应误认为下一条响应。
KcpX 纯粹用 .NET 编写,因此除了 Windows,也能在 Linux・macOS 上运行。相应地,它支持的通信路径只有以太网(TCP/UDP)上的上位链路和 KV STUDIO 仿真器。对象 PLC 为 KV-8000/7000/5000 系列和 KV Nano(经由 KV-NC1EP)。
3. 使用 KV COM+ Library
KV COM+ Library 是基恩士提供的 Windows 通信库,以 ActiveX 控件的形式提供。产品页面介绍它可以在 Visual Basic・Visual C++・Excel・Access 中使用。使用前需要购买并安装产品,再把控件添加到 Visual Studio 的工具箱或引用中。
using AxDATABUILDERAXLibLB;
using DATABUILDERAXLibLB;
var plc = new AxDBCommManager();
plc.CreateControl();
plc.PLC = DBPlcId.DBPLC_DKV5000; // 要连接的 PLC 机型
plc.Peer = "192.168.0.10:8500"; // 连接目标(IP 地址:端口)
plc.Connect();
try
{
int[] values = new int[3];
for (int i = 0; i < values.Length; i++)
values[i] = Convert.ToInt32(plc.ReadDevice(DBPlcDevice.KV5000_DM, (100 + i).ToString()));
}
finally
{
plc.Disconnect();
}这段代码只使用了从公开的使用示例中能确认的 DBCommManager 控件的 PLC・Peer 属性和 Connect・Disconnect・ReadDevice 方法,因此是逐点读取的。一次读取多个点的方法、返回值的类型与数据格式的指定、错误的获取方式,请查阅 KV COM+ Library 的用户手册。
PLC 机型用 DBPlcId 枚举指定,软元件用 DBPlcDevice 枚举指定。公开的使用示例中,端口指定的不是上位链路的 8501,而是 8500。
KV COM+ Library 的优势在于对象机型与周边功能的广度。产品页面列出的对象机型从 KV-8000 一直到 KV-1000・KV-700 各代,以及 KV Nano 系列。此外还包含用于定期读取软元件的 DBDeviceManager 和仪表等显示用控件。把 PLC 数据导入 Excel 的 KV COM+ for Excel 也是同一系列的产品。
另一方面,它只能在 Windows 上运行,并且需要购买产品才能使用。
三者对比
| 上位链路直写 | KcpX | KV COM+ Library | |
|---|---|---|---|
| 需要添加的内容 | 无(.NET 标准) | NuGet 程序包 KcpX | 安装产品并引用 ActiveX 控件 |
| 连接目标的指定 | 在代码中写 IP 与端口 | 在构造函数中指定 IP 与端口 | PLC(机型)与 Peer(连接目标)属性 |
| 运行的操作系统 | 能运行 .NET 的环境 | Windows・Linux・macOS | Windows |
| 开发环境 | .NET | .NET 7〜9、.NET Framework 4.6.1+、.NET Core 2.0+ | Visual Basic、Visual C++、Excel、Access |
| 对象 PLC | 支持上位链路的机型 | KV-8000/7000/5000 系列、KV Nano、KV STUDIO 仿真器 | KV-8000〜KV-700 各代、KV Nano |
| 值的类型 | 自己从字符串转换 | 以类型指定 bool・short・int・float・double 等 | 以枚举指定软元件(详情见手册) |
| 错误处理 | 自己判定 E0〜E6 | 异常(HostLinkException) | 见手册 |
| 单次可指定的点数 | 超出上限需自己拆分 | 超出上限自动拆分 | 见手册 |
| 许可证 | — | MIT(免费・可商用) | 付费(按许可购买) |
如何选择
选择时考虑下面三个问题,按顺序回答,大多数情况下就能确定。
1. 是否要连接 KV-1000・KV-700 等旧一代 PLC
KcpX 的对象是 KV-8000/7000/5000 系列和 KV Nano。要连接更早一代的 PLC,请选择对象机型中包含它们的 KV COM+ Library。
2. 是否在 Windows 以外运行
接下来考虑运行环境。在 Linux 服务器、Docker 容器、Raspberry Pi、macOS 开发机上运行,请选择 KcpX。KV COM+ Library 只能在 Windows 上运行。
3. 如何考虑分发与许可
如果在 Windows 上运行,KcpX 和 KV COM+ Library 都能实现。这时的决定因素是应用的开发与分发方式。
- 适合 KcpX 的情况:新用 C# 开发的应用、分发到大量电脑的应用、提供给公司外部的应用。MIT 许可证免费,而且只需 NuGet 引用就会包含在应用中,无需在每台电脑上安装
- 适合 KV COM+ Library 的情况:已有基于 KV COM+ 的 VB 或 Excel 资产的应用,或想直接使用仪表等显示用控件的内部工具
常见场景
| 场景 | 选择 |
|---|---|
| 在 Linux 服务器上采集工厂运行数据,并显示在 Web 仪表板上 | KcpX |
| 在 Docker 中运行把 PLC 数据发送到云端的网关 | KcpX |
| 在 CI 中以 KV STUDIO 仿真器为对象自动测试梯形图的动作 | KcpX |
| 从现有的 Excel 或 VB 工具读取 KV-1000 的数据 | KV COM+ Library |
| 从 C# 以外的语言或单片机与 PLC 通信 | 直写(本入门中的命令知识) |
无论选择哪种,直写的知识都有用
实际系统很少从命令开始自己实现。但只要了解命令格式,即使在使用库时也能追查问题原因:用 Wireshark 查看通信时,能看懂每个字符的含义,也能明白 PLC 返回的 E0、E1 指的是什么。命令格式与错误响应两篇文章提供了这些知识。
出处
- 基恩士 KV-EP21V/KV-8000(A)/KV-7500/KV-5500/KV-NC1EP 用户手册 EtherNet/IP 功能(日文版)第 8 章 p.8-2〜8-7, 8-17〜8-22, 8-36
- 基恩士产品页面「KV COM+ library:1 许可 KV-DH1L」(支持的操作系统・开发环境・对象机型)