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

Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte
Ergebnis 41 bis 50 von 51

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

  1. #41
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Redi Beitrag anzeigen
    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 ...

    Zitat Zitat von Redi Beitrag anzeigen
    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
    
    ' Variable in SPS schreiben mit Fertigmeldung
    SetDataRecordTagsToPLC "WriteVar", SmartTags("Protokoll\Schreibstatus")
    ' in Schleife auf Ende Var-Schreiben warten
    Do
        wrStat = SmartTags("Protokoll\Schreibstatus")
    Loop While (wrStat And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler
    
    ' wenn Schreiben ohne Fehler, dann Antwort (Protokoll-Datensatz) aus SPS lesen
    If wrStat = 4 Then
        ' Variablen aus SPS lesen mit Fertigmeldung
        GetDataRecordTagsFromPLC "Schichtprotokoll", SmartTags("Protokoll\Lesestatus")
        ' in Schleife auf Ende Var-Lesen warten
        Do
            rdStat = SmartTags("Protokoll\Lesestatus")
        Loop While (rdStat And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler
    
        If rdStat = 4 Then
            ' gerade gelesene Variablen verarbeiten
            ' ...
        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(n) Variable(n) 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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  2. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    van (18.05.2017)

  3. #42
    Registriert seit
    13.07.2011
    Beiträge
    10
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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


  4. #43
    Registriert seit
    13.07.2011
    Beiträge
    10
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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
    Zitieren Zitieren Schleife um ein Array auszulesen  

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

    Standard

    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!

  6. #45
    Registriert seit
    13.07.2011
    Beiträge
    10
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

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

  7. #46
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.708
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    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

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

    Standard

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

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

    Standard

    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) & "\"

  10. #49
    Registriert seit
    13.07.2011
    Beiträge
    10
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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(";" &(Array_Druck_1(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=Array_Druck_2(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

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Redi Beitrag anzeigen
    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(";" &(Array_Druck_1(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=Array_Druck_2(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...

Ä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
  •