C# OPC客户端开发指南:附详细代码示例
C# OPC客户端开发指南:附详细代码示例
本指南旨在帮助您使用C#编写一个简单的OPC客户端应用程序,涵盖连接OPC服务器、读取和写入数据、处理异步操作以及异常处理等方面。
1. 项目设置
- 创建一个新的C#控制台应用程序项目。
- 添加对OPC Automation库的引用。
- 在 '解决方案资源管理器' 中,右键单击 '引用',然后选择 '添加引用...'。
- 在 '.NET' 选项卡中,找到 'OPC Automation 2.0' 并添加引用。
2. 代码实现
以下是完整的C#代码示例:
using System;
using System.Collections.Generic;
using OPCAutomation;
namespace OPCClientDemo
{
class Program
{
static OPCServer server;
static OPCGroup group;
static OPCItem item;
static void Main(string[] args)
{
try
{
// 连接到OPC服务器
server = new OPCServer();
server.Connect('Kepware.KEPServerEx.V4', '');
// 创建OPC组
group = server.OPCGroups.Add('Group1');
group.IsActive = true;
group.IsSubscribed = true;
group.UpdateRate = 1000;
group.AsyncReadComplete += OnAsyncReadComplete;
group.AsyncWriteComplete += OnAsyncWriteComplete;
// 添加OPC项
item = group.OPCItems.AddItem('Channel1.Device1.Tag1', 1);
// 同步读取初始值
Console.WriteLine('Initial value of Tag1: {0}', item.Value);
// 异步读取多个项
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, transactionID);
Console.WriteLine('Async read started, transaction ID: {0}', transactionID);
// 异步写入值
object newValue = 123;
int writeTransactionID = group.AsyncWrite(new int[] { item.ServerHandle }, new object[] { newValue }, out Array writeErrors, writeTransactionID);
Console.WriteLine('Async write started, transaction ID: {0}', writeTransactionID);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine('Error: ' + ex.Message);
}
finally
{
// 断开与OPC服务器的连接
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服务器,需要指定服务器的ProgID和主机名。 - 创建OPC组: 使用
OPCGroups.Add()方法创建OPC组,并设置其属性,例如更新频率、是否激活等。 - 添加OPC项: 使用
OPCItems.AddItem()方法将OPC项添加到组中,需要指定项的标识符和客户端句柄。 - 读取OPC数据: 使用
item.Value属性同步读取OPC项的值,或使用group.AsyncRead()方法异步读取多个项的值。 - 写入OPC数据: 使用
group.AsyncWrite()方法异步写入OPC项的值。 - 处理异步操作: 使用事件处理程序
OnAsyncReadComplete和OnAsyncWriteComplete处理异步读取和写入操作的完成事件。 - 异常处理: 使用
try-catch块捕获和处理可能发生的异常。
4. 运行程序
- 编译并运行程序,您应该能够看到从OPC服务器读取的数据以及异步操作的完成消息。
注意:
- 请将代码中的服务器名称
'Kepware.KEPServerEx.V4'替换为实际的OPC服务器名称。 - 将项名称
'Channel1.Device1.Tag1'等替换为实际的OPC项名称。
本指南提供了一个简单的C# OPC客户端示例,您可以根据自己的需求进行扩展和修改。建议您参考OPC Automation库的文档以了解更多高级功能。
原文地址: https://www.cveoy.top/t/topic/jPtm 著作权归作者所有。请勿转载和采集!