# WinCC flexible: Indirekte Adressierung innerhlab eines Skriptes / Schleife



## Markus

Hallo,

ich habe hier ein etwas aufgeblasenes Skript gehabt das 30 mal das selbe macht, ich habe die Funktion nun in eine Schleife gepackt und alles indirekt addressiert.

und jetzt - oh wunder - es geht nicht mehr... 

so wie ich das nachvollziehen konnte werden die variablen nicht aktualisiert, da steht im debugger bei manchen "0" drin obwohl das nicht sein darf...

da ich jetzt nicht so der vb-skript profi bin, mache ich sicher nur irgendwas falsch, oder geht das so wirklich nicht?

hier das skript:



		Code:
	

' Erstelle Variablen
Dim Mitte, D 
Dim Rolle
Dim Schnittnummer
Dim vonLinks 
Dim vonRechts
Dim Position 
Dim i
'setzte Festevariable
vonLinks = 340 
vonRechts = (340 + (SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Header.Mutterrollenbreite") / 7))
Mitte = 596 - ((SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Header.Rollendurchmesser")/10)/2)
D = SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Header.Rollendurchmesser")/10

' Höhe + Breite der Mutterrolle anpassen
HmiRuntime.Screens("B_Editor").ScreenItems("Mutterrolle").Height= D
HmiRuntime.Screens("B_Editor").ScreenItems("Mutterrolle").Width = SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Header.Mutterrollenbreite") / 7
' Position der Mutterrolle anpassen
HmiRuntime.Screens("B_Editor").ScreenItems("Mutterrolle").Left = 340
HmiRuntime.Screens("B_Editor").ScreenItems("Mutterrolle").Top = Mitte
'####################
' S C H L E I F E - 1   Alle Schnitte auf Unsichtbar setzen
'####################
For i = 1 To 30  ' Schleife - (Maximal 30 Schnitte möglich)
HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&i).Visible = False
HmiRuntime.Screens("B_Editor").ScreenItems("FRL_"&i).Visible = False
HmiRuntime.Screens("B_Editor").ScreenItems("FRR_"&i).Visible = False
HmiRuntime.Screens("B_Editor").ScreenItems("SCL_"&i).Visible = False
HmiRuntime.Screens("B_Editor").ScreenItems("SCR_"&i).Visible = False
Next
 

'####################
' S C H L E I F E - 2   Bestimmung der Position und Größe - Nur nenötigte Schnitte Sichtbar setzen
'####################

For Schnittnummer = 1 To SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Header.Schrittnummer_MAX")
' Schnitttyp-2 ist ein Sauberschnitt (eine Sägeblattbreite)
If SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Schnittyp") = 2 Then 
 vonLinks = vonLinks + (10/7)
End If
'Positon und Größe wenn der Schnitt auf der LINKEN Seite ist (Schnittseite-1)
If SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Schnittseite") = 1 Then
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Left = vonLinks
 Position = vonLinks
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Top = Mitte
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Height = D
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Width = SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Rollenbreite_SOLL")/7
 vonLinks = vonLinks + ((SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Rollenbreite_SOLL")/7) + 10/7)

'Positon und Größe wenn der Schnitt auf der RECHTEN Seite ist (Schnittseite-2)
Else 
 vonRechts = vonRechts - (SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt[1].Rollenbreite_SOLL")/7)
 Position = vonRechts
 
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Height = D
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Width = SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Rollenbreite_SOLL")/7
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Left = vonRechts
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Top = Mitte
  
 ' sieht komisch aus ist es auch aber, dadurch das die Darstellung am Äußeren Rand vom Panel ist 
 ' kann es Vorkommen das jenach Richtung das Bild erst die Größe ändert und dann so groß wird, das es nicht mehr auf 
 ' das Panel passt und somit gar nicht erst dargesstellt wird. Deswegen diese Doppelt Programmierung egal wie das Bild liegt so passt es immer
 
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Left = vonRechts 
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Top = Mitte
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Height = D
 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Width = SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Rollenbreite_SOLL")/7 
End If 
' Darstellung der Schnittypen in Unterschiedlichen Farben
Select Case SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Schnittyp")
 Case 0 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Visible = False
 Case 1 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).BackColor = vbBlack
      HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Visible = True  
 Case 2 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).BackColor = vbWhite
   HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Visible = True
 Case 3 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).BackColor = vbGreen
   HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Visible = True
 Case 4 HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).BackColor = vbBlue
   HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&Schnittnummer).Visible = True
End Select

' Darstellung von Fräs und Schneid Einstellungen
' Fräsen links 
If SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Fraesen_LINKS") = True Then 
 HmiRuntime.Screens("B_Editor").ScreenItems("FRL_"&Schnittnummer).Visible = True
    HmiRuntime.Screens("B_Editor").ScreenItems("FRL_"&Schnittnummer).Left = Position
    HmiRuntime.Screens("B_Editor").ScreenItems("FRL_"&Schnittnummer).Top = Mitte
    HmiRuntime.Screens("B_Editor").ScreenItems("FRL_"&Schnittnummer).Height = D
    HmiRuntime.Screens("B_Editor").ScreenItems("FRL_"&Schnittnummer).Width = 4
End If

' Schleifen links 
If SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Schleifen_LINKS") = True Then 
 HmiRuntime.Screens("B_Editor").ScreenItems("SCL_"&Schnittnummer).Visible = True
 If SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Fraesen_LINKS") = True Then
  HmiRuntime.Screens("B_Editor").ScreenItems("SCL_"&Schnittnummer).Left = Position + 4
 Else
  HmiRuntime.Screens("B_Editor").ScreenItems("SCL_"&Schnittnummer).Left = Position
 End If 
 HmiRuntime.Screens("B_Editor").ScreenItems("SCL_"&Schnittnummer).Top = Mitte
 HmiRuntime.Screens("B_Editor").ScreenItems("SCL_"&Schnittnummer).Height = D
 HmiRuntime.Screens("B_Editor").ScreenItems("SCL_"&Schnittnummer).Width = 4
End If

' Fräsen rechts 
If SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Fraesen_RECHTS") = True Then 
 HmiRuntime.Screens("B_Editor").ScreenItems("FRR_"&Schnittnummer).Visible = True
 HmiRuntime.Screens("B_Editor").ScreenItems("FRR_"&Schnittnummer).Left = Position + ((SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Rollenbreite_SOLL")/7) - 4)
 HmiRuntime.Screens("B_Editor").ScreenItems("FRR_"&Schnittnummer).Top = Mitte
 HmiRuntime.Screens("B_Editor").ScreenItems("FRR_"&Schnittnummer).Height = D
 HmiRuntime.Screens("B_Editor").ScreenItems("FRR_"&Schnittnummer).Width = 4
End If

' Schleifen rechts 
If SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Schleifen_RECHTS") = True Then 
 HmiRuntime.Screens("B_Editor").ScreenItems("SCR_"&Schnittnummer).Visible = True
 If SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt[1].Fraesen_RECHTS") = True Then
  HmiRuntime.Screens("B_Editor").ScreenItems("SCR_"&Schnittnummer).Left = Position + ((SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Rollenbreite_SOLL")/7) - 8)
 Else
  HmiRuntime.Screens("B_Editor").ScreenItems("SCR_"&Schnittnummer).Left = Position + ((SmartTags("Rezeptur_Var\Rollendaten_EDIT.Schnittdaten.Schnitt["&Schnittnummer&"].Rollenbreite_SOLL")/7) - 4)
 End If 
 HmiRuntime.Screens("B_Editor").ScreenItems("SCR_"&Schnittnummer).Top = Mitte
 HmiRuntime.Screens("B_Editor").ScreenItems("SCR_"&Schnittnummer).Height = D
 HmiRuntime.Screens("B_Editor").ScreenItems("SCR_"&Schnittnummer).Width = 4
End If
Next


----------



## jabba

Nur mal son Gedanke,
hast Du alle Variablen auf immer lesen und nicht "nur bei Verwendung gesetzt"?
Durch das indirekte werden die ja für WinCC nicht verwendet.


----------



## Paule

Markus schrieb:


> ich habe hier ein etwas aufgeblasenes Skript gehabt das 30 mal das selbe macht, ich habe die Funktion nun in eine Schleife gepackt und alles indirekt addressiert.


Das heißt davor hat es Funktioniert?


Markus schrieb:


> , da steht im debugger bei manchen "0" drin obwohl das nicht sein darf...


Sind das immer die gleichen Werte bei denen eine "0" drin steht?
Werden die Daten richtig geschrieben wenn Du die Schleife auf 1 anstatt auf 30 setzt?
Damit Du siehst ob es an der indirekten Adressierung oder an der Schleife liegt.


Markus schrieb:


> ich habe die Funktion nun in eine Schleife gepackt und alles indirekt addressiert.
> ...
> so wie ich das nachvollziehen konnte werden die variablen nicht aktualisiert, da steht im debugger bei manchen "0" drin obwohl das nicht sein darf...


Und wie Jabba auch schreibt, werden die Variablen für die indirekte Adressierung "Zyklisch gelesen"?


----------



## JesperMP

Anstatt:
HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&i).Visible = False

Vielleicht:
HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_" & *CStr(i)*).Visible = False


----------



## xhasx

Hi,
ehrlich gesagt bin ich ein Verfechter wenn es darum geht Variablennamen zusammenzubauen... Aber so mach ich das in der Regel wenn ich auf "Indizierte Strings" zugreife... Nur über die Zwischenvariable kann man auf den SmartTag zugreifen. Ich nehme mal an dass es auch bei den ScreenItems so ist.

DIM Test, VarName

VarName = xyz + i
Test = SmartTags(VarName)

und so sollte es auch mit dem Zugriff auf deine Screen Items funktionieren.


----------



## Larry Laffer

Hallo Markus,
nach meiner Meinung fügt dedie Verkettung ("Schritt_" & i) das so zusammen : "Schritt_ 17" wobei ich für i mal 17 angenommen habe. Das solltest du dir mal seperat ausgeben lassen. Wenn dem so ist, dann könntest du das führende Leerzeichen (vor der 17) mit dem Befehl LTRIM beseitigen lassen. Das Ganze ggf. mit dem von Jesper schon angebotenem CSTR aus Wandlungs-Befehl.Das sähe dann so aus :
	
	




		Code:
	

"Schritt_" & LTrim(Cstr(i))

Gruß
LL


----------



## Markus

hallo, sorry für die späte antwort.

also grundsätzlich war das probelem das die variablen nicht auf ständig lesen gesetzt waren. war ein denkfehler meinerseits, was ihr sagt stimmt, woher soll flex wissen das zugegrifen wird wenn der zugriff indirekt ist...





JesperMP schrieb:


> Anstatt:
> HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_"&i).Visible = False
> 
> Vielleicht:
> HmiRuntime.Screens("B_Editor").ScreenItems("Schritt_" & *CStr(i)*).Visible = False


 
was bringt das?


das skript läuft jetzt zwar, aber als schleife EXTREM viel langsamer als mit 3000 zeilen direkt adressiert... warum?


----------



## xhasx

Das ist klar! Weil du jedes mal (Schleifendurchlauf) das komplette Array liest bzw. schreibst!
Kopiere am Anfang des Skriptes alle Daten in ein internens Array und zum Schluss wieder zurück!


----------



## Markus

xhasx schrieb:


> Das ist klar! Weil du jedes mal (Schleifendurchlauf) das komplette Array liest bzw. schreibst!
> Kopiere am Anfang des Skriptes alle Daten in ein internens Array und zum Schluss wieder zurück!



danke dir!

kann ich das den auch in form einer schleife ohne das selbe problem zu haben? für mich ist das leider nicht so klar, habe nicht soviel erfahrung mit vbskript...


----------



## Larry Laffer

Hallo Markus,
das kannst du dann wie in SCL tun :

myZielArray = myQuellArray

Flex kann das ganze Array in einem Rutsch übergeben ...


----------



## xhasx

Hallo Markus und LL.

Fast richtig! Schaut euch mal das an...
http://www.sps-forum.de/showthread.php?t=25678


----------



## xhasx

So in etwa sieht das bei mir aus...



		Code:
	

Dim AblaufDatensatzArray(500)
 
' A B L A U F     
'Alle Daten in eine Interne Struktur kopieren! Dann die Interne der 'Externen Struktur zuweisen damit nur einmal die Verbindung zur Stuerung 'belastet wird   

For i = 0 To (UBound(AblaufDatensatzArray)-1)
    AblaufDatensatzArray(i) = SmartTags("xyz")(i)
Next

SmartTags("SteuerungArray") = AblaufDatensatzArray


----------



## Markus

so ganz begriffen habe ich es noch nicht...

du kopirst die variablen der sps in einer schleife in das lokale array im skript?

also variable für variable?

die müssen auf ständig lesen sein wel sie ja indirekt sind?


und wie siht das dann am ende aus?
sollte doch auch wieder ne schleife zum umkopieren her, zumindest verstehe ich das hier nicht:

SmartTags("SteuerungArray") = AblaufDatensatzArray



bzw. ich verstehe es schon, aber sollte es dann am anfang nicht auch gehen? wozu dann die schleife?

bei mir ist das mit der zuweisng des array etwas blöd.
in der sps ist das ein array of udt.
ich brauche aus jedem udt aber nur bestimmte werte, wenn ich den kompletten array of udt hochkopiere, müssen ja mehrere variablen kpert werden.

aber mit weniger verbindungen, da sonst die schleife für jede variable eine neue verbindung auf machen muss? habe ich das so verstanden?

danke euch!


----------



## Larry Laffer

Hallo Markus,
der Trick an dieser Stelle ist, dass es für die Visu deutlich einfacher ist, einen kompletten Datenblock zu laden (auch wenn er eine Menge unbenötigte Informationen enthält) als Variable für Variable einzeln - daß müßte im Grunde auch Rainer (Hönle) bestätigen können.

Warum xHasx erst Einzel-Elemete in sein Temp-Array schreibt habe ich auch nicht richtig verstanden. Entscheidend bei der Array-Kopiererei ist aber ein identischer Aufbau - deshalb mein Hinweis "wie bei SCL".

Gruß
LL


----------



## Markus

also die cpu kann je nach typ einen block bestimmter größe mit einer verbindung übertragen, das sind irgendwas mit so ca. 250byte soweit ich weiß (bin mir da aber nicht sicher!). alles was innerhalb dieses blockes liegt kommt mit, somit brauche ich weniger verbindungen.
aber ich ging da von aus das wincc flexible so schlau ist und das selber optimiert, also wenn ich auf mehrere variablen in einem block zugreife diese auch zusammen holt...

kann ich in vb skript sowas wie einen udt anlegen? also das lokale array gleich definieren wie das in der sps? da muss ich doch dann die datentypen mit angeben.


----------



## Larry Laffer

Hallo Markus,
soweit ich sehen konnte kann man in VB-Script (bei Siemens) keine TYPE's deklarieren. Es geht also nur mit ARRAY's gleichen Datentyp's - hier möglicherweise (das habe ich noch nie probiert) mit eindimensionalen ARRAY's ... Sorry ... 

Gruß
LL


----------



## xhasx

Sorry bin spät dran!

Ich muss gestehen dass es sich bei mir zuerst um Interne Variablen Handelt. Hier muss man Variablen in ner Schleife kopieren (anders hat es bei mir nicht funktioniert).
Auf das Externe Variablenarry kann man dann mit = zuweisen.

Ich lass mich aber gerne eines besseren belehren - mich würd's auch freuen wenn ich die Zählschleife nicht brauchen würde!!!


----------



## vladi

*VB Script..*

Hi,
nur mal am Rande: muss man sich irgendwelche Gedanken darüber machen, wie die Variablen gelesen/aktualisiert werden(im Script, nicht als Variable allegemein, zyklisch usw.!)? Es gibt da einige Methoden:

Dim Var1
Set Var1 = HMIRuntime.Tags("BlaBla").Read

If  Var1.Value = 5 then.........

Oder:
Set Var1 = HMIRuntime.Tags("BlaBla")
Var1.Read
Var1.Value = 666
Var1.Write

Kann man diesbezüglich Etwas optimieren?

Gruss: V.


----------



## Rainer Hönle

Larry Laffer schrieb:


> der Trick an dieser Stelle ist, dass es für die Visu deutlich einfacher ist, einen kompletten Datenblock zu laden (auch wenn er eine Menge unbenötigte Informationen enthält) als Variable für Variable einzeln - daß müßte im Grunde auch Rainer (Hönle) bestätigen können.


So ganz pauschal stimmt das nicht. Es hängt davon ab, wie groß die Lücken sind, die mitgelesen werden. Bei kleinen Lücken (ca. 10 Bytes) ist es auf jeden Fall besser, diese mitzulesen. Bei großen Lücken hängt es davon ab, wie groß die Anfrage bereits ist. Ist diese gering, dann nicht mitlesen. Ist diese schon relativ voll, dann mitlesen. Im AGLink gibt es hierzu spezielle Optimierungsfunktionen, die genau dies erledigen und eine für die SPS optimale Anfrage zusammenstellen.


----------



## Larry Laffer

@Rainer:
Als hoch-wissenschaftlich sollte meine Aussage hier auch nicht verstanden werden. Ich weiß, dass verschiedenene Link-Tool's (ich nenne das hier mal so) den Datenverkehr recht unterschiedlich handhaben ... und ich weiß, dass sich Siemens hier in Sachen Optimierung nicht unbedingt viel Mühe gegeben hat - ich kann meißtens eine Profilkurve mit 200 REAL's schneller einlesen/aktualisieren als 10 Einzel-Variablen beliebigen Typ's, die ein bißchen verstreut sind.
Mein Verweiß hier auf dich/euch sollte sich eher auf die Kenntnis des genauen Protokolls im Hintergrund für die Abfrage von Variablen von der SPS beziehen ...

Gruß
LL


----------



## Rainer Hönle

@LL:
Deshalb habe ich meine Erklärung auch sehr einfach gehalten. 
Und wenn 200 Reals schneller gelesen werden als 10 Einzelwerte, dann sitzt entweder der falsche Treiber unter der Visu oder der Visu-Programmierer kennt dessen Möglichkeiten nicht.


----------



## Markus

Rainer Hönle schrieb:


> @LL:
> Deshalb habe ich meine Erklärung auch sehr einfach gehalten.
> Und wenn 200 Reals schneller gelesen werden als 10 Einzelwerte, dann sitzt entweder der falsche Treiber unter der Visu oder der Visu-Programmierer kennt dessen Möglichkeiten nicht.



also gut - ich bin der visuprogrammierer 

ist der teiber von wincc flex falsch oder ich kann ich nicht damit umgehen?


----------



## xhasx

Also ich hatte erst Kontakt mit Siemens. Der gute Mann sitzt tief in der WCF Materie.
Er meinte lieber ein Array mit 2000 (Maximalwert von Einträgen) als 100 einzelne Variablen die irgendwo im Projekt verstreut sind.
Und da gibt's ja noch nen Punkt - PowerTags


----------



## rostiger Nagel

xhasx schrieb:


> Also ich hatte erst Kontakt mit Siemens. Der gute Mann sitzt tief in der WCF Materie.
> Er meinte lieber ein Array mit 2000 (Maximalwert von Einträgen) als 100 einzelne Variablen die irgendwo im Projekt verstreut sind.
> Und da gibt's ja noch nen Punkt - PowerTags


 
ja, PowerTags, wie ist das wird dann das Array als ein Element bzw.
Power Tag gewertet?


----------



## Larry Laffer

@Helmut:
Ja ...!


----------



## Markus

und kann ich den jetzt irgendwie udts bzw. types machen in vb skript bei wincc flex?


also mein array of udt aus der sps dort abbilden?


----------



## Larry Laffer

Larry Laffer schrieb:


> Hallo Markus,
> soweit ich sehen konnte kann man in VB-Script (bei Siemens) keine TYPE's deklarieren. Es geht also nur mit ARRAY's gleichen Datentyp's - hier möglicherweise (das habe ich noch nie probiert) mit eindimensionalen ARRAY's ... Sorry ...


 
... wie ich schon geschrieben habe ... 

Gruß
LL


----------



## Rainer Hönle

Markus schrieb:


> also gut - ich bin der visuprogrammierer
> 
> ist der teiber von wincc flex falsch oder ich kann ich nicht damit umgehen?


Da muss ich Dich enttäuschen. Du bist der Visu-Anwender. Die Visu-Programmierer sitzen beim großen S.


----------



## Markus

Rainer Hönle schrieb:


> Da muss ich Dich enttäuschen. Du bist der Visu-Anwender. Die Visu-Programmierer sitzen beim großen S.


 
gut - dann hätten wir schonmal den wichtigesten punkt geklärt in bezug auf probleme in die ich verwickelt bin: ICH BIN NICHT SCHULD! 

aber was soll ich denn jetzt machen?

array direkt zuweisen wird nicht gehen, weil:
1. vb skript in wincc flex keine TYPE kann
2. mein UDT aus variablen unterschiedlicher typen besteht

Zugriff auf die SPS Variablen im Skript kostet massig Zeit bzw. Verbindungsresourcen.

Eine Schleife vor meiner Schleife die die Variablen auf lokale Variablen umkopiert würde dann eigentich auch nicht wirklich was bringen, oder leige ich da falsch?

Was macht Fladi da genau? er weißt die variable einem objekt zu?
bringt aber in punkto zugriff eigentlich auch nichts.


----------



## Thomas_v2.1

Rainer Hönle schrieb:


> @LL:
> Deshalb habe ich meine Erklärung auch sehr einfach gehalten.
> Und wenn 200 Reals schneller gelesen werden als 10 Einzelwerte, dann sitzt entweder der falsche Treiber unter der Visu oder der Visu-Programmierer kennt dessen Möglichkeiten nicht.



Also meine Erfahrungen mit zumindest mit der PC-Runtime und Anbindung über TCP/IP sind so, dass der Treiber bei WinCC flexible *keine *Optimierung der Zugriffe macht.
Bei Variablen die auf "zyklisch bei Verwendung" stehen sieht das an einem Beispiel folgendermaßen aus:
Ich lege 16 Bitvariablen DB1.DBX0.0 bis DB1.DBX1.7 an, zusätzlich eine Integervariable DB1.DBW0. Was macht der Treiber? Er stellt insgesamt 17 Anfragen an die SPS, obwohl eine reichen würde.

Die einzige Möglichkeit Zugriffe zu optimieren ist die Daten als Array anzulegen. Dann holt WCflex die Daten en block.

Bei Variablen die auf "zyklisch fortlaufend" stehen sieht das etwas anders aus, da dort die Zyklusbildung in der SPS geschieht.


----------



## Rainer Hönle

Das hätte ich nicht gedacht. Ist eigentlich traurig .


----------



## Markus

wie groß ist so ein block denn bei wincc flexible 2008 auf nem mp377 und ner 319er drunter über profnet bzw. tcp/ip?


----------



## Rainer Hönle

Markus schrieb:


> wie groß ist so ein block denn bei wincc flexible 2008 auf nem mp377 und ner 319er drunter über profnet bzw. tcp/ip?



Die 319er hat eine Blockgröße von 240 Bytes. Der Maximalblock liegt somit bei 222 Bytes.


----------



## Redi

*Schleife für das erstellen von Variablen*

Hallo zusammen!

Ich schlage mich schon eine ganze Weile mit dem nachstehenden Code herum. Da ich eher VB-Neuling habe ich als Vorlage ein Skript zur Erstellung von Archivdateien von Siemens genommen. Ziel ist es eine grosse Anzahl Variablen (Druckwerte, Messpunkte) zu speichern. Da die Anzahl einfach änderbar sein soll wollte ich das ganze mit einer For Schleife organisieren. 
Nun wollte ich die Variable aus dem Namen der Variable (Drucksammlung1.Druck) und dem Index zusammen zusammensetzen um daraus nachher die entsprechende Ausgabe generieren zu können. Die Variable wird korrekt zusammengesetzt (wird mit CStr(Druckzwischenspeicher1) ausgegeben), nur mit welchem Befehl, kann ich mit der in Druckzwischenspeicher1 gespeichten Variablen den Wert ausgeben? Eigentlich müsste es ja der SmartTags Befehl sein, aber wie krieg ich da die Skriptvariable rein das die nachher die Variable von WinCC ausgibt?




		Code:
	

Dim fso, f, ts, DataSet, Header, FName, Druckzwischenspeicher1, Druckzischenspeicher2, i

' Archivierungspfad (Eingangsparameter) und Dateiname zusammensetzen 
' Combine archivepath (input parameter) an filename
FName = StoragePath & "\" & CStr(SmartTags("Auftragsnummer")) & "_" & CStr(DatePart("d",Date)) & CStr(DatePart("m",Date)) & "_" & CStr(DatePart("yyyy",Date)) & ".csv"

' Tabellenkopf zusammenstellen (Spalten Tag_10; Tag_11 usw.)
' Create table header (Column for Tag_10; Tag_11 and so on)
 Header = "Storage Time;Anlagenbediener;Auftragnummer;Artikelnummer;Artikelbezeichnung;Losgrösse;Druck0;Druck1" & Chr(10)'Char (10) entspricht Zeilenvorschub

' FileSystemObject erstellen
' Create FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")


' Wenn Datei noch nicht vorhanden ist, dann wird eine Datei erzeugt
' if the file does not exist, then create a file
If Not fso.FileExists(FName) Then   

   fso.CreateTextFile FName              
   Set f = fso.GetFile(FName)         
' Datei dem Skript als Objekt zur Verfügung stellen
' File as Object available for script

   Set ts = f.OpenAsTextStream(8, -2)
' Datei öffnen
' open file

   ts.WriteLine(FName)                 
   ts.WriteLine(Header)                 
   ts.Close
' Pfad- & Dateiname und Tabellenkopf in die Datei schreiben
' write path- & filename and table header into file
' Datei schließen
' close file

End If 

 Set f = fso.GetFile(FName)            
' Die Archivdatei dem Skript als Objekt zur verfügung stellen 
' Archive file as object available for script

 Set ts = f.OpenAsTextStream(8, -2) 
' Die Datei öffnen 
' Open file

' Werte der Variablen in die Archivdatei schreiben
' Write values of variables in archive file
 
ts.Write(CStr(Now) & ";" & CStr(SmartTags("Anlagenbediener_Name")) & ";" & CStr(SmartTags("Auftragsnummer"))& ";" & CStr(SmartTags("Artikelnummer")) & ";" & CStr(SmartTags("Artikelbezeichnung"))& ";" & CStr(SmartTags("Losgroesse"))& ";" & CStr(SmartTags("Drucksammlung1.Druck0")))


For i=0 To 20 Step +1
     Druckzwischenspeicher1="Drucksammlung1.Druck"&CStr(i)
     [COLOR=Red]ts.Write(";" & CStr(Druckzwischenspeicher1))[/COLOR]
     

    
Next
ts.WriteLine()

' Datei wieder schließen
' Close file
 ts.Close

' Verwendeten Speicher wieder freigeben
' Used storage will be freed
Set ts  = Nothing
Set f   = Nothing
Set fso = Nothing


----------



## Larry Laffer

Hallo,
ich bin mir jetzt nicht 100% sicher, ob ich die Frage korrekt verstanden habe ... mein Vorschlag wäre aber :
	
	




		Code:
	

[COLOR=#ff0000]ts.Write(";" & [COLOR=green][B]SmartTags[/B][/COLOR](Druckzwischenspeicher1))[/COLOR]

Gruß
Larry


----------



## Redi

*Schleife für das erstellen von Variablen*

Danke für Deine Antwort.
In die Richtung hätte ich auch tendiert, wenn ich es mit dem Befehl mache gibt er mir einfach 20 mal 0 zurück, was nicht den Variablen entspricht. Irgendwie habe ich die Vermutung das es an den Anführungszeichen liegt.
Normalerweise sieht ja der Aufruf einer WinCC Variable so aus (SmartTags("Drucksammlung1.Druck0") [die Zahl null wollte ich eigentlich mit der Schleife hochzählen und so die Variablen ausgeben], wenn ich nun aber meine Variable zusammensetze mit Druckzwischenspeicher1="Drucksammlung1.Druck"&CStr(i) dann habe ich ja beim einfügen mit (SmartTags(Druckzwischenspeicher1)) die Anführungszeichen nicht mehr drinn. Wenn ich den obigen Aufruf mit einer direkten (nicht zusammengesetzten) Variable ohne Anführungszeichen realisiere[(SmartTags(Drucksammlung1.Druck0)], dann gibt mir der Compiler einen Fehler aus...
Ich hoffe ich habs einigermassen verständlich erkärt :lol::lol:


----------



## Larry Laffer

Hallo,
du mußt bei dem CStr(i) beachten, dass der als String sehr wahrscheinlich ein " 1" und nicht "1" wenn i=1 zurückgibt. Es wird vor der eigentlichen zahl möglicherweise ein Leerzeichen mit eingefügt. Hast du das mal kontrolliert ?

Es gibt aber außerdem noch etwas hier zu beachten :
Innerhalb des Flex-Projektes muss noch unter "Geräte-Einstellungen\Geräte-Einstellungen" und dort in der Rubrik "Einstellungen für Runtime" die Funktion "Namensinformation freigeben" aktiviert sein. das könntest du noch checken ...

Gruß
Larry


----------



## Redi

*Schleife für das erstellen von Variablen*

Hallo Larry
die Einstellung habe ich kontrolliert. Auch habe ich schon verschiedene Sachen ausprobiert.
u.a.:


		Code:
	

ts.WriteLine(CStr(Now) & ";" & CStr(SmartTags("Anlagenbediener_Name")) & ";" & CStr(SmartTags("Auftragsnummer"))& ";" & CStr(SmartTags("Artikelnummer")) & ";" & CStr(SmartTags("Artikelbezeichnung"))& ";" & CStr(SmartTags("Losgroesse"))& ";" & CStr(SmartTags("Drucksammlung1.Druck0")& ";" & CStr(SmartTags("Drucksammlung1.Druck1"))))



For i=0 To 20 Step +1
     Druckzwischenspeicher1="Drucksammlung1.Druck"&CStr(i)
     ts.WriteLine(SmartTags(("Drucksammlung1.Druck5")))
     ts.WriteLine(SmartTags(Druckzwischenspeicher1))
     ts.WriteLine(CStr(Druckzwischenspeicher1))


Zum einen habe ich beim ersten Teil (ohne Schleife) zwei Variablen fest reingeschrieben. In die Schleife habe ich eine Feste Variable, danach den Ausdruck der das machen sollte was ich eigentlich will und danach der mir den Zwischenspeicher einfach als String ausgibt. Wenn ich das Textfile anschaue (siehe Anhang), dann führt er die Zeile vor der Schleife Problemlos aus. Die Fixe Variable in der Schleife und die Ausgabe des Zwischenspeichers funktioniert auch Problemlos. Bei den änderdenden Variablen gibt er die ersten zwei (Druck0 und Druck1) die auch schon oben definiert sind den Wert richtig aus, bei den restlichen aber 0. Kannst Du Dir darauf einen Reim machen?

Gruss 
Dani


----------



## PN/DP

Hallo Dani,

an der Ausgabedatei kann man sehen, daß Dein Script richtig funktioniert. Es wird lediglich bei allen Variablen außer Druck0, Druck1 und Druck5 0 als Wert ausgegeben.

Stehen alle Deine Druckx-Variablen auf zyklisch lesen?
Sind die Druckx-Variablen eventuell Variablen aus einer Rezeptur?
Ich würde folgendes probieren: für alle Druckx-Variablen ein Ausgabefeld in ein Bild machen und das Script aus diesem Bild aufrufen.

Harald


----------



## Redi

Hallo Harald

Heureka
zyklisch lesen war das Stichwort. Ich hatte den Erfassungszyklus in der Tabelle auf 100ms eingestellt und ging davon aus das dies Ausreichend ist, vorallem da ja die Variablen die ich fest im Skript eingetragen habe, auch geloggt wurden. Aber wieder was gelernt... wollte schon fast aufgeben und das ganze von Hand eintragen.

Vielen Dank an Euch beide.

Gruss
Daniel


----------



## PN/DP

Redi schrieb:


> Heureka
> zyklisch lesen war das Stichwort.


Oooch, dieses Problemchen wurde doch schon im Beitrag #2 dieses Threads geklärt, an den Du Dich 'rangehängt hast ... anfangs dachte ich, Du hast das sicher schon gelesen ...



Redi schrieb:


> Ich hatte den Erfassungszyklus in der Tabelle auf 100ms eingestellt und ging davon aus das dies Ausreichend ist, vorallem da ja die Variablen die ich fest im Skript eingetragen habe, auch geloggt wurden.


... allerdings: "Zyklisch *bei Verwendung*"
Nur von den fest eingetragenen Variablen wußte WinCCflex von der "Verwendung" und hat sie vor dem Scriptaufruf gelesen.

Wenn die Variablennamen erst im Script zusammengesetzt werden, dann ahnt WinCCflex nicht, daß diese Variablen "verwendet" werden und liest sie nicht vor dem Start des Scripts. Ein Script wartet nicht auf das Lesen der Smarttag-Variablen, egal wie kurz der Erfassungszyklus eingestellt ist. Ein Script arbeitet mit dem Variablenwert des letzten vorherigen Lesens oder dem Startwert, wenn die Variable noch nie gelesen wurde.

Wenn ein Script auf das Schreiben oder Lesen von Variablen warten soll und/oder man kein zyklisch fortlaufendes Lesen vieler Variablen verwenden will, dann kann man das z.B. so lösen:


		Code:
	

Dim wrStat, rdStat

[COLOR="Green"]' Variable in SPS schreiben mit Fertigmeldung[/COLOR]
SetDataRecordTagsToPLC "WriteVar", SmartTags("Protokoll\Schreibstatus")
[COLOR="green"]' in Schleife auf Ende Var-Schreiben warten[/COLOR]
Do
    wrStat = SmartTags("Protokoll\Schreibstatus")
Loop While (wrStat And 4) = 0 [COLOR="green"]' 4=fertig OK / 12=abgebrochen mit Fehler[/COLOR]

[COLOR="green"]' wenn Schreiben ohne Fehler, dann Antwort (Protokoll-Datensatz) aus SPS lesen[/COLOR]
If wrStat = 4 Then
    [COLOR="green"]' Variablen aus SPS lesen mit Fertigmeldung[/COLOR]
    GetDataRecordTagsFromPLC "Schichtprotokoll", SmartTags("Protokoll\Lesestatus")
    [COLOR="green"]' in Schleife auf Ende Var-Lesen warten[/COLOR]
    Do
        rdStat = SmartTags("Protokoll\Lesestatus")
    Loop While (rdStat And 4) = 0 [COLOR="green"]' 4=fertig OK / 12=abgebrochen mit Fehler[/COLOR]

    If rdStat = 4 Then
        [COLOR="green"]' gerade gelesene Variablen verarbeiten[/COLOR]
        [COLOR="green"]' ...[/COLOR]
    End If
End If

If wrStat <> 4 Or rdStat <> 4 Then
    ShowSystemAlarm "Fehler beim Lesen der Protokollwerte!"
End If

* "WriteVar" ist eine Rezeptur, welche die zu schreibende Variable beinhaltet
* "Schichtprotokoll" ist eine Rezeptur, welche die zu lesenden Variablen beinhaltet
* "Protokoll\Schreibstatus" und "Protokoll\Lesestatus" sind (interne) UInt-Variablen

Das sekundenlange Warten auf das Ende des Variablen-Schreibens/Lesens in einer Schleife ist natürlich unschön, weil so lange die Ausführung weiterer Scripte nicht möglich ist. Besser ist es, das Script aufzuteilen in die Schreib/Lese-Auftrags-Teile und die anschließende Verarbeitung erst beim Ereignis "beiÄnderung" der Schreibstatus/Lesestatus-Variablen. Dann müssen "Protokoll\Schreibstatus" und "Protokoll\Lesestatus" SPS-Variablen sein, weil interne Variablen kein Ereignis "beiÄnderung" auslösen.

Die Systemfunktion "AktualisiereVariable" ist für das erzwungene Variablenlesen nicht hilfreich, weil nicht im Script verwendbar und man erhält keine Rückmeldung, wenn das Lesen erfolgt ist.

Harald


----------



## Redi

Doch gelesen hatte ich den Beitrag schon, nur verstanden hatte ich ihn anscheinend nicht, oder zumindestens falsch. Jetzt mit Deiner Erklärung ist mir das ganze erst so richtig klar geworden.

Vielen Dank nochmals für die Hilfe und die Abschliessende Erklärung.
Dein Spruch den Du in der Fusszeile hast, hat wirklich was 

Gruss
Daniel
​


----------



## Redi

*Schleife um ein Array auszulesen*

Hallo zusammen
Ich wollte den vorhin beschriebenen Vorgang noch optimieren und statt zwei mal 20 Variablen zu übertragen, das ganze mit zwei Arrays lösen. Nur habe ich mir dabei nochmals neue Probleme aufgehalst 



		Code:
	

ts.Write(";" & Array_Druck_1(10))

For i=0 To 19 Step +1
     Druckzwischenspeicher1="Array_Druck_1("&(i)&")"
     ts.Write(";" & SmartTags(Druckzwischenspeicher1))


Next

For i=0 To 19 Step +1
     Druckzwischenspeicher2="Array_Druck_2("&CStr(i)&")"
     ts.Write(";" & (Druckzwischenspeicher2))
Next

Das Ausgeben des des 10 elements funktioniert, wenn ich dann aber in die Schleife komme dann gibt er mir die RT 'no Tag' aus, wenn ich die Schleifen so wie in der zweiten Schleife mache, so gibt er mir den im Druckzwischenspeicher gespeicherten Text (Array_Druck_2(0)) aus und nicht den Wert aus dem Array. Muss man beim indirekten Adressieren in der Schleife WinCC noch mitteilen das es sich um Array handelt? Oder habe ich einen anderen Fehler eingebaut?

Gruss
Dani


----------



## xhasx

Nur mal so als Einwurf

SmartTags die eine Verbindung zur Steuerung haben und deren Variablenname "zusammengebaut" wird werden nicht aktualisiert wenn sie in einem Skript verwendet werden!
Da hab ich sogar schon mal einen Fall bei Siemens aufgemacht und das wurde mir wieder mal als Systemeigenheit verkauft!!!
Also niemals einen Variablennamen für "externe" Variablen zusammenbauen!


----------



## Redi

Aber dasselbe habe ich ja vorhin auch gemacht (funktioniert sobald auf Zyklisch fortlaufend lesen umgestellt wurde), nur mit dem Unterschied das die Variablen einzeln gelistet waren und nicht im Array... oder verhält sich das bei einem Array anders...?


----------



## Larry Laffer

Hallo,


		Code:
	

For i=0 To 19 Step +1
     Druckzwischenspeicher1="Array_Druck_1("&(i)&")"
     ts.Write(";" & SmartTags(Druckzwischenspeicher1))
Next

für diesen Code solltest du dir mal den String-Inhalt von "Druckzwischenspeicher1" ansehen. Steht da wirklich "Array_Druck_1(1)" drin oder vielleicht "Array_Druck_1( 1)" ?? Das könnte einen Unterschied ausmachen ...



		Code:
	

For i=0 To 19 Step +1
     Druckzwischenspeicher2="Array_Druck_2("&CStr(i)&")"
     ts.Write(";" & (Druckzwischenspeicher2))
Next

Dieser Code hat auch nicht die Aufgabe, den Inhalt der Variablen abzuspeichern (sonst stände da nämlich "SmartTags(Druckzwischenspeicher2)") sondern lediglich deren Namen - also den Inhalt des Strings. Das Script verhält sich also korrekt ... 

Gruß
Larry


----------



## xhasx

@Redi
Bist du sicher dass das der aktuelle Wert dann ist. Ich behaupte mal nicht.


----------



## xhasx

Ich hab mir jetzt mal nicht alles durchgelesen.
Aber es geht wohl drum dass du deinen Variablennamen weggeschrieben bekommst aber nicht dessen Inhalt.

Fangen wir mal von vorne an. Du hast ein Array aus dem du die Inhalte in eine Datei wegschreiben magst? Ja?

Hier mal wie man sich einen Variablennamen zusammenbauen kann.



		Code:
	

 'Listenfeld Inhalt holen (Index) 
 VarName = "Anlage\FileBrowser\Ordner" & Parameter1
 'Pfad zusammensetzen
 SmartTags("Anlage\FileBrowser\PfadnameAktuell") = SmartTags("Anlage\FileBrowser\PfadnameAktuell") & SmartTags(VarName) & "\"


----------



## Redi

Hallo
Also ich hab die Lösung gefunden...
Das mit dem String zusammensetzen und sie dann als SmartTag einzufügen scheint mit Arrays nicht zu funktionieren. 


> Dieser Code hat auch nicht die Aufgabe, den Inhalt der Variablen  abzuspeichern (sonst stände da nämlich  "SmartTags(Druckzwischenspeicher2)") sondern lediglich deren Namen -  also den Inhalt des Strings. Das Script verhält sich also korrekt ...


Auf diese Idee bin ich eigentlich nur gekommen, da ich ja vor der Schleife das gleiche mache mit :


		Code:
	

ts.Write(";" &([COLOR=Orange]Array_Druck_1[/COLOR](3)))

Zum einen scheint da WinCC die deklarierte Variable schon als Array zu erkennen, sie wird orange markiert, zum anderen wenn ich SmartTags davor setze meldet mir die RT 'tag lookup only by name' und schreibt den Wert nicht mehr ins File...
In dem Moment, indem ich die Anführungszeichen  entfernt hatte, erkannte WinCC die Array Variable auch in der Schleife(orange markiert)
statt:


		Code:
	

For i=0 To 19 Step +1
     Druckzwischenspeicher2="Array_Druck_2("&(i)&")"
     ts.Write(";" & SmartTags(Druckzwischenspeicher2))

muss es heissen:


		Code:
	

For i=0 To 19 Step +1
     Druckzwischenspeicher2=[COLOR=Orange]Array_Druck_2[/COLOR](i)
     ts.Write(";" & (Druckzwischenspeicher2))

Und dann funktionierts...




		Code:
	

'Listenfeld Inhalt holen (Index)   VarName = "Anlage\FileBrowser\Ordner" & Parameter1  'Pfad zusammensetzen  SmartTags("Anlage\FileBrowser\PfadnameAktuell") = SmartTags("Anlage\FileBrowser\PfadnameAktuell") & SmartTags(VarName) & "\"

Bringt obenstehende Schreibweise (kompletter Pfad) Vorteile? Bis jetzt habe ich nur mit den Namen gearbeitet, wie sie bei den Variablen deklariert sind (ohne den Pfad).
Besten Dank für Eure Hilfe!!! Konnte auch bei anderen Beiträgen von Euch in diesem Forum schon mächtig was lernen!!

Gruss
Daniel


----------



## xhasx

Redi schrieb:


> Hallo
> Also ich hab die Lösung gefunden...
> Das mit dem String zusammensetzen und sie dann als SmartTag einzufügen scheint mit Arrays nicht zu funktionieren.
> Auf diese Idee bin ich eigentlich nur gekommen, da ich ja vor der Schleife das gleiche mache mit :
> 
> 
> Code:
> 
> 
> ts.Write(";" &([COLOR=orange]Array_Druck_1[/COLOR](3)))
> 
> Zum einen scheint da WinCC die deklarierte Variable schon als Array zu erkennen, sie wird orange markiert, zum anderen wenn ich SmartTags davor setze meldet mir die RT 'tag lookup only by name' und schreibt den Wert nicht mehr ins File...
> In dem Moment, indem ich die Anführungszeichen entfernt hatte, erkannte WinCC die Array Variable auch in der Schleife(orange markiert)
> statt:
> 
> 
> Code:
> 
> 
> For i=0 To 19 Step +1
> Druckzwischenspeicher2="Array_Druck_2("&(i)&")"
> ts.Write(";" & SmartTags(Druckzwischenspeicher2))
> 
> muss es heissen:
> 
> 
> Code:
> 
> 
> For i=0 To 19 Step +1
> Druckzwischenspeicher2=[COLOR=orange]Array_Druck_2[/COLOR](i)
> ts.Write(";" & (Druckzwischenspeicher2))
> 
> Und dann funktionierts...
> 
> 
> 
> 
> Code:
> 
> 
> 'Listenfeld Inhalt holen (Index)   VarName = "Anlage\FileBrowser\Ordner" & Parameter1  'Pfad zusammensetzen  SmartTags("Anlage\FileBrowser\PfadnameAktuell") = SmartTags("Anlage\FileBrowser\PfadnameAktuell") & SmartTags(VarName) & "\"
> 
> Bringt obenstehende Schreibweise (kompletter Pfad) Vorteile? Bis jetzt habe ich nur mit den Namen gearbeitet, wie sie bei den Variablen deklariert sind (ohne den Pfad).
> Besten Dank für Eure Hilfe!!! Konnte auch bei anderen Beiträgen von Euch in diesem Forum schon mächtig was lernen!!
> 
> Gruss
> Daniel


 

Der Code bringt an dieser Stelle nicht viel, aber an manch anderer Stelle. Aber wenn man schon mit Strg C und V arbeitet...


----------



## Larry Laffer

Redi schrieb:


> Das mit dem String zusammensetzen und sie dann als SmartTag einzufügen scheint mit Arrays nicht zu funktionieren.


 
Hallo Daniel,
das ist Blödsinn. Natürlich kannst du das auch schreiben, es muss dann nur auch richtig sein. Jede Programmier-Umgebung hat Schreibkonventionen, so auch Flex. Ich muss dir zwar gestehen, dass ich die bei Flex so hin und wieder auch als recht mäßig empfinde, aber sei es drum ...

Bei einem Array-Element bezieht sich der SmartTag auf den Variablen-Namen und nicht aud den Index. Es muss also richtig zusammengesetzt werden :
	
	




		Code:
	

meineVariable = SmartTag("meinArray")(Index)

Du hast aber Recht damit, Array-Elemente auf diese Weise nicht zusammen zu setzen (weil das system das ja schon selber kann). Sinn macht das vor Allem bei Nicht-Array's, die trotzdem wie Array's behandelt werden sollen.

Gruß
Larry


----------

