编辑
2025-09-28
C#
00

目录

安装
基本用法
创建连接
连接
读取短整型数据
读取整型数据
读取浮点型数据
读取布尔型数据
批量读
写入数据
高级用法
使用长连接
错误处理
结论

IoTClient是一个功能强大的.NET库,用于与各种工业设备和PLC进行通信。在本文中,我们将重点介绍如何使用IoTClient库与罗克韦尔(Allen-Bradley)PLC进行通信,并提供多个详细的示例。

安装

首先,我们需要通过NuGet包管理器安装IoTClient库。在Visual Studio中,可以使用以下命令:

C#
Install-Package IoTClient

或者在项目中添加以下包引用:

XML
<PackageReference Include="IoTClient" Version="1.0.30" />

以下例子是在IotClient 源代码下引用项目测试。

仿真用的还是IotClientTool

image.png

基本用法

创建连接

要与罗克韦尔PLC通信,我们首先需要创建一个AllenBradleyClient实例:

C#
using IoTClient.Clients.AllenBradley; // 创建客户端实例,指定PLC的IP地址和端口 AllenBradleyClient client = new AllenBradleyClient("127.0.0.1", 44818);

连接

C#
// 创建客户端实例,指定PLC的IP地址和端口 AllenBradleyClient client = new AllenBradleyClient("127.0.0.1", 44818); client.Open(); if (client.Connected) { Console.WriteLine("连接成功!"); } else { Console.WriteLine("连接失败!"); }

读取短整型数据

C#
// 读取短整型数据 var shortResult = client.ReadInt16("A1"); if (shortResult.IsSucceed) { Console.WriteLine($"A1的值为:{shortResult.Value}"); } else { Console.WriteLine($"读取失败:{shortResult.Err}"); }

image.png

读取整型数据

C#
var intResult = client.ReadInt32("B10"); if (intResult.IsSucceed) { Console.WriteLine($"B10的值为:{intResult.Value}"); } else { Console.WriteLine($"读取失败:{intResult.Err}"); }

image.png

读取浮点型数据

Markdown
var floatResult = client.ReadFloat("C20"); if (floatResult.IsSucceed) { Console.WriteLine($"C20的值为:{floatResult.Value}"); } else { Console.WriteLine($"读取失败:{floatResult.Err}"); }

image.png

读取布尔型数据

C#
// 读取布尔型数据 var boolResult = client.ReadBoolean("X0"); if (boolResult.IsSucceed) { Console.WriteLine($"X0的状态为:{boolResult.Value}"); } else { Console.WriteLine($"读取失败:{boolResult.Err}"); }

image.png

批量读

在源代码中,批量读写都没有相应的实现。

image.png

简单实现,这个批量根上还是一个个读取,这块比不上SIEMENS S7.net中的按byte批量。

C#
public Result<Dictionary<string, object>> BatchRead(Dictionary<string, DataTypeEnum> addresses, int batchNumber) { var result = new Result<Dictionary<string, object>>(); result.Value = new Dictionary<string, object>(); foreach (var item in addresses) { var address = item.Key; var value = item.Value; object tempVaue = null; switch (value) { //这里可以按单个读写判断是否成功,返回参数再丰富一些。 case DataTypeEnum.Bool: tempVaue = ReadBoolean(address).Value; break; case DataTypeEnum.Int16: tempVaue = ReadInt16(address).Value; break; case DataTypeEnum.Int32: tempVaue = ReadInt32(address).Value; break; case DataTypeEnum.Float: tempVaue = ReadFloat(address).Value; break; default: throw new Exception("Err BatchRead 未定义类型 -1"); } result.Value.Add(address, tempVaue); } return result; }

image.png

写入数据

同样,我们可以向PLC写入数据:

TypeScript
// 写入短整型数据 var writeShortResult = client.Write("A1", (short)100); if (writeShortResult.IsSucceed) { Console.WriteLine("写入A1成功"); } else { Console.WriteLine($"写入A1失败:{writeShortResult.Err}"); } // 写入整型数据 var writeIntResult = client.Write("B10", 1000); // 写入浮点型数据 var writeFloatResult = client.Write("C20", 3.14f); // 写入布尔型数据 var writeBoolResult = client.Write("X0", true);

同样,这个项目中批量的也没实现,方法类似,与我在三菱中的批量写一样,其实也是调整单个写完成的。

高级用法

使用长连接

为了提高性能,特别是在频繁读写的场景下,我们可以使用长连接:

C#
client.Open(); try { // 执行多次读写操作 for (int i = 0; i < 100; i++) { var result = client.ReadInt16($"A{i}"); // 处理结果... } } finally { client.Close(); }

错误处理

在与PLC通信时,错误处理是非常重要的。每个读写操作都会返回一个包含操作结果的对象:

C#
var result = client.ReadInt16("A1"); if (result.IsSucceed) { Console.WriteLine($"读取成功,值为:{result.Value}"); } else { Console.WriteLine($"读取失败,错误信息:{result.Err}"); Console.WriteLine($"请求报文:{result.Requst}"); Console.WriteLine($"响应报文:{result.Response}"); }

结论

IoTClient库为与罗克韦尔PLC通信提供了一个简单而强大的接口。通过本文提供的示例,您应该能够轻松地在自己的C#项目中实现与罗克韦尔PLC的通信。记住要正确处理错误,并在适当的情况下使用长连接和异步操作来优化性能。

希望这篇文章对您有所帮助!如果您有任何问题或需要进一步的说明,请随时询问。

本文作者:技术老小子

本文链接:

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