2016-06-29 332 views
0

我使用OpcAutomation創建OpcGroup,然後添加5個項目,但我無法在DataChange方法中獲取它們。提示符是IndexOutofRange異常我的問題是如何得到這個方法中的五個變量。謝謝。我在opc組中創建了5個項目,但我無法在DataChange方法中獲取它們

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

從索引0而不是1開始? –

+0

@bub你是對的這是一個錯誤。但是這個事件可能會傳遞一個數組數量在1-5之間的可變數量的問題。這就是op在第三項可能得到錯誤的原因(因爲數組長度只有3) – apr

回答

0

我的猜測是,dataChange事件只爲改變標籤發射(本次活動旨在通過這種方式在OPC規範)。因此,它可能只包含一個標籤,或兩個等。

因此,您需要檢查NumItems(這是更改的標籤的數量),並重復這兩個 ClientHandles和Itemvalues。

相關問題