C# OPC客户端示例:实现数据读取、写入及异步操作
C# OPC客户端示例:实现数据读取、写入及异步操作
本博客提供了一个完整的C# OPC客户端示例代码,涵盖了连接OPC服务器、创建组、添加项、同步/异步读取数据、写入数据以及异常处理等功能。
1. 添加OPC Automation引用
在开始之前,确保你的项目中已添加OPC Automation引用。你可以在 NuGet 包管理器中搜索 'OPCAutomation' 并安装它。
2. 代码示例
using System;
using OPCAutomation;
namespace OPCClientDemo
{
class Program
{
static OPCServer server;
static OPCGroup group;
static void Main(string[] args)
{
try
{
// 连接OPC服务器
server = new OPCServer();
server.Connect('Kepware.KEPServerEx.V4', string.Empty);
// 创建OPC组
group = server.OPCGroups.Add('Group1');
group.IsActive = true;
group.IsSubscribed = true;
group.UpdateRate = 1000;
group.AsyncReadComplete += OnAsyncReadComplete;
group.AsyncWriteComplete += OnAsyncWriteComplete;
// 添加OPC项
OPCItem item1 = group.OPCItems.AddItem('Channel1.Device1.Tag1', 1);
Console.WriteLine('Initial value of Tag1: {0}', item1.Value);
// 异步读取Tag2和Tag3的值
OPCItem tag2 = group.OPCItems.AddItem('Channel1.Device1.Tag2', 2);
OPCItem tag3 = group.OPCItems.AddItem('Channel1.Device1.Tag3', 3);
int transactionID = group.AsyncRead(2, new int[] { tag2.ServerHandle, tag3.ServerHandle }, out Array values, out Array errors, 1);
Console.WriteLine('Async read started, transaction ID: {0}', transactionID);
// 异步写入Tag1的值
object newValue = 123;
int writeTransactionID = group.AsyncWrite(new int[] { item1.ServerHandle }, new object[] { newValue }, out Array writeErrors, 2);
Console.WriteLine('Async write started, transaction ID: {0}', writeTransactionID);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine('Error: ' + ex.Message);
}
finally
{
// 断开OPC服务器连接
if (group != null)
{
group.IsActive = false;
server.OPCGroups.Remove('Group1');
}
if (server != null)
{
server.Disconnect();
}
}
}
// 异步读取完成事件处理方法
static void OnAsyncReadComplete(int transactionID, int numItems, ref Array clientHandles, ref Array itemValues, ref Array qualities, ref Array timeStamps, ref Array errors)
{
Console.WriteLine('Async read completed, transaction ID: {0}', transactionID);
for (int i = 1; i <= numItems; i++)
{
Console.WriteLine('Item {0} value: {1}', i, itemValues.GetValue(i));
}
}
// 异步写入完成事件处理方法
static void OnAsyncWriteComplete(int transactionID, int numItems, ref Array clientHandles, ref Array errors)
{
Console.WriteLine('Async write completed, transaction ID: {0}', transactionID);
}
}
}
3. 代码说明
- 连接OPC服务器: 使用
OPCServer对象连接到指定的OPC服务器,本例中使用的是Kepware服务器。 - 创建OPC组: 创建一个
OPCGroup对象,并设置其属性,例如UpdateRate(刷新频率)。 - 添加OPC项: 向组中添加
OPCItem对象,指定要读取或写入的标签。 - 同步读取: 使用
item.Value属性同步读取标签的值。 - 异步读取: 使用
group.AsyncRead方法异步读取标签的值,并在OnAsyncReadComplete事件处理方法中获取结果。 - 异步写入: 使用
group.AsyncWrite方法异步写入标签的值,并在OnAsyncWriteComplete事件处理方法中确认写入操作完成。 - 异常处理: 使用
try-catch块捕获异常并进行处理。 - 断开连接: 最后,断开与OPC服务器的连接,释放资源。
4. 总结
本博客提供了一个简单的C# OPC客户端示例,展示了如何使用OPC Automation库与OPC服务器进行通信。你可以根据自己的需求扩展此代码,例如添加更多标签、处理不同类型的数据以及实现更复杂的逻辑。
原文地址: https://www.cveoy.top/t/topic/jPta 著作权归作者所有。请勿转载和采集!