2016-06-29 73 views
0

Ich erstelle eine OpcGroup mit OpcAutomation, dann füge ich 5 Elemente. Aber ich kann sie nicht in DataChange-Methode.Die Eingabe ist IndexOutofRange Ausnahme .Mein Problem ist, wie man die fünf Variablen in dieser Methode erhält. Danke.Ich erstelle 5 Elemente in opc-Gruppe, aber ich kann sie nicht in DataChange-Methode

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using OPCAutomation; 
using System.Threading; 


namespace WindowsFormsApplication7 
{ 
    public partial class Form1 : Form 
    { 
     #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=new OPCItem[5]; 
     /// <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 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      KepServer = new OPCServer(); 
      try 
      { 
       KepServer.Connect("KEPware.KEPServerEx.V4", "127.0.0.1"); 
       KepGroup = KepServer.OPCGroups.Add("Loading"); 
       SetGroupProperty(); 
       KepItems = KepGroup.OPCItems; 

       itmHandleClient = 1234; 
       KepItem[0] = KepItems.AddItem("Channel_0_User_Defined.Sine.Sine1", itmHandleClient); 
       itmHandleClient++; 
       KepItem[1] = KepItems.AddItem("Channel_0_User_Defined.Sine.Sine2", itmHandleClient); 
       itmHandleClient++; 
       KepItem[2] = KepItems.AddItem("Channel_0_User_Defined.Sine.Sine3", itmHandleClient); 
       itmHandleClient++; 
       KepItem[3] = KepItems.AddItem("Channel_0_User_Defined.Sine.Sine4", itmHandleClient); 
       itmHandleClient++; 
       KepItem[4] = KepItems.AddItem("Channel_0_User_Defined.Sine.Sine5", itmHandleClient); 

       Thread.Sleep(1000); 
       KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange); 
       //itmHandleServer = KepItem.ServerHandle; 
      } 
      catch (Exception) 
      { 

       throw; 
      } 
     } 
     private void SetGroupProperty() 
     { 
      KepServer.OPCGroups.DefaultGroupIsActive = true; 
      KepServer.OPCGroups.DefaultGroupDeadband = 0; 
      KepGroup.UpdateRate = 5000; 
      KepGroup.IsActive = true; 
      KepGroup.IsSubscribed = true; 
     } 

     private void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) 
     { 
      label1.Text = ItemValues.GetValue(1).ToString(); 
      label2.Text = ItemValues.GetValue(2).ToString(); 
      label3.Text = ItemValues.GetValue(3).ToString(); 
      label4.Text = ItemValues.GetValue(4).ToString(); 
      label5.Text = ItemValues.GetValue(5).ToString(); 
     } 
    } 
} 

Error Page

+0

Mit Index 0 statt 1 beginnen? –

+0

@bub Sie haben Recht, das ist ein Fehler. Aber das Problem, dass dieses Event ein Array mit einer variablen Anzahl von Items zwischen 1-5 passieren kann. Das ist der Grund, warum der Op den Fehler beim 3. Item bekommen könnte (weil die Array-Länge nur 3 war) – apr

Antwort

0

Meine Vermutung, dass das Datachange Ereignis für geändert Tags (dieses Ereignis auf diese Weise in der OPC-Spezifikation entwickelt) nur ausgelöst wird. So kann es nur ein Tag oder zwei usw. enthalten.

Sie müssen also NumItems (dies ist die Anzahl der geänderten Tags) überprüfen und die ClientHandles und Itemvalues ​​iterieren.