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

Ergebnis 1 bis 7 von 7

Thema: WinCC 7.2: Variablen bei einem bestimmten INT-Wert auf 0 setzen

  1. #1
    Registriert seit
    13.05.2013
    Beiträge
    81
    Danke
    29
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe folgendes Problem, ich bekomme von der SPS einen INT-Wert zwischen 0-300. Die Werte 1-300 sollen eine Störmeldung ausgeben,
    also habe ich nun 300 interne Variablen (Stoerung_1 bis Stoerung_300) angelegt, welche dann auf 1 gesetzt werden, wenn der jeweilige INT-Wert geschickt wird (also INT-Wert = 3, Störmeldung Nr. 3 wird ausgegeben)
    Was soweit kein Problem darstellt, jedoch möchte ich nun, wenn der INT-Wert 0 wird, auch alle Störmeldungen quittieren, bzw. alle Störbits 0 setzen, was ich mit einer for-schleife geplant hatte,
    jedoch scheint es nur bis etwa 200 zu funktionieren, danach stürzt WinCC (SCRIPT) immer ab...hätte hier vielleicht jemand eine Idee wie man es besser machen könnte, bzw. was das Problem sein könnte?

    Hier ein Beispiel, wie ich es lösen wollte:
    Code:
    #define TAG_1 "Stoerung_Test"
    // WINCC:TAGNAME_SECTION_END
    
    // WINCC:PICNAME_SECTION_START
    // syntax: #define PicNameInAction "PictureName"
    // next PicID : 1
    // WINCC:PICNAME_SECTION_END
    char StoerNr[64] ="Stoerung_";
    char Var[301][64];
    char num[301];
    int i=0;
    
    if (GetTagByte(TAG_1) == 0)
    {
    for(i = 1; i <= 301; i++){
        sprintf(num, "%i", i);
        strcpy(Var[i],StoerNr);
        strcat(Var[i],num);
    
        #define TAG_Num Var[i]
    
    SetTagBit(TAG_Num,0);    //Return-Type: BOOL 
    }
    }
    else if (GetTagByte(TAG_1) == 1)
    {
    SetTagBit("Stoerung_1",1);    //Return-Type: BOOL 
    }
    else if (GetTagByte(TAG_1) == 2)
    {
    SetTagBit("Stoerung_2",1);    //Return-Type: BOOL 
    }


    Vielen Dank im Voraus,
    mfG
    Zitieren Zitieren WinCC 7.2: Variablen bei einem bestimmten INT-Wert auf 0 setzen  

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

    Standard

    Sieht mir etwas aufwändig aus. Ich würde es evtl. so machen:

    Code:
    // WINCC:TAGNAME_SECTION_START
    #define TAG_STOERNR "Stoerung_Test"
    // WINCC:TAGNAME_SECTION_END
    char varname[255];
    int i, stoernr;
    
    /* Nummer der Störung auslesen */
    stoernr = GetTagByte(TAG_STOERNR);
    
    for (i = 1 ; i <= 300; i++) {
      /* Tagnamen der Störungsvariablen zusammensetzen */
      sprintf(varname, "Stoerung_%i", i);
      /* wenn Index gleich Störnummer dann 1 schreiben, sonst 0 */
      SetTagBit(varname, (i == stoernr));
    }
    Und die Funktion nur aufrufen wenn sich die Störnummer geändert hat, da hält die Last niedrig.

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

    Jennsy (26.01.2014)

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

    Standard

    Achso, warum überhaut GetTagByte? Das habe ich jetzt einfach von dir so übernommen.
    Ein Byte kann aber nur 255 verschiedene Werte darstellen. Da musst du nochmal den Datentyp der Variable überprüfen.

  5. #4
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.356
    Danke
    455
    Erhielt 694 Danke für 519 Beiträge

    Standard

    EDIT: Ahhh Thomas war schneller!

    1. Was sagt den die Global-Script-Diagnose?

    2. Du schreibst von INT-Werten, verwendest im Skript aber GetTagByte. Wie du schreibst bekommst du
    über 200 Probleme... Vielleicht bei über 255? Wie wärs mit GetTagSWord?

    3. Scheint mir das Script ein wenig zu kompliziert als nötig.
    Das sollt eigentlich das selbe machen:
    Code:
    #define TAG_1 "Stoerung_Test"
    // WINCC:TAGNAME_SECTION_END
    
    // WINCC:PICNAME_SECTION_START
    // syntax: #define PicNameInAction "PictureName"
    // next PicID : 1
     // WINCC:PICNAME_SECTION_END
    int i=0, Value = 0;
    char VarName[255];
    
    Value = GetTagSWord(TAG_1);
    
     if (Value == 0)
     {
        for(i = 1; i <= 300; i++){
            sprintf(VarName, "StoerNr%i", i)
           SetTagBit(VarName,0);    //Return-Type: BOOL 
     }
     else
    {
              sprintf(VarName, "StoerNr%i", Value); 
            SetTagBit(VarName,1);
    }
    4. Nur so als Info. Wenn du solche sprintf-for Systeme mit externe Variablen machst kannst du unter Umständen Performance-Probleme bekommen. Siehe Hier!

    mfg RONIN
    Geändert von RONIN (26.01.2014 um 12:29 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  6. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    Jennsy (26.01.2014)

  7. #5
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.356
    Danke
    455
    Erhielt 694 Danke für 519 Beiträge

    Standard

    Ups... Vor lauter offener Browser-Tabs hab ich doch glatt im falschen Beitrag gepostet. Wenn das hier bitte jemand löschen würde. Sorry.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  8. #6
    Registriert seit
    29.04.2012
    Beiträge
    195
    Danke
    13
    Erhielt 42 Danke für 37 Beiträge

    Standard

    Wurde schon zweimal korrigiert, die Schleife läuft auf jeden Fall eins zu weit.

    Was genau soll das hier bewirken,Zeile 20:
    #define TAG_Num Var[i]
    There are two kinds of fools. One says, “This is old, and therefore good.” And one says, “This is new, and therefore better.”

  9. #7
    Jennsy ist offline Benutzer
    Themenstarter
    Registriert seit
    13.05.2013
    Beiträge
    81
    Danke
    29
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Thomas_v2.1

    Vielen Dank für deine Antwort! Meine Lösung war wohl doch etwas zu aufwändig, so ist es ja wirklich viel einfacher...habs durchs ständige herumbasteln eindeutig zu kompliziert gemacht
    Die Funktion habe ich eh nur bei Änderung der Störnummer aufgerufen.
    und danke, dass mit dem GetTagByte ist mir dann auch aufgefallen, habs schon in ein GetTagSWord wie von RONIN vorgeschlagen, geändert.

    Hallo RONIN,
    Ebenfalls vielen Dank für deine Antwort! Das mit dem GetTagByte hatte ich komplett übersehen, vielen Dank fürs Aufmerksam machen. Und ja, richtig, viel zu kompliziert
    Die sprintf Funktion verwende ich nur für interne Variablen, hoffe deshalb, dass ich keine übermäßigen Probleme mit der Performance haben werde.

    Hallo Pipboy,
    Danke. Das sollte den jeweiligen Wert bzw. besser gesagt Variablennamen im Array auf eine Variable setzen. (wie bereits oben erwähnt --> viel zu kompliziert gedacht)

    mfG
    Jenny

Ähnliche Themen

  1. Bestimmten Wert bei Eingang X schreiben.
    Von Katrin1982 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 11.01.2011, 14:00
  2. Merkerdoppelwort auf bestimmten Wert setzen
    Von 00schneider im Forum Programmierstrategien
    Antworten: 7
    Letzter Beitrag: 15.01.2010, 08:57
  3. DB nach einem bestimmten Wert durchsuchen
    Von Herrminator im Forum Simatic
    Antworten: 20
    Letzter Beitrag: 30.07.2009, 16:53
  4. WinCC flexible - BOOLEAN Wert setzen
    Von Fluffi im Forum HMI
    Antworten: 3
    Letzter Beitrag: 17.02.2008, 10:43
  5. Bei S7-300 Int-Wert in S5T umwandelt ?
    Von Boernie im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 08.11.2005, 10:22

Lesezeichen

Berechtigungen

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