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服务器进行通信。你可以根据自己的需求扩展此代码,例如添加更多标签、处理不同类型的数据以及实现更复杂的逻辑。

C# OPC客户端示例:实现数据读取、写入及异步操作

原文地址: https://www.cveoy.top/t/topic/jPta 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录