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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: WinCC V7.2 C-Skript Performance beim ersten lesen von 150 String-Variablen

  1. #1
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.354
    Danke
    455
    Erhielt 694 Danke für 519 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute!
    WinCCv7.2 CPU315PN/DP

    Ich hab eine Frage zur Anbindung/Aktualisierung von Variablen die in Skripten verwendet werden bzw. wie man beim Zugriff auf viele Datenpunkte aus einem
    Skript heraus die Performance verbessern kann. Und zwar nur nach dem ersten Öffnen.

    Folgendes Setting:
    Ich habe eine kleine Rezeptsteuerung mit 150+ Artikel (string[32]) auf der SPS in einem DB. Die Strings sind in WinCC ganz normal angelegt.
    Dann habe ich ein kleines C-Skript geschrieben das die Strings mit einem Filterkriterium vergleicht und dann eine Liste der entsprechenden ausgibt.

    Dazu müssen natürlich alle 150 Einträge geprüft werden. Das Skript ist schon so weit optimiert das es nur solange sucht bis entweder die Liste voll ist oder
    alle Einträge in denen wirklich was drin steht durchsucht wurden.
    Unbenannt.png

    ZUM PROBLEM:
    Nach dem Öffnen des Bilds dauert die Suche bzw. die Erstellung der Liste recht lange (bis zu 2min). Hat man dann erst mal alle Einträge durchgeschaut, dass heißt alle
    Strings min. einmal mit GetTagChar gelesen, dauert der Ablauf des Skripts nur noch max. 0,5sek. Das gilt dann solange bis ich das Bild wechsle, beim nächsten Öffnen
    dauerts wieder genauso lange...

    Warum ist das so bzw. was könnte ich dagegen machen...
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!
    Zitieren Zitieren WinCC V7.2 C-Skript Performance beim ersten lesen von 150 String-Variablen  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Gibt bei Siemens ein FAQ dazu:
    http://support.automation.siemens.co...ew/de/28017376

    Find ich zwar auch nicht schön da 150 unsichtbare Objekte im Bild liegen zu haben, aber wenn es nicht anders geht.
    Wobei ich gespannt bin ob das was bringt, wenn du deine Funktion ausführst unmittelbar nachdem das Bild aufgerufen wurde. Entweder es dauert die 2 Minuten die Variablen aus dem Skript beim Datenmanager anzumelden, oder es dauert so lange bis die Daten aus der SPS gelesen wurden. Wobei 150x 32-Zeichen Strings jetzt nicht die übermäßig große Datenmenge darstellen. Hast du nebenher noch viele Variablen im Tag- oder Alarmlogging verwendet? Denn das kann die Kommunikationsleistung zu anderen Variablen auch gehörig einbremsen, da diese zyklisch immer vorrangig abgefragt werden.

  3. Folgende 2 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    ducati (05.12.2013),RONIN (10.12.2013)

  4. #3
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Ich habe mir mal mit Wireshark angesehen was WinCC da so treibt wenn man die Variablen nur über ein C-Skript abfragt. Kein Wunder dass das so lange dauert. Wenn du deinen ersten String mit GetTagChar() abfragst, wird nur diese eine Variable aus der SPS gelesen. Beim nächsten GetTagChar dann die erste UND die zweite, beim nächsten dann die erste, zweite und dritte usw. Das heißt, wenn du deinen 150ten String einliest, wurde der erste 150 mal aus der SPS gelesen, die zweite 149 mal usw. Ich habe es grade nur mit 16 Strings getestet, das benötigt schon 8 Sekunden.

    Vorschlag:
    Nicht GetTagChar verwenden, sondern GetTagMultiWait. Und diese zu einer oder mehreren Aufrufen gruppieren. Das geht dann Ratzfatz...

    Eine 16er Gruppe z.B. so:
    Code:
    char varname[30][30];
    char* value[30];
    int i;
    BOOL ok;
    
    for (i = 0; i <= 15; i++) {
      sprintf(varname[i], "s001_%d", i +1);
    }
    
    ok=GetTagMultiWait("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
      varname[0], &value[0],
      varname[1], &value[1],
      varname[2], &value[2],
      varname[3], &value[3],
      varname[4], &value[4],
      varname[5], &value[5],
      varname[6], &value[6],
      varname[7], &value[7],
      varname[8], &value[8],
      varname[9], &value[9],
      varname[10], &value[10],
      varname[11], &value[11],
      varname[12], &value[12],
      varname[13], &value[13],
      varname[14], &value[14],
      varname[15], &value[15]
    );
    
    
    for (i = 0; i <= 15; i++) {
       printf("Variable '%s' = '%s'\n", varname[i], value[i]);
    
    }

  5. Folgende 3 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    ducati (06.12.2013),Pipboy (05.12.2013),RONIN (10.12.2013)

  6. #4
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.354
    Danke
    455
    Erhielt 694 Danke für 519 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Gibt bei Siemens ein FAQ dazu:
    http://support.automation.siemens.co...ew/de/28017376
    Find ich zwar auch nicht schön da 150 unsichtbare Objekte im Bild liegen zu haben, aber wenn es nicht anders geht.
    Sehr interessant! Ich hab dann auf dieser Basis ein paar Experimente durchgeführt und eine Methode stellte sich als ganz passabel raus.
    In meinem Basis-Framework (zu jederzeit sichtbar) habe ich ein paar Textfelder platziert und per Dynamik-Dialog eine Dynamik erstellt die auf alle String-Variablen zugreift.
    Und zwar habe ich mit Excel ein kleines VB-Skript erstellt welches automatisch die Variablennamen generiert (Damit ich nicht alles tippen muss).
    Ergebnis: 'SPZM_Art1.ArtBez' && 'SPZM_Art2.ArtBez' && .... 'SPZM_Art150.ArtBez'
    Diese Riesenwurst habe dann einfach in irgendeine Dynamik am Textfeld kopiert (Eigenschaft Text) und habe sie dann in ein C-Skript umgewandelt
    Code:
    Ergebnis:
    // WINCC:TAGNAME_SECTION_START
    // syntax: #define TagNameInAction "DMTagName"
    // next TagID : 151
    #define TAG_1 "SPZM_Art1.ArtBez"
    #define TAG_2 "SPZM_Art2.ArtBez"
    ...
    #define TAG_150 "SPZM_Art150.ArtBez"
    // WINCC:TAGNAME_SECTION_END
    
    // WINCC:PICNAME_SECTION_START
    // syntax: #define PicNameInAction "PictureName"
    // next PicID : 1
    // WINCC:PICNAME_SECTION_END
    
    if ((double)GetTagDouble (TAG_1) && (double)GetTagDouble (TAG_2) && (double)GetTagDouble (TAG_3) && (double)GetTagDouble (TAG_4) && (double)GetTagDouble (TAG_5) && (double)GetTagDouble (TAG_6) .........)
      return "??????";
    else
      return "??????";
    Danach habe ich die ganzen GetTagDouble-Zugriffe im unteren Teil gelöscht und nur noch das return übrig gelassen. Damit WinCC nicht versucht alle 150 Tags zyklisch zu lesen.
    Und siehe da! Der Zugriff auf die 150 Strings im anderen Skript wurde von ca. 2min auf ne gute Sekunde reduziert.
    Kann mir einer dieses merkwürdige Verhalten erklären????

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Wenn du deinen ersten String mit GetTagChar() abfragst, wird nur diese eine Variable aus der SPS gelesen. Beim nächsten GetTagChar dann die erste UND die zweite, beim nächsten dann die erste, zweite und dritte usw. Das heißt, wenn du deinen 150ten String einliest, wurde der erste 150 mal aus der SPS gelesen, die zweite 149 mal usw. Ich habe es grade nur mit 16 Strings getestet, das benötigt schon 8 Sekunden.
    Wie Bitte? Das heißt wenn man Constraints wie:
    Code:
    for(i = 0; i<=150; i++
    {
         sprintf(CharVarName,"SPZM_Art%d.ArtBez,i);
         GetTagChar(CharVarName);
    }
    verwendet wird also folgendermaßen vorgegangen????
    i=1: Lesen von: SPZM_Art1.ArtBez
    i=2: Lesen von: SPZM_Art1.ArtBez; SPZM_Art2.ArtBez
    i=3: Lesen von: SPZM_Art1.ArtBez; SPZM_Art2.ArtBez; SPZM_Art3.ArtBez
    i=150: Lesen von: SPZM_Art1.ArtBez; SPZM_Art2.ArtBez; SPZM_Art3.ArtBez; ........................................................................... SPZM_Art150.ArtBez

    Ernsthaft?!?! Erklärt auch warum das lesen der 150 Strings zuerst schneller geht und je höher die Nummer (1-150) desto langsamer wird es.
    Was haben den die Leute die sich das ausgedacht haben geraucht? Gilt das auch für andere Typen außer GetTagChar????

    Das mit dem GetTagMultiWait werde ich natürlich auch probieren!


    DANKE erstmal!
    Geändert von RONIN (25.01.2014 um 18:48 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  7. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Zitat Zitat von RONIN Beitrag anzeigen
    Ernsthaft?!?! Erklärt auch warum das lesen der 150 Strings zuerst schneller geht und je höher die Nummer (1-150) desto langsamer wird es.
    Was haben den die Leute die sich das ausgedacht haben geraucht? Gilt das auch für andere Typen außer GetTagChar????
    Folgende Erklärung aufgrund meiner Beobachtungen für das Verhalten:

    Angenommen ich will in einem C-Skript mit GetTag Variablenwerte lesen, die bisher noch nie aus der SPS gelesen wurden, z.B. weil diese eben in keinen Bild angezeigt werden.
    Darum müssen die GetTag Aufrufe blockierend sein, weil ich ja erwarte dass ich als Ergebnis der Funktion einen zumindest halbwegs aktuellen Wert der Variablen in der SPS zurückbekomme. Somit dauert der erste GetTag Aufruf so lange bis der Wert der einzelnen Variable die ich lesen wollte wirklich aus der SPS zurückgekommen ist.

    Nun gruppiert der WinCC Datenmanager Variablen von gleichem Aktualisierungszyklus in Gruppen, um diese möglichst effizient aus der SPS lesen zu können. Auch wenn ich die Variablen mittels GetTag aus einem Skript auslese, werden diese zur zyklischen Aktualisierung (imho 2s Default) angemeldet.
    Bedeutet, dass beim ersten GetTag-Aufruf eine neue Aktualisierungsgruppe nur mit Variable 1 angelegt wird. Bei GetTag der nächsten Variable wird diese der Gruppe hinzugefügt und es werden beide zusammen gelesen usw. usf.
    Bis zu einer Anzahl an Variablen die in eine PDU passen ist dieses Verfahren nichteinmal verwerflich, da es keinen sehr großen Unterschied macht, ob ein Telegramm mit der Abfrage 1-Byte Variable oder der kompletten Ausnutzung der PDU-Größe gesendet wird.

    Da eine Gruppe irgendwann mal voll ist und eine neue angelegt wird, wird sich das Verhalten nicht wie ich geschrieben habe bis zu 150 Variablen so fortsetzen. Aber das Prinzip bleibt, und man kann WinCC wegen diesem Verhalten eigentlich keinen Vorwurf machen.
    Um das zu verhindern gibt es die GetTagMulti Funktionen.

    Wenn du eine TCP/IP-Verbindung zur SPS hast, kannst du dir das Ganze ja mal mit Wireshark ansehen. Da sieht man sehr schön wie das funktioniert.
    Geändert von Thomas_v2.1 (10.12.2013 um 21:01 Uhr)

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

    RONIN (11.12.2013)

  9. #6
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.354
    Danke
    455
    Erhielt 694 Danke für 519 Beiträge

    Standard

    Danke für die ausführliche Beschreibung!

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    ... die bisher noch nie aus der SPS gelesen wurden...
    ... müssen die GetTag Aufrufe blockierend sein...
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    ... werden diese zur zyklischen Aktualisierung (imho 2s Default) angemeldet.
    Ja so um dem Daumen herum war mir dass auch so bekannt. Ich hatte auch zwischenzeitlich versucht bei Runtimestart ein Skript aufzurufen das die infrage kommenden Variablen einmal abfragt um sie für die zyklische Aktualisierung anzumelden.
    Leider brachte das keine Verbesserung.

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Wenn du eine TCP/IP-Verbindung zur SPS hast, kannst du dir das Ganze ja mal mit Wireshark ansehen. Da sieht man sehr schön wie das funktioniert.
    Werd ich definitiv noch machen, meine Neugier ist geweckt.

    Leider geht das Projetkt nächste Woche in Betrieb also wenig Zeit. Deswegen werd
    ich vorerst auch noch mit der Lösung der Variablenanmeldung über den Dynamikdialog eines Objektes (So wie oben beschrieben) leben. Will es jetzt noch nicht unbedingt auf GetTagMulti umbauen.

    Es wäre allerdings schön wenn man WinCC schon ohne versteckten Aufwand verklickern könnte: "Hey ich brauch die Tags in Skripten und zwar PRONTO! Also meld diese gefälligst von Haus aus an du Dummes Ding."
    Sowas wie ein Häckchen beim Erstellen das Tags, vielleicht.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  10. #7
    Registriert seit
    25.02.2008
    Ort
    Bayern
    Beiträge
    611
    Danke
    64
    Erhielt 27 Danke für 23 Beiträge

    Standard

    Hallo,
    Variablen mit Excel-VBA generieren?
    Wie geht denn das?
    Gruß
    Sailor
    Always look on the bright side of life

  11. #8
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    @Thomas_v2.1


    geht GetTagMultiWait auch mit TIA/HMI Bordmitteln oder brauche ich da ein richtiges WinCC V12?

    könnte ich die Funktionalität mit einem der WinCC Trials testen - reicht das die Basic?

    http://support.automation.siemens.co...ard&viewreg=WW
    Geändert von LowLevelMahn (11.12.2013 um 11:00 Uhr)

  12. #9
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.354
    Danke
    455
    Erhielt 694 Danke für 519 Beiträge

    Standard

    Zitat Zitat von sailor Beitrag anzeigen
    Variablen mit Excel-VBA generieren?
    Nur die VariblenNAMEN bzw. die Lange Wurst. Damit ich nicht alles tippen musste. Siehe Anhang

    Wirklich Tags generieren natürlich über das WinCC Configuration Tool.
    SPZM_VarNames.zip
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  13. #10
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von LowLevelMahn Beitrag anzeigen
    geht GetTagMultiWait auch mit TIA/HMI Bordmitteln oder brauche ich da ein richtiges WinCC V12?

    könnte ich die Funktionalität mit einem der WinCC Trials testen - reicht das die Basic?
    Ich kenne diese TIA-WinCC Varianten nicht, darum kann ich nicht sagen obs da sowas gibt.
    Aber ich kann mir nicht vorstellen dass das viel mit dem "richtigen" WinCC (V5, V6, V7) gemein hat.

Ähnliche Themen

  1. WinCC 7 Performance Variablen-Trigger
    Von Krumnix im Forum HMI
    Antworten: 1
    Letzter Beitrag: 25.09.2013, 08:43
  2. Antworten: 4
    Letzter Beitrag: 14.11.2012, 18:43
  3. Antworten: 9
    Letzter Beitrag: 12.11.2012, 20:40
  4. WinCC flexible Skript beim Bildabbau beenden
    Von philippD im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 30.01.2012, 15:07
  5. Antworten: 2
    Letzter Beitrag: 19.04.2011, 10:32

Lesezeichen

Berechtigungen

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