2017-09-25 4 views
0

Utilisation de Visual Studio Community 2017 et AdvancedHMI pour créer une application IHM basée sur PC. J'ai plusieurs courir sans problème, donc passer à quelque chose de nouveau. Sur chaque ligne j'ai 7 tableaux (500 nombres réels chaque tableau) et je voudrais capturer ces données quotidiennement et enregistrer dans Excel. En utilisant EPPlus et AdvancedHMI j'ai le code suivant.Exception levée: 'System.IndexOutOfRangeException' dans EPPlus.dll

Private Sub DataSubscriber1_DataChanged(sender As Object, e As Drivers.Common.PlcComEventArgs) Handles DataSubscriber1.DataChanged 
    If e.ErrorId = 0 AndAlso e.Values.Count > 0 AndAlso e.Values(0) = "True" Then 
     Console.WriteLine("About to read the data") 
     Dim MyValues() As String = EthernetIPforCLXCom1.Read("VCell_1A_FES_Cycle_Average[0]", 500) 
     Console.WriteLine(MyValues.Length & "elements read.") 

     '* Transfer the values to Excel 
     Using ExcelPackage As New OfficeOpenXml.ExcelPackage(New System.IO.FileInfo("c:\Data.xlsx")) 
      For I = 0 To MyValues.Length - 1 
       Console.WriteLine("Element " & I & "=" & MyValues(I)) 
       ExcelPackage.Workbook.Worksheets(1).Cells(1, I + 1).Value = MyValues(I) 

      Next 
     End Using 
    End If 
End Sub 

L'exécution de ce déclenchement et mon tag vale pour exécuter le datascriber je reçois ce qui suit.

A propos de lire les données

500Elements lire.

élément 0 = 87,945

Exception Jeté: « System.IndexOutOfRangeException » dans EPPlus.dll

Tout semble que cela devrait fonctionner, mais je suis très nouveau à VB ou tout type de codage pour que matière. Mon fort 'est la logique à relais PLC.

Merci.

+0

Essayez d'écrire une valeur de test (pas du tableau) au fichier Excel avant la ligne '* Transférer les valeurs Excel'. Est-ce que vous obtenez toujours l'exception hors de portée? Sinon, arrêtez d'écrire les valeurs dans le fichier Excel de votre boucle et écrivez simplement les valeurs dans la console. Est-ce que ça marche? –

+0

Merci, quand je serai au travail ce soir, je vais essayer. – Bobby5184

+0

J'ai été en mesure d'écrire le tableau de 500 étiquettes à la console sans problème. J'ai modifié ma boucle et tout fonctionne bien maintenant. Merci. – Bobby5184

Répondre

0

Voici ce que je travaille. Le Datascriber a une étiquette de déclenchement dans l'automate. Une fois qu'il est déclenché, il recueille les données du tableau, tous les 500 éléments. Crée un nouveau fichier Excel et écrit les données à la colonne A, cellules 1-500

Private Sub DataSubscriber1_DataChanged(sender As Object, e As Drivers.Common.PlcComEventArgs) Handles DataSubscriber1.DataChanged 

    If e.ErrorId = 0 AndAlso e.Values.Count > 0 AndAlso e.Values(0) = "True" Then 
     Console.WriteLine("About to read the data") 
     Dim MyValues() As String = EthernetIPforCLXCom1.Read("VCell_1A_FES_Cycle_Average[0]", 500) 
     Console.WriteLine(MyValues.Length & "elements read.") 

     Transfer the values to Excel 

     Using ExcelPackage As New OfficeOpenXml.ExcelPackage(New IO.FileInfo("C:\Data.xlsx")) 
      ExcelPackage.Workbook.Worksheets.Add("test") 
      For Index = 0 To MyValues.Length - 1 
       Console.WriteLine("Element " & Index & "=" & MyValues(Index)) 
       Dim ws As OfficeOpenXml.ExcelWorksheet = ExcelPackage.Workbook.Worksheets(1) 
       Console.WriteLine("Worksheet OK") 
       Dim CellNum As String = "A" & (Index + 1) 
       ws.Cells(CellNum).Value = MyValues(Index) 
      Next 
      ExcelPackage.Save() 
     End Using 
    End If 
End Sub