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

Jennsy

Level-1
Beiträge
81
Reaktionspunkte
1
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
 
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.
 
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
 
Zuletzt bearbeitet:
Ups... Vor lauter offener Browser-Tabs hab ich doch glatt im falschen Beitrag gepostet. Wenn das hier bitte jemand löschen würde. Sorry. :oops:
 
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
 
Zurück
Oben