2012-04-13 2 views
0

Я конвертирую форму Windows из VB в C#, и я столкнулся с ошибкой, когда попытался выполнить синхронизированное чтение моих тегов OPC.Значение Не попадает в ожидаемый диапазон. (Ошибка выполнения)

У меня этот код:

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() считывает информацию о стоимости, качества и метки времени для одного или нескольких элементов в группе. и возвращаемый тип выглядит следующим образом:

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

Выполнение этого кода дает мне ошибку в названии, Значение не попадает в ожидаемый диапазон. Любые идеи о том, что я могу делать неправильно здесь?

Мозговой штурм прочь!

+3

Пожалуйста, добавьте исключение с StackTrace, показывает, какая строку номер_строка ссылается. –

+2

Где находится ClHandle? – Henrik

+0

похоже, что ClHandle никогда не устанавливается, поэтому он начинается с 0, затем вы вычитаете 1 из него, что оставит вам индекс массива -1, который не является допустимым индексом. – pstrjds

ответ

2

Это живое!

Это фиксированный код:

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

Было бы неплохо, если бы вы объяснили, в чем проблема, и каково решение в вашем ответе. – bambams