Flex: Scriptarray in DB-Array kopieren

Garog

Level-1
Beiträge
197
Reaktionspunkte
32
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 :confused:

Am besten fände ich es wenn ich das DB-Array erst auf Anforderung aktuallisiere. Allerdings funktioniert
Code:
UpdateTag
ja nicht in Flexible.
 
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 ...

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 :confused:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist dein Flexibel-Array (nicht das Script-Array) denn auch grpß genug (über 100 Werte) dimensioniert ?

arraygr.jpg


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...
 
Zuletzt bearbeitet:
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 ... :cool:
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
 
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 :ROFLMAO:
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 *ROFL*
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :)
 
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen vielen dank :s18:

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 :)
 
xhasx;184935[/code schrieb:
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 ?
 
Hallo,
muss gestehen in der Richtung hab ich es noch nicht ausprobiert...
Gefühlsmässig sollte es aber funktionieren... Eine Kurvendarstellung ist ja nichts anderens...
Aber du hast mich grad auf ne geile Idee gebracht... Kurvendarstellun!!! Der Quatsch von Sie ist ja zu nichts zu gebrauchen...
 
Zurück
Oben