编辑
2025-11-30
C#
00

目录

简介
环境准备
安装 Libplctag 和 LibplctagWrapper
安装 Libplctag
安装 LibplctagWrapper
基本用法
引用命名空间
创建标签(Tag)
读取标签值
写入标签值
详细示例
示例 1:读取和写入整数(DINT)标签
示例 2:读取布尔(BOOL)标签
示例 3:读取字符串(STRING)标签
示例 4:读取数组
示例 5:读取自定义结构(UDT)
高级功能
异步操作
批量读取和写入
自定义通信超时和重试
错误处理
释放资源
常见问题
问题 1:无法连接到 PLC
问题 2:读取或写入返回超时
参考资料
总结

简介

在工业自动化领域,PLC(可编程逻辑控制器)广泛用于控制和监控设备。为了让计算机程序与 PLC 进行通信,我们需要使用特定的协议和库。Libplctag 是一个用于与 Allen-Bradley 和 Rockwell PLC 通信的开源 C 库,而 LibplctagWrapper 是其在 .NET 平台上的封装,使得 C# 开发者可以方便地与 PLC 进行数据交换。

本文将详细介绍如何在 C# 项目中使用 LibplctagWrapper,与 PLC 进行通信。我们将涵盖从安装、基本用法到高级功能的各个方面,并提供丰富的代码示例。

环境准备

在开始之前,确保您的开发环境满足以下要求:

  • Visual Studio 2022或更高版本
  • .NET Framework 4.6 或更高版本,或 .NET Core/.NET 6+
  • 访问目标 PLC 的网络连接
  • 安装 Libplctag 库

安装 Libplctag 和 LibplctagWrapper

安装 Libplctag

  1. 下载预编译的二进制文件

    前往 Libplctag 的发行版页面,下载适用于您的系统的预编译库。

image.png 2. 将库添加到项目中

将下载的库文件(如 `plctag.dll`)拷贝到您的项目目录,并确保在构建时能够找到该库。

安装 LibplctagWrapper

通过 NuGet 包管理器安装:

  • 打开 Visual Studio,在 “工具” 菜单中选择 “NuGet 包管理器” -> “管理解决方案的 NuGet 包”
  • 搜索 “Libplctag”,然后点击 “安装”

或使用包管理器控制台:

PowerShell
Install-Package Libplctag

image.png

基本用法

引用命名空间

在代码文件顶部添加以下引用:

C#
using libplctag.DataTypes.Simple; using libplctag;

创建标签(Tag)

标签(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}"); }

详细示例

示例 1:读取和写入整数(DINT)标签

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("写入成功"); }

示例 2:读取布尔(BOOL)标签

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}"); }

示例 3:读取字符串(STRING)标签

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}"); }

示例 4:读取数组

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]}"); } }

示例 5:读取自定义结构(UDT)

首先,定义一个与 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() { /* 初始化参数 */ }) { // 读取或写入操作 }

常见问题

问题 1:无法连接到 PLC

解决方案:

  • 确保 PLC 的 IP 地址和路径正确。
  • 检查防火墙设置,确保通信端口未被阻挡。
  • 验证 PLC 是否启用了外部通信。

问题 2:读取或写入返回超时

解决方案:

  • 增加标签的超时时间。
  • 检查网络连接质量。
  • 确认 PLC 中的标签名称和数据类型是否正确。

参考资料

总结

通过使用 LibplctagWrapper,C# 开发者可以方便地与 Allen-Bradley 和 Rockwell 的 PLC 进行通信。本文详细介绍了如何安装、使用该库,并提供了丰富的示例代码,涵盖了从基本读写操作到高级功能。希望本文能帮助您在项目中成功地集成 PLC 通信功能。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!