# Flex: Scriptarray in DB-Array kopieren



## Garog (20 Februar 2009)

Ich habe ein Problem hiermit:


```
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 
	
	



```
UpdateTag
```
 ja nicht in Flexible.


----------



## Larry Laffer (20 Februar 2009)

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 ...



Garog schrieb:


> 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


----------



## Garog (20 Februar 2009)

> 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...


----------



## Larry Laffer (20 Februar 2009)

Garog schrieb:


> 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


----------



## Garog (20 Februar 2009)

> 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 *ROFL*


----------



## xhasx (20 Februar 2009)

```
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:


```
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


----------



## Larry Laffer (20 Februar 2009)

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


----------



## xhasx (20 Februar 2009)

Larry Laffer schrieb:


> 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 ?
> ...



Hab's schon vor deinem Beitrag bemerkt und korrigiert


----------



## Garog (20 Februar 2009)

Vielen vielen dank :s18:

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


```
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


----------



## JesperMP (18 März 2009)

xhasx;184935[/code schrieb:
			
		

> Trick bzw. Lösung:
> 
> 
> ```
> ...


Umgekehrt geht offenbar nicht.
TempArray = SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern")
Warum eigentlich ?


----------



## xhasx (18 März 2009)

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...


----------



## JesperMP (18 März 2009)

Ich habe es ausprobiert, und es wird nicht akzeptiert.
Warum, wenn es geht in eine Richtung ?
Schade, es ist ja viel eleganter als ein grosses Array durchzuschleifen.


----------

