TIA Soll ist Vergleich von Bedingungen

amantido

Level-2
Beiträge
63
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,

die Sufu hat mir nicht passendes rausgeworfen. (oder ich hab nicht nach den richtigen Begriffen gesucht)

Ich habe folgendes Problem, bzw. bin auf der Suche nach einer Idee wie man etwas realisieren könnte:
Code:
CASE #Schrittnummer OF
    0:
        #xBedingung := "Tag_1" AND "Tag_2";
        IF #xBedingung THEN
            #Schrittnummer := #Schrittnummer + 1;
        END_IF;
    1:
        #xBedingung := "Tag_1" AND NOT "Tag_2";
        IF #xBedingung THEN
            #Schrittnummer := #Schrittnummer + 1;
        END_IF;
    2:
        #xBedingung := NOT "Tag_1" AND "Tag_2";
        IF #xBedingung THEN
            #Schrittnummer := #Schrittnummer + 1;
        END_IF;
END_CASE;

Jetzt ist es so dass wenn die Bedingung ein paar Sekunden nicht erfüllt ist soll eine Fehlermeldung auftauchen. In dieser sollen alle Bedingungen stehen die NICHT erfüllt sind. Und da gehts bei mir los. Den Timeout habe ich schon realisiert, aber wie bekomme ich es hin zu prüfen welche Bedingung gerade fehlt damit es nicht weiter geht?
Die gezeigte Schrittkette ist nur Beispielhaft. Je nach Schritt hab ich bis zu 10 Bedingungen welche erfüllt sein müssen.

Aktuell benutze ich TIA V13 mit einer 1500 SPS

Bin über jeden Vorschlag dankbar
 
Nicht erfüllte Bedingungen sind doch
Code:
NOT "TAG_x"
oder sehe ich das falsch?

Also werden alle nichterfüllten Bedingungen auf einen HMI-Text verlinkt, der dann angezeigt wird auf dem Fehlerbild.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
NOT Tag_X bedeutet dass der Operand auf 0 sein muss. Also hab ich in dem Fall einen Fehler wenn dieser auf 1 ist.

Also werden alle nichterfüllten Bedingungen auf einen HMI-Text verlinkt, der dann angezeigt wird auf dem Fehlerbild.

darum gehts eben, wie bekomme ich den Ausdruck zu einem Text hin?
 
Wir haben bei manchen Anlagen Synoptiken. Ich denke das kommt dem was Du vor hast recht nahe.
Es läuft nicht über Meldungen sondern Visualisiert die Bedingungen:

Code:
  _|_
  |__|      Steuerspannung ein
  _|_
  |__|      Motorschutz io
  _|_
  |__|      PTC io
  _|_
  |__|      Freigabe von nachgeschaltetem Antrieb
   |
 __|__
|____|   Freigabe für Antrieb XY
   |
Ist also eigentlich eine UND Verknüpfung im KOP- Stil. Die unterste Spule wird Grün
sobald alle oberen Bedingungen erfüllt sind.
Ich hatte es damals so umgesetzt, dass ich alle Bedingungen in einem DB abgelegt habe,
die UND Verknüpfung für die Spulen Umschaltung hatte ich per Script gemacht.

Nachteil an der ganzen Geschichte ist das es sehr aufwendig ist.
 
Es muss ja eigentlcih nur ein Timer laufen, der and ie bedingungen geknüpgt ist. der Timer gibt dann nach Zeit x die Meldung.

Sowas würde ich nicht in SCL, sondern in Graph machen, weil das da einfach schon da ist. Man muss das Rad ja nicht immer neu erfinden.

EDIT:

Code:
#xBedingung := "Tag_1" AND "Tag_2";
        IF #xBedingung THEN
            #Schrittnummer := #Schrittnummer + 1;
        END_IF;
Die erste Zeile ist überflüssig.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@amantido
Du schriebst:
...soll eine Fehlermeldung auftauchen. In dieser sollen alle Bedingungen stehen die NICHT erfüllt sind...

Davon ausgehend: Du hast einen Timer - ist erledigt.
Wenn Timer abgelaufen - Flag setzen.
Wenn Flag gesetzt = Fehler - mir war so, als wäre das erledigt.
Jetzt also einfach einen Fehlerbildschirm aufrufen (automatisch mit dem Flag oder manuell) und alle Tags, die 0 sind anzeigen.
Dazu musst Du die Tags im einfachsten Falle invertiert ( NOT TAG_x ) in einen weiteren Merker schreiben, der jeweils mit dem entsprechenden Meldetext verknüpft ist.
Meldetexte werden m.W. im Panel fest hinterlegt.

Soweit die Theorie. In der Siemens Praxis stecke ich nicht (mehr) drin. Aber mir war in älteren Panels das so geläufig, das ich Meldetexte Bitweise einem Wort zuweisen konnte.
Übrigens: Die Auswertung auf Fehler ist in meiner Welt ein separater Vergleich, aslo NOT TAG_x ;)

Etwas ausgefeilter wäre es, nur die Tags anzuzeigen, die zur Erfüllung des jeweiligen Schritt's der Statemachine erforderlich sind.

@Christmaspoo Das mit der überflüssigen Zuweisung war mir auch aufgefallen, ich hatte mich aber entschieden es als Form der besseren Codelesbarkeit zu interpretieren.
 
Zuletzt bearbeitet:
Hallo
Ich würde es so machen:
Code:
CASE #Schrittnummer OF
    0:
        #xBedingung := "Tag_1" AND "Tag_2";
        IF #xBedingung THEN
            #Schrittnummer := #Schrittnummer + 1;
        else

ein Fehler - Wort basteln in dem jede Bediengung ein Bit belegt.

        END_IF;
    1:
        #xBedingung := "Tag_1" AND NOT "Tag_2";
        IF #xBedingung THEN
            #Schrittnummer := #Schrittnummer + 1;
        END_IF;
    2:
        #xBedingung := NOT "Tag_1" AND "Tag_2";
        IF #xBedingung THEN
            #Schrittnummer := #Schrittnummer + 1;
        END_IF;
END_CASE;

Ist Bediengung = 0 und TimeOut abgelaufen
Habe ich aus Schrittnummer und Fehlerwort ein genaues Abbild der Bedingungen zum Anzeigen oder sonst was.

Holger

In dem Fall wäre die erste Zeile auch nicht über;)
 
Zuletzt bearbeitet:
@Christmaspoo
wenn es nach mir ginge würde ich es auch in Graph machen, aber der Kunde will die Schrittkette unbedingt in SCL.

Bisher läuft das ganze so ab (allerdings ohne dass ich in den Code schauen kann)
Es wird eine Funktion aufgerufen. Als Input bekommt die Funktion z.B. folgendes: xSensor_oben AND xSensor_links AND NOT xSensor_unten AND NOT xSensor_rechts
In der Funktion läuft dann die Zeit (welche auch übergeben wird) Ist die Zeit abgelaufen dann kommt ein String raus der dann unter umständen so aussieht: "Fehlende Bedinungen: xSensor_oben AND NOT xSensor_unten"
Bei den Fehlenden Bedinungen ist dann eben alles aufgelistet was nicht zu dem Zustand passt der aktuell eigentlich gefordert ist.

@weißnix_
es geht dann drum wirklich nur die Tags anzeigen zu lassen die noch falsch sind. (alle Anzeigen ist eventuell bissel zu viel)

Grundsätzlich würde es mir auch reichen wenn ich wüsste wie man einen String soweit zerlegt dass wenn er auf ein AND trifft oder ein AND NOT dieses dann als Operator interpretiert und nicht mehr als String. Aber dazu hab ich auch noch nichts gefunden.
 
vieleicht kann die folgender Code helfen:
Code:
#xBedingung[1] := "Tag_1" AND "Tag_2";
#xBedingung[2] := "Tag_1" AND NOT "Tag_2";
#xBedingung[3] := NOT "Tag_1" AND "Tag_2";

CASE #Schrittnummer OF
    0:
        IF #xBedingung[1] THEN
            #Schrittnummer := #Schrittnummer + 1;
        END_IF;
    1:
        IF #xBedingung[2] THEN
            #Schrittnummer := #Schrittnummer + 1;
        END_IF;
    2:
        IF #xBedingung[3] THEN
            #Schrittnummer := #Schrittnummer + 1;
        END_IF;
END_CASE;

#String:='nicht erfuellt:';

FOR #i :=1 TO 3 DO
      IF NOT #xBedingung[#i]THEN
      #String:=CONCAT(IN1:=#String, IN2:=' '); 
      #String:=CONCAT(IN1:=#String, IN2:=DELETE(IN:=INT_TO_STRING(#i), L:=1, P:=1));
      END_IF;
END_FOR;
#String_2:=#String;

Die Bedienungen müsten außerhalb der Case anweisung geprüft werden, damit Sie jeden Zyklus abgearbeitet werden.
In String_2 erfolgt dann deine Auswertung:
 
@Onkel Dagobert
Es soll ja am Schluss eine Meldung rauskommen. Aber nicht in dem Stil: "Die Anlage hängt in Schritt 50" sondern: "Es fehlen zum weiterschalten folgende Bedingungen: xxxyyxx"
Und bei den Bedingungen wird dann aufgelistet was aktuell fehlt und nicht alles. Mir ist nicht klar wie ich das in eine Meldung packen soll. Müsste ja tausende Meldungen machen. Gewünscht ist dass nur ein String an das HMI gegeben wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@miasma
Hab mir den mal angeschaut. Leider bekomme ich da noch nicht heraus welche der Bedinungen fehlt. Ich kann da nur Texte hinzufügen. Das bringt mich leider aber noch nicht ans Ziel

@El Cattivo
aus deiner zweiten CONCAT Anweisung werde ich irgendwie nicht schlau. Du fügst die 1 an und löscht diese gleich wieder
 
Die Funktion Int_to_String erzeugt mit einen String aus der Zahl aber mit Vorzeichen. Mit delete lösche ich das erste Zeichen des String also das Vorzeichen und nicht die Zahl.

Gesendet von meinem PLK-L01 mit Tapatalk
 
Ich habe bei einer Schrittkette eigentlich immer einen Timer mitlaufen lassen. Wenn der abgelaufen ist setze ich ein Bit für eine weitere Verarbeitung. Mit diesem Bit kann man auch eine Meldung setzen.

Zusätzlich dazu kannst du auch noch Schritt spezifisch einen weiteren Wert setzen der dann aus einer Textliste einen Variablen Ausdruck in die Meldung einfügt. Da der Wert der Schrittkette nur einmalig abgearbeitet wird, d.h. es wird immer Schritt 50 abgearbeitet müsstest du eigentlich mit einem einzigen Timer auskommen der nur in jeder Bedingung ein Startsignal bekommt und nach Ablauf mit einem Quittierungsbefehl zurückgesetzt wird. Ist der Schritt erfolgreich abgearbeitet setzt du den Timer in der gleichen Bedingung die dir den Schritt hochzählt wieder zurück.
 
Zurück
Oben