Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Flex: Scriptarray in DB-Array kopieren

  1. #1
    Registriert seit
    02.08.2006
    Beiträge
    166
    Danke
    11
    Erhielt 10 Danke für 9 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe ein Problem hiermit:

    Code:
    Dim dateistream, fsobject, text_stream, il, temp, fs, i, array_nr, zeile(200), zeileninhalt
    
    Set fsobject = CreateObject("Scripting.FileSystemObject")
    
    HmiRuntime.Screens("uebergabe").ScreenItems("eieruhr").Visible = True
    
    Set dateistream = fsobject.GetFile("D:\1.csv")
    	
    	Set text_stream = dateistream.OpenAsTextStream(1, -2)
    	
    	For il = 1 To SmartTags("Micobox\Index")
    		If text_stream.AtEndOfStream = True Then Exit For
    		temp = text_stream.ReadLine
    	Next
    	
    	For i = 1 To SmartTags("Micobox\Zeilenanzahl")
    		If text_stream.AtEndOfStream = True Then Exit For
    		zeile(i) = text_stream.ReadLine
    	Next
    	If i > SmartTags("Micobox\MaxWerte") Then
    		i = SmartTags("Micobox\MaxWerte")
    	End If
    
    	text_stream.Close
    	For array_nr = 1 To (i-1)
    		zeileninhalt = Split(zeile(array_nr),";",-1,1) 
    		  SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") (array_nr) = zeileninhalt(0)
    	Next
    
    Set dateistream = Nothing
    Set fs = Nothing
    Set fsobject = Nothing
    
    HmiRuntime.Screens("uebergabe").ScreenItems("eieruhr").Visible = False
    soweit funktioniert das ganze ja, allerdings wenn ich SmartTags("Micobox\MaxWerte") und SmartTags("Micobox\Zeilenanzahl") auf einen Wert von über hundert setzte bekomme ich die Meldungen
    Fehler 'Overflow: 'array_nr" in Skript <Var_uebergeben> in Zeile 37
    sowie
    Variable Microbox/Auftrag1_RCV.Auftragsnummern: Überlast, Werte gehen verloren
    ich meine mich zu erinnern das bei einer Änderung in einem Array in einen Script, jedesmal das ganze Array bei jeder Änderung übertragen wird.
    Da ich 200 Werte zu ändern habe und es sich um DINT-Typen handelt, sind das 200x800Byte die er versucht in den DB zu schreiben.

    Mein Gedanke war dann, dass ich die Änderung in einem Scriptarray mache und anschließend das ganze Scriptarray in das DB-Array kopiere.
    Nur wie

    Am besten fände ich es wenn ich das DB-Array erst auf Anforderung aktuallisiere. Allerdings funktioniert
    Code:
    UpdateTag
    ja nicht in Flexible.
    Zitieren Zitieren Flex: Scriptarray in DB-Array kopieren  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.720
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo,
    Fehler 'Overflow: 'array_nr" in Skript <Var_uebergeben> in Zeile 37
    Ist dein Flexibel-Array (nicht das Script-Array) denn auch grpß genug (über 100 Werte) dimensioniert ?

    Variable Microbox/Auftrag1_RCV.Auftragsnummern: Überlast, Werte gehen verloren
    Das interpretiere ich, dass ein 2. Script angestossen wird während das 1. noch läuft ...

    Zitat Zitat von Garog Beitrag anzeigen
    Mein Gedanke war dann, dass ich die Änderung in einem Scriptarray mache und anschließend das ganze Scriptarray in das DB-Array kopiere.
    Nur wie
    Dadurch hast du keinen wirklichen Vorteil.
    Das Problem, dass ich zusätzlich sehe ist, dass du gar nicht weißt, ob die Werte (ganz - nicht teilweise) wirklich schon in der SPS sind.
    Vielleicht solltest du hier mit einer Multiplex-Variablen arbeiten. Hier hast du dann nur eine Variable, deren Index (Pointer in der Steuerung) du entsprechend anpasst.

    Gruß
    LL

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Garog (20.02.2009)

  4. #3
    Garog ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    166
    Danke
    11
    Erhielt 10 Danke für 9 Beiträge

    Standard

    Ist dein Flexibel-Array (nicht das Script-Array) denn auch grpß genug (über 100 Werte) dimensioniert ?


    Ich denke ja doch.

    Das interpretiere ich, dass ein 2. Script angestossen wird während das 1. noch läuft ...
    Habe das Script mal alleine getestet in einem einzelnen Projekt. Genau der selbe Fehler.

    Dadurch hast du keinen wirklichen Vorteil.
    Das Problem, dass ich zusätzlich sehe ist, dass du gar nicht weißt, ob die Werte (ganz - nicht teilweise) wirklich schon in der SPS sind.
    Vielleicht solltest du hier mit einer Multiplex-Variablen arbeiten. Hier hast du dann nur eine Variable, deren Index (Pointer in der Steuerung) du entsprechend anpasst.
    Das muss ich sagen habe ich noch nicht gemacht, daher auch nicht dran gedacht. Werde ich mir mal genauer anschauen.
    Das ist ja jetzt nur ein Array. Gedacht sind eigentlich 22 Arrays von der selben größe die übertragen werden müssen....
    Danke erstmal

    [EDIT]

    Ich habe das ganze gerade mal mit einem Array vom Typ INT getestet. Da komme ich auch nicht über 100 hinaus. Irgendwie ist bei egal welchen Datentypen die 100 das Ende... komisch...
    Geändert von Garog (20.02.2009 um 11:25 Uhr)

  5. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.720
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Zitat Zitat von Garog Beitrag anzeigen
    Ich habe das ganze gerade mal mit einem Array vom Typ INT getestet. Da komme ich auch nicht über 100 hinaus. Irgendwie ist bei egal welchen Datentypen die 100 das Ende... komisch...
    Ja ja, das Flexibel ...
    Vielleicht hängt das damit zusammen, das Auftrag1_RCV eine STRUCT ist ...
    Ansonsten sollten sich doch Indexe bis mind. 900 bilden lassen ...

    Ist das mit der MUX-Variablen für dich ein möglicher Ansatz ? Ich könnte mir das speziell in deinem Fall als sehr sinnvoll vorstellen, da du ja immer nur ein Element adressieren willst.

    Gruß
    LL

  6. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Garog (20.02.2009)

  7. #5
    Garog ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    166
    Danke
    11
    Erhielt 10 Danke für 9 Beiträge

    Standard

    Ist das mit der MUX-Variablen für dich ein möglicher Ansatz ? Ich könnte mir das speziell in deinem Fall als sehr sinnvoll vorstellen, da du ja immer nur ein Element adressieren willst.
    Ist sicher eine Idee der ich nachgehen werde und das mal probiere.
    Habe ich bisher noch nix mit gemacht, daher muss ich mich da erstmal schlau lesen drüber.
    Ich habe das ganze Projekt mal an Siemens geschickt. Ich habe dort einen Ansprechpartner im CS2 der glaube ich auch Nachts von Scripten träumt
    mal sehen was der dazu sagt.
    Derweil lese ich mich mal über deine Idee schlau.

    btw... 22 Arrays vom Typ INT (100 Stück jeweils) in die Steuerung kopieren klappt auch. Dauert auch nur 47 Sekunden

  8. #6
    Registriert seit
    12.05.2007
    Beiträge
    416
    Danke
    14
    Erhielt 45 Danke für 40 Beiträge

    Standard

    Code:
    For array_nr = 1 To (i-1)
      zeileninhalt = Split(zeile(array_nr),";",-1,1) 
      SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") (array_nr) = zeileninhalt(0)
    Next
    Böses Foul!!! Bei jeder Zuweisung werden alle 200 Elemente in die Steuerung geschoben!!! Dann kommt es zur Überlast!!!

    Trick bzw. Lösung:

    Code:
    DIM TempArray(200)
     
    For array_nr = 1 To (i-1)
      TempArray(array_nr-1) = Split(zeile(array_nr),";",-1,1)
    Next
     
    SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") = TempArray
    Jetzt wird das Array genau einmal in die Steuerung geschoben. Alles klar du Powertagsparer
    Geändert von xhasx (20.02.2009 um 15:08 Uhr)

  9. Folgender Benutzer sagt Danke zu xhasx für den nützlichen Beitrag:

    Garog (20.02.2009)

  10. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.720
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    der xhasx hat (fast) recht ...
    Die Array-Elemente eines DB's werden in Flex nicht mit 1.. Anzahl sondern mit 0..Anzahl-1 indexiert ...
    Das erste Elemente eines DB-Array's hat in Flex immer den Index "0" ...!
    War es das vielleicht ?

    Gruß
    LL

  11. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Garog (20.02.2009)

  12. #8
    Registriert seit
    12.05.2007
    Beiträge
    416
    Danke
    14
    Erhielt 45 Danke für 40 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    der xhasx hat (fast) recht ...
    Die Array-Elemente eines DB's werden in Flex nicht mit 1.. Anzahl sondern mit 0..Anzahl-1 indexiert ...
    Das erste Elemente eines DB-Array's hat in Flex immer den Index "0" ...!
    War es das vielleicht ?

    Gruß
    LL
    Hab's schon vor deinem Beitrag bemerkt und korrigiert

  13. Folgender Benutzer sagt Danke zu xhasx für den nützlichen Beitrag:

    Garog (20.02.2009)

  14. #9
    Garog ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    166
    Danke
    11
    Erhielt 10 Danke für 9 Beiträge

    Standard

    Vielen vielen dank

    auf genau das kam der nette Siemensmann auch
    mir war nicht bewusst das

    Code:
    SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") = TempArray
    funktioniert, ich dachte ich muss nachwievor jedes Arrayelemt verschieben.

    Das Grundproblem allerdings lag an dem Schreibpuffer von Flex.
    Flex arbeitet das Script ab und setzt alle zu erledigenden Aufgaben in einen Puffer, so werden die Funktionen auch nach Scriptbeendigung beendet.

    In meinen Fall das schreiben der Variablen. Das ich jedesmal bei ~105 Werten das Problem bekam, lag daran das Flex 5 bereits geschafft hatte und 100 im Puffer standen. Nun war der Puffer voll aber es musste nochmal 95 rein. Passt nicht -> Overflow

    Dadurch das mir nun bekannt ist das ich ganze Array auf einmal zuordnen kann, ist der Fehler schnell aus der Welt gewesen.

    Vielen Dank euch

  15. #10
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.624
    Danke
    377
    Erhielt 801 Danke für 642 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von xhasx;184935[/code
    Trick bzw. Lösung:

    Code:
    DIM TempArray(200)
     
    For array_nr = 1 To (i-1)
      TempArray(array_nr-1) = Split(zeile(array_nr),";",-1,1)
    Next
     
    SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") = TempArray
    Umgekehrt geht offenbar nicht.
    TempArray = SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern")
    Warum eigentlich ?
    Jesper M. Pedersen

Ähnliche Themen

  1. Array berreiche kopieren
    Von Hobby_Programmierer im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 18.05.2011, 19:03
  2. Array kopieren
    Von gloeru im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 05.03.2011, 20:06
  3. byte in array kopieren [AWL]
    Von vierlagig im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 17.11.2008, 22:55
  4. Element aus Array kopieren
    Von guidokk im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 18.06.2008, 16:14
  5. Antworten: 0
    Letzter Beitrag: 25.04.2007, 07:50

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •