2012-04-13 20 views
0

Ich konvertiere ein Windows Form von VB in C# und ich lief in einen Fehler, wenn ich versuchte, ein synchronisiertes Lesen meiner OPC-Tags zu tun.Wert fällt nicht in den erwarteten Bereich. (Runtime Error)

Ich habe diesen Code:

public partial class FrmPartialMain : Form 
{ 
    RsiOPCAuto.OPCServer oOpcServer; 
    RsiOPCAuto.OPCGroup oOpcGroup; 

    int ClHandle; //this is set to 1 in another part of the code. 
    int SvHandle; 


    int OpcDsCashe = 1; 
    int OpcDsDevice = 2; 
    private void cmdSyncRead_Click(object sender, EventArgs e) 
    { 
     int lNumItems = oOpcGroup.OPCItems.Count; // = 3 
     int[] h = new int[lNumItems]; 
     Array arValues = new int[lNumItems]; 
     Array arHandles; 
     Array arErrors; 
     object Qualities; 
     object Timestamps; 


     h[ClHandle - 1] = oOpcGroup.OPCItems.Item(ClHandle).ServerHandle; 
     arHandles = (Array)h; 
     //Error on the next line bellow. 
     oOpcGroup.SyncRead((short)OpcDsDevice, lNumItems, ref arHandles, out arValues, out arErrors, out Qualities, out Timestamps); 


     txtSubValue.Text = Convert.ToString(arValues.GetValue(0)); 
    } 
} 

oOpcGroup.Read() liest den Wert, Qualität und Zeitinformationen für ein oder mehrere Objekte in einer Gruppe. und der Rückgabetyp wie folgt aussieht:

SyncRead(short Source, int NumItems, ref System.Array ServerHandles, out System.Array Values, out System.Array Errors, out object Qualities, out object TimeStamps); 

diesen Code Laufen gibt mir den Fehler im Titel, Ist Wert nicht innerhalb des erwarteten Bereichs. Irgendwelche Ideen, was ich hier falsch machen könnte?

Brainstorm weg!

+3

Bitte fügen Sie die Ausnahme mit Stacktrace an, welche Linie die die Zeilennummer bezieht. –

+2

Wo ist ClHandle? – Henrik

+0

Es sieht so aus, als ob ClHandle nie gesetzt ist, also fängt es bei 0 an, dann subtrahiert man 1 davon, was einen Array-Index von -1 übrigläßt, was kein gültiger Index ist. – pstrjds

Antwort

2

Es lebt!

Dies ist der feste Code:

public partial class FrmPartialMain : Form 
{ 
    RsiOPCAuto.OPCServer oOpcServer; 
    RsiOPCAuto.OPCGroup oOpcGroup; 

    int ClHandle; //this is set to 1 in another part of the code. 
    int SvHandle; 


    int OpcDsCashe = 1; 
    int OpcDsDevice = 2; 
    private void cmdSyncRead_Click(object sender, EventArgs e)                     //Sync Read 
    { 
     int lNumItems = oOpcGroup.OPCItems.Count; 
     int[] arH = new int[1 + lNumItems]; 
     Array arValues = new object[1 + lNumItems]; //<-- This needed to be an object array. 
     Array arHandles; 
     Array arErrors; 
     object Qualities; 
     object Timestamps; 

     arH[ClHandle] = oOpcGroup.OPCItems.Item(ClHandle).ServerHandle; 

     arHandles = (Array)arH; 
     oOpcGroup.SyncRead((short)OpcDsDevice, lNumItems, ref arHandles, out arValues, out arErrors, out Qualities, out Timestamps); 

     txtSubValue.Text = Convert.ToString(arValues.GetValue(1)); 
    } 
} 
+3

Es wäre schön, wenn Sie erklären würden, was das Problem war und was die Lösung in Ihrer Antwort war. – bambams