在工业自动化领域,PLC(可编程逻辑控制器)广泛用于控制和监控设备。为了让计算机程序与 PLC 进行通信,我们需要使用特定的协议和库。Libplctag 是一个用于与 Allen-Bradley 和 Rockwell PLC 通信的开源 C 库,而 LibplctagWrapper 是其在 .NET 平台上的封装,使得 C# 开发者可以方便地与 PLC 进行数据交换。
本文将详细介绍如何在 C# 项目中使用 LibplctagWrapper,与 PLC 进行通信。我们将涵盖从安装、基本用法到高级功能的各个方面,并提供丰富的代码示例。
在开始之前,确保您的开发环境满足以下要求:
下载预编译的二进制文件
前往 Libplctag 的发行版页面,下载适用于您的系统的预编译库。
2. 将库添加到项目中
将下载的库文件(如 `plctag.dll`)拷贝到您的项目目录,并确保在构建时能够找到该库。
通过 NuGet 包管理器安装:
或使用包管理器控制台:
PowerShellInstall-Package Libplctag

在代码文件顶部添加以下引用:
C#using libplctag.DataTypes.Simple;
using libplctag;
标签(Tag)是与 PLC 中的数据点交互的主要方式。创建一个标签需要指定通信参数,例如 PLC 类型、IP 地址、路径和要访问的数据地址。
C#// 创建一个读取 PLC 中名为 'MyTag' 的标签
var tag = new TagDInt()
{
Gateway = "192.168.0.1", // PLC 的 IP 地址
Path = "1,0", // 通信路径
PlcType = PlcType.ControlLogix, // PLC 类型
Name = "MyTag" // 标签名称
};
C#// 读取标签值
var status = tag.Read();
if (status == LibPlcTag.Status.Ok)
{
Console.WriteLine($"标签值: {tag.Value}");
}
else
{
Console.WriteLine($"读取失败,错误码: {status}");
}
C#// 设置要写入的值
tag.Value = 1234;
// 写入标签值
var status = tag.Write();
if (status == LibPlcTag.Status.Ok)
{
Console.WriteLine("写入成功");
}
else
{
Console.WriteLine($"写入失败,错误码: {status}");
}
C#// 创建 DINT 类型的标签
var dintTag = new TagDInt()
{
Gateway = "192.168.0.1",
Path = "1,0",
PlcType = PlcType.ControlLogix,
Name = "DINT_Tag"
};
// 读取值
var readStatus = dintTag.Read();
if (readStatus == LibPlcTag.Status.Ok)
{
Console.WriteLine($"读取的值: {dintTag.Value}");
}
// 修改值并写入
dintTag.Value += 10;
var writeStatus = dintTag.Write();
if (writeStatus == LibPlcTag.Status.Ok)
{
Console.WriteLine("写入成功");
}
C#// 创建 BOOL 类型的标签
var boolTag = new TagBool()
{
Gateway = "192.168.0.1",
Path = "1,0",
PlcType = PlcType.ControlLogix,
Name = "Bool_Tag"
};
// 读取值
var status = boolTag.Read();
if (status == LibPlcTag.Status.Ok)
{
Console.WriteLine($"布尔值: {boolTag.Value}");
}
C#// 创建 STRING 类型的标签
var stringTag = new TagString()
{
Gateway = "192.168.0.1",
Path = "1,0",
PlcType = PlcType.ControlLogix,
Name = "String_Tag"
};
// 读取值
var status = stringTag.Read();
if (status == LibPlcTag.Status.Ok)
{
Console.WriteLine($"字符串值: {stringTag.Value}");
}
C#// 创建一个长度为 10 的整数数组标签
var dintArrayTag = new TagDIntArray()
{
Gateway = "192.168.0.1",
Path = "1,0",
PlcType = PlcType.ControlLogix,
Name = "DINT_Array_Tag",
ElementCount = 10 // 指定数组长度
};
// 读取数组值
var status = dintArrayTag.Read();
if (status == LibPlcTag.Status.Ok)
{
for (int i = 0; i < dintArrayTag.Value.Length; i++)
{
Console.WriteLine($"数组元素 {i}: {dintArrayTag.Value[i]}");
}
}
首先,定义一个与 PLC 中 UDT 结构对应的 C# 类:
C#public class MyCustomStruct
{
public int IntegerValue { get; set; }
public bool BooleanValue { get; set; }
public string StringValue { get; set; }
}
然后,使用 TagStruct 来读取该结构:
C#var structTag = new TagStruct<MyCustomStruct>()
{
Gateway = "192.168.0.1",
Path = "1,0",
PlcType = PlcType.ControlLogix,
Name = "Custom_Struct_Tag"
};
// 读取结构体
var status = structTag.Read();
if (status == LibPlcTag.Status.Ok)
{
var value = structTag.Value;
Console.WriteLine($"整型值: {value.IntegerValue}");
Console.WriteLine($"布尔值: {value.BooleanValue}");
Console.WriteLine($"字符串值: {value.StringValue}");
}
LibplctagWrapper 支持异步读取和写入操作,可提高应用程序的性能。
C#// 异步读取标签值
await dintTag.ReadAsync();
Console.WriteLine($"异步读取的值: {dintTag.Value}");
// 异步写入标签值
dintTag.Value = 5678;
await dintTag.WriteAsync();
Console.WriteLine("异步写入完成");
对于需要同时读取/写入多个标签的情况,可以使用批量操作。
C#var tags = new List<TagBase>
{
new TagDInt() { /* 初始化参数 */ },
new TagBool() { /* 初始化参数 */ },
new TagString() { /* 初始化参数 */ }
};
// 批量读取
foreach (var tag in tags)
{
tag.Read();
}
// 处理读取的值
C#dintTag.Timeout = 5000; // 设置超时时间为 5000 毫秒
dintTag.Retries = 3; // 设置重试次数为 3
var status = dintTag.Read();
在与 PLC 通信时,可能会遇到各种错误。LibplctagWrapper 提供了详细的状态码,可以根据返回的 status 进行判断。
C#var status = dintTag.Read();
if (status != LibPlcTag.Status.Ok)
{
Console.WriteLine($"读取错误,状态码: {status}");
// 根据状态码执行相应的错误处理
}
使用完标签后,建议释放其资源。
C#dintTag.Dispose();
或者在 using 语句中使用:
C#using (var dintTag = new TagDInt() { /* 初始化参数 */ })
{
// 读取或写入操作
}
解决方案:
解决方案:
通过使用 LibplctagWrapper,C# 开发者可以方便地与 Allen-Bradley 和 Rockwell 的 PLC 进行通信。本文详细介绍了如何安装、使用该库,并提供了丰富的示例代码,涵盖了从基本读写操作到高级功能。希望本文能帮助您在项目中成功地集成 PLC 通信功能。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!