C#如何编写一个OPC客户端,读写NI OPC SERVERS

用Unity c#程序连接NI OPC SERVER 这个软件,然后进行数据读写。这么解决啊,需要怎么配置 ni opc server?

using OPCAutomation;//需要手动添加
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;//需要手动添加
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            OPCServer server = new OPCServer();

            //此处127.0.0.1字符串,为本地IP地址,也可别的电脑IP或者电脑名称;此处测试,就以本地IP测试;
            IPHostEntry host = Dns.GetHostEntry("127.0.0.1");

            //获取此电脑上的所有OPC服务器的ProgId,有了它,才能连接到OPC服务器。注意此处为一组OPC服务器集合,

            //而非单个,具体数量根据实际情况而定,当然,也可以是一个,我只是想说它是一个服务器的集合。
            object progIds = server.GetOPCServers(host.HostName);
            foreach (string progId in (Array)progIds)
            {

               //此处是获得单个progId,方便后面连接。
                server.Connect(progId);
            }

            //此处为常规设置,group中还有许多参数没有设置,我都采取了它的默认值,我没有特殊要求,所以不用改。
            OPCGroups groups = server.OPCGroups;
            OPCGroup group = groups.Add("myGroup");
            //此处必须修改,因为默认订阅功能为false;当然你也可以根据别的方式获取数据。

            group.IsSubscribed = true;
            group.DataChange += Group_DataChange;

           //此处为设定需要的ItemIds,就是你需要订阅的哪些数据。

           //具体根据需求而来。
List<string> ItemIds= new List<string>()
                {
                "S7-1200.0-166.BOOL",
                "S7-1200.0-166.BYTE",
                "S7-1200.0-166.INT",
                "S7-1200.0-166.WORD",
                "S7-1200.0-166.REAL",
                };

             //把需要订阅的项添加到group中。

            for (int i = 0; i < ItemIds.Count; i++)
            {
                OPCItem myItem = group.OPCItems.AddItem(ItemIds[i], i);

            }

            Console.ReadKey();
        }

        private static void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        {

            //此处注意i是从1开始,因为getvalue没有0.下面输出分别为数据的ClientHandles(就是上文AddItem方法的第二个参数。),Itemvalue就是值,Qualities为质量,timestamps为时间。
            for (int i = 1; i < NumItems+1; i++)
            {
                Console.WriteLine(ClientHandles.GetValue(i).ToString() + "--" + ItemValues.GetValue(i).ToString() + "--" + Qualities.GetValue(i).ToString() + "--" + TimeStamps.GetValue(i).ToString());
            }
        }
    }
}