OPC client一次性读取多个item值报错

我用的是opcAutomation连接opc server,读取item的值,但是当我选择多个item时,
会报数组索引超出界限的异常。
图片说明
图片说明

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Collections;
using OPCAutomation;
using MySql.Data.MySqlClient;

namespace OPC测试通过
{
public partial class MainFrom : Form
{
public MainFrom()
{
InitializeComponent();
}

    #region 私有变量
    /// <summary>
    /// OPCServer Object
    /// </summary>
    OPCServer KepServer;
    /// <summary>
    /// OPCGroups Object
    /// </summary>
    OPCGroups KepGroups;
    /// <summary>
    /// OPCGroup Object
    /// </summary>
    OPCGroup KepGroup;
    /// <summary>
    /// OPCItems Object
    /// </summary>
    OPCItems KepItems;
    /// <summary>
    /// OPCItem Object
    /// </summary>
    OPCItem KepItem;
    /// <summary>
    /// 主机IP
    /// </summary>
    string strHostIP = "";
    /// <summary>
    /// 主机名称
    /// </summary>
    string strHostName = "";
    /// <summary>
    /// 连接状态
    /// </summary>
    bool opc_connected = false;
    /// <summary>
    /// 客户端句柄
    /// </summary>
    int itmHandleClient = 0;
    /// <summary>
    /// 服务端句柄
    /// </summary>
    int itmHandleServer = 0;
    #endregion

    #region 方法
    /// <summary>
    /// 枚举本地OPC服务器
    /// </summary>
    private void GetLocalServer()
    {
        //获取本地计算机IP,计算机名称
        IPHostEntry IPHost = Dns.Resolve(Environment.MachineName);
        if (IPHost.AddressList.Length > 0)
        {
            strHostIP = IPHost.AddressList[0].ToString();
        }
        else
        {
            return;
        }
        //通过IP来获取计算机名称,可用在局域网内
        IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP);
        strHostName=ipHostEntry.HostName.ToString();

        //获取本地计算机上的OPCServerName
        try
        {
            KepServer = new OPCServer();
            object serverList = KepServer.GetOPCServers(strHostName);

            foreach (string turn in (Array)serverList)
            {
                cmbServerName.Items.Add(turn);
            }

            cmbServerName.SelectedIndex = 5;
            btnConnServer.Enabled = true;
        }
        catch(Exception err)
        {
            MessageBox.Show("枚举本地OPC服务器出错:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);
        }

    }
    /// <summary>
    /// 创建组
    /// </summary>
    private bool CreateGroup()
    {
        try
        {
            KepGroups = KepServer.OPCGroups;
            KepGroup = KepGroups.Add("mygroup");
            SetGroupProperty();
            KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);

            KepItems = KepGroup.OPCItems;
        }
        catch (Exception err)
        {
            MessageBox.Show("创建组出现错误:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);
            return false;
        }
        return true;
    }
    /// <summary>
    /// 设置组属性
    /// </summary>
    private void SetGroupProperty()
    {
        KepServer.OPCGroups.DefaultGroupIsActive =Convert.ToBoolean(txtGroupIsActive.Text);
        KepServer.OPCGroups.DefaultGroupDeadband = Convert.ToInt32(txtGroupDeadband.Text);
        KepGroup.UpdateRate = Convert.ToInt32(txtUpdateRate.Text);
        KepGroup.IsActive = Convert.ToBoolean(txtIsActive.Text);
        KepGroup.IsSubscribed =Convert.ToBoolean(txtIsSubscribed.Text);
    }
    /// <summary>
    /// 列出OPC服务器中所有节点Item
    /// </summary>
    /// <param name="oPCBrowser"></param>
    private void RecurBrowse(OPCBrowser oPCBrowser)
    {
        //展开分支
        oPCBrowser.ShowBranches();
        //展开叶子
        oPCBrowser.ShowLeafs(true);
        foreach (object turn in oPCBrowser)
        {
            comboBox1.Items.Add(turn.ToString());
            comboBox2.Items.Add(turn.ToString());
            comboBox3.Items.Add(turn.ToString());
        }
        comboBox1.SelectedIndex = 0;
        comboBox2.SelectedIndex = 0;
        comboBox3.SelectedIndex = 0;
        button1.Enabled = true;
    }
    /// <summary>
    /// 获取服务器信息,并显示在窗体状态栏上
    /// </summary>
    private void GetServerInfo()
    {
        tsslServerStartTime.Text ="开始时间:"+ KepServer.StartTime.ToString()+"    ";
        tsslversion.Text ="版本:"+ KepServer.MajorVersion.ToString() + "." + KepServer.MinorVersion.ToString()+"."+KepServer.BuildNumber.ToString();
    }
    /// <summary>
    /// 连接OPC服务器
    /// </summary>
    /// <param name="remoteServerIP">OPCServerIP</param>
    /// <param name="remoteServerName">OPCServer名称</param>
    private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName)
    {
        try
        {
            KepServer.Connect(remoteServerName, remoteServerIP);

            if (KepServer.ServerState == (int)OPCServerState.OPCRunning)
            {
                tsslServerState.Text = "已连接到-" + KepServer.ServerName + "   ";
            }
            else
            {
                //这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档
                tsslServerState.Text = "状态:" + KepServer.ServerState.ToString() + "   ";
            }
        }
        catch (Exception err)
        {
            MessageBox.Show("连接远程服务器出现错误:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            return false;
        }
        return true;
    }
    #endregion

    #region 事件
    /// <summary>
    /// 写入TAG值时执行的事件
    /// </summary>
    /// <param name="TransactionID"></param>
    /// <param name="NumItems"></param>
    /// <param name="ClientHandles"></param>
    /// <param name="Errors"></param>

    /// <summary>
    /// 连接数据库
    /// </summary>
    MySqlConnection connectMySql()
    {
        MySqlConnection conn;
        string constr = "server=localhost;User Id=root;password=123;Database=aotewei";
        conn = new MySql.Data.MySqlClient.MySqlConnection(constr);
        return conn;
    }
    /// <summary>
    /// 每当项数据有变化时执行的事件
    /// </summary>
    /// <param name="TransactionID">处理ID</param>
    /// <param name="NumItems">项个数</param>
    /// <param name="ClientHandles">项客户端句柄</param>
    /// <param name="ItemValues">TAG值</param>
    /// <param name="Qualities">品质</param>
    /// <param name="TimeStamps">时间戳</param>
    void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
    {
        MySqlConnection conn = connectMySql();
        MySqlCommand cmd;
        conn.Open();
        //为了测试,所以加了控制台的输出,来查看事物ID号
        //Console.WriteLine("********"+TransactionID.ToString()+"*********");

            this.txtTimeStamps1.Text = TimeStamps.GetValue(1).ToString();
            this.txtTagValue1.Text = ItemValues.GetValue(1).ToString();
            this.txtQualities1.Text = Qualities.GetValue(1).ToString();
            this.txtTagValue2.Text = ItemValues.GetValue(2).ToString();
            //cmd = conn.CreateCommand();
            //cmd.CommandText = "insert into test2(list1,list2,list3)VALUES(@list1,@list2,@list3)";
            //cmd.Parameters.AddWithValue("@list1", ItemValues.GetValue(i).ToString());
            //cmd.Parameters.AddWithValue("@list2", Qualities.GetValue(i).ToString());
           // cmd.Parameters.AddWithValue("@list3", TimeStamps.GetValue(i).ToString());
            //cmd.ExecuteNonQuery();
            //conn.Close();

    }
    /// <summary>
    /// 选择列表项时处理的事情
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>

    /// <summary>
    /// 载入窗体时处理的事情
    /// </summary>
    private void MainFrom_Load(object sender, EventArgs e)
    {
        GetLocalServer();
    }
    /// <summary>
    /// 关闭窗体时处理的事情
    /// </summary>
    private void MainFrom_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (!opc_connected)
        {
            return;
        }

        if (KepGroup != null)
        {
            KepGroup.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
        }

        if (KepServer != null)
        {
            KepServer.Disconnect();
            KepServer = null;
        }

        opc_connected = false;
    }
    /// <summary>
    /// 【按钮】设置
    /// </summary>
    private void btnSetGroupPro_Click(object sender, EventArgs e)
    {
        SetGroupProperty();
    }
    /// <summary>
    /// 【按钮】连接OPC服务器
    /// </summary>
    private void btnConnLocalServer_Click(object sender, EventArgs e)
    {
        try
        {
            if (!ConnectRemoteServer(txtRemoteServerIP.Text,cmbServerName.Text))
            {
                return;
            }

            btnSetGroupPro.Enabled = true;

            opc_connected = true;

            GetServerInfo();

            RecurBrowse(KepServer.CreateBrowser());

            if (!CreateGroup())
            {
                return;
            }
        }
        catch (Exception err)
        {
            MessageBox.Show("初始化出错:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
    /// <summary>
    /// 【按钮】选择item
    /// </summary>
    private void button1_Click(object sender, EventArgs e)
    {
        itmHandleClient = 1234;
        KepItems.AddItem(comboBox1.SelectedItem.ToString(), itmHandleClient);
        itmHandleClient++;
        KepItems.AddItem(comboBox2.SelectedItem.ToString(), itmHandleClient);
       itmHandleClient++;
      KepItems.AddItem(comboBox3.SelectedItem.ToString(), itmHandleClient);
       // itmHandleClient++;
       // KepItems.AddItem(comboBox4.SelectedItem.ToString(), itmHandleClient);
       // itmHandleClient++;
       // KepItems.AddItem(comboBox5.SelectedItem.ToString(), itmHandleClient);
       // itmHandleClient++;
       // KepItems.AddItem(comboBox6.SelectedItem.ToString(), itmHandleClient);
    }
    #endregion


}

}