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

Seite 1 von 6 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 51

Thema: WinCC flexible: Indirekte Adressierung innerhlab eines Skriptes / Schleife

  1. #1
    Registriert seit
    16.06.2003
    Ort
    88356 Ostrach
    Beiträge
    4.811
    Danke
    1.231
    Erhielt 1.101 Danke für 527 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    "Es ist weit besser, große Dinge zu wagen, ruhmreiche Triumphe zu erringen, auch wenn es manchmal bedeutet, Niederlagen einzustecken, als sich zu den Krämerseelen zu gesellen, die weder große Freude noch großen Schmerz empfinden, weil sie im grauen Zwielicht leben, das weder Sieg noch Niederlage kennt." Theodore Roosevelt - President of the United States (1901-1909)
    Zitieren Zitieren WinCC flexible: Indirekte Adressierung innerhlab eines Skriptes / Schleife  

  2. #2
    Registriert seit
    04.02.2007
    Beiträge
    2.544
    Danke
    167
    Erhielt 731 Danke für 528 Beiträge

    Standard

    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.

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

    Markus (18.01.2010)

  4. #3
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard

    Zitat Zitat von Markus Beitrag anzeigen
    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?
    Zitat Zitat von Markus Beitrag anzeigen
    , 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.
    Zitat Zitat von Markus Beitrag anzeigen
    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"?
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  5. Folgender Benutzer sagt Danke zu Paule für den nützlichen Beitrag:

    Markus (18.01.2010)

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

    Standard

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

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

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

    Standard

    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.
    Geändert von xhasx (18.01.2010 um 10:22 Uhr) Grund: Verbesserung

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

    Mecha2312 (15.06.2014)

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

    Standard

    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

  10. #7
    Avatar von Markus
    Markus ist offline Administrator
    Themenstarter
    Registriert seit
    16.06.2003
    Ort
    88356 Ostrach
    Beiträge
    4.811
    Danke
    1.231
    Erhielt 1.101 Danke für 527 Beiträge

    Standard

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



    Zitat Zitat von JesperMP Beitrag anzeigen
    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?
    "Es ist weit besser, große Dinge zu wagen, ruhmreiche Triumphe zu erringen, auch wenn es manchmal bedeutet, Niederlagen einzustecken, als sich zu den Krämerseelen zu gesellen, die weder große Freude noch großen Schmerz empfinden, weil sie im grauen Zwielicht leben, das weder Sieg noch Niederlage kennt." Theodore Roosevelt - President of the United States (1901-1909)

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

    Standard

    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!

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

    Markus (18.01.2010)

  13. #9
    Avatar von Markus
    Markus ist offline Administrator
    Themenstarter
    Registriert seit
    16.06.2003
    Ort
    88356 Ostrach
    Beiträge
    4.811
    Danke
    1.231
    Erhielt 1.101 Danke für 527 Beiträge

    Standard

    Zitat Zitat von xhasx Beitrag anzeigen
    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...
    "Es ist weit besser, große Dinge zu wagen, ruhmreiche Triumphe zu erringen, auch wenn es manchmal bedeutet, Niederlagen einzustecken, als sich zu den Krämerseelen zu gesellen, die weder große Freude noch großen Schmerz empfinden, weil sie im grauen Zwielicht leben, das weder Sieg noch Niederlage kennt." Theodore Roosevelt - President of the United States (1901-1909)

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Markus,
    das kannst du dann wie in SCL tun :

    myZielArray = myQuellArray

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

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

    Markus (19.01.2010)

Ähnliche Themen

  1. WinCC - indirekte Adressierung
    Von georg_demmler im Forum HMI
    Antworten: 3
    Letzter Beitrag: 17.04.2011, 10:11
  2. Indirekte Adressierung
    Von Rainer im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 21.05.2008, 15:07
  3. Antworten: 29
    Letzter Beitrag: 11.06.2007, 22:21
  4. Indirekte Adressierung eines Pointers
    Von merlin im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 12.04.2007, 13:30
  5. indirekte Adressierung eines Datenbausteins
    Von linax im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 20.11.2003, 17:12

Lesezeichen

Berechtigungen

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