TIA Grund für Auslösung von NotHalt aus einer VPS sicher erfassen

uweschwarz

Level-2
Beiträge
269
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, wir arbeiten mit einer S7 1516 und TIA V17.

In unserer Anlage sorgt eine VPS (Verdrahtungsprogrammierte Steuerung) für die funktionale Sicherheit. Wir haben z.B. 4 Drucksensoren deren Signale von einem Grenzwertschalter ausgewertet werden und sobald eine Grenzwerte über- oder unterschritten wird, wird NotHalt ausgelöst. Leider gelingt es mir mit der SPS nicht, festzustellen welcher der auslösende Sensor war.
Meine Vermutung ist, dass die VPS zu schnell ist. Wenn z.B. ein Druck den Grenzwert übersteigt öffnet die VPS die Anlage und alle Drücke fallen natürlich sofort ab. Ich habe im SPS Programm zwar eine Grenzwertüberwachung programmiert, aber die kriegt die hohen Drücke gar nicht erfasst. Ich habe bereits die Dämpfungszeiten für die Grenzwertüberwachung in der SPS gesenkt und die Grenzwerte in der SPS leicht unter die Auslösedrücke der VPS gelegt. Das hat leider nicht geholfen.
Meine Idee ist nun an einen LBP MSg8 Baustein die eingestellten Grenzwerte direkt, also ohne Glättung oder Dämpfung, mit dem Prozesswert zu vergleichen und den Enable Eingang des Bausteins nur zu aktivieren, wenn die negative Flanke des NotHalt Signals anliegt. Also den Baustein nur einen Zyklus aufzurufen, damit ich nur das initiale Ereignis speichere. Das scheint zumindest mit der PLCSIM zu funktionieren.
Aber wie quittiere ich die Meldung wieder?
Wir haben am Schaltschrank einen Taster der in Kombination mit einem Schlüsselschalter die Sicherheitsrelais quittiert. Vielleicht könnte ich damit den Baustein nochmal für einen Zyklus aktivieren und mit dem gleichen Bit den Rest beschalten.
Das klingt für mich aber irgendwie nicht nach einer guten Lösung. Hat jemand eine bessere Idee?

Herzliche Grüße
Uwe1751358656098.png
 

Anhänge

  • 1751355345773.png
    1751355345773.png
    31,9 KB · Aufrufe: 39
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde generell den Eingang einlesen und in eine Hilfsvariable speichern. Mit der Flanke des Not-Halt schreibst du nun die Hilfsvariable in eine neue Variable - diese beinhaltet dann sicher den Wert (oder Zustand), der zum Auslösen geführt hat.
Den Baustein bedingt aufzurufen wäre so gar nicht mein Ansatz. So kannst du dann auch problemlos das Rücksetzen umsetzen ...
 
diese beinhaltet dann sicher den Wert (oder Zustand), der zum Auslösen geführt hat.
Da bin ich nicht so sicher.
In der neuen Variable, nennen wir sie P_NotHalt, steht doch dann der Wert, der zum Zeitpunkt des NotHalt aktuell war und zwar für 4 Drucksensoren. Bitte habt im Hinterkopf, dass die 4 Drucksensoren nur ein Beispiel sind. In der Anlage handelt es sich um 11 Sensoren, die unterschiedliche Größen messen (neben Druck, Temperatur, Gaskonzentration, Wächtersignale von Brandmelder etc.).
Müsste ich den Wert, der in P_NotHalt steht nicht noch mit dem Grenzwert für die NotHalt Auslösung vergleichen? Wenn nur einer der 4 Drucksensoren im (NotHalt)Zyklus den Maximaldruck gesehen hat, funktioniert das, aber was mache ich, wenn 2 oder mehr Sensoren den Maximalwet überschritten haben. Könnte ich über einen Zeitstempel weiterkommen?
 
Naja ... da du ja schreibst, dass du mit der Not-Halt-Flanke keinen passenden Wert einliest mutmaße ich mal, dass du mit der Umsetzung deiner Programmierung etwas unglücklich gelöst hast.
Ich würde, wie schon geschrieben, die fraglichen Werte (jeden einzeln für sich) permanent zwischenspeichern und bei Not-Halt (Flanke !!!) dann umspeichern (auch wieder jeden einzeln für sich). Anschließend kannst du dann ja auswerten wer am Ende verantwortlich war.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Idee mit dem Messwertpuffer hatte ich auch schon. Ich kam nur nicht drauf, den aktuellen Messwert mit der Flanke des NotHalt wegzuschreiben. Das erscheint mir sehr logisch und besser als meine Lösung.
Ich versuche es erstmal so. Die Pufferung der Messwerte habe ich gewählt, damit wir den Verlauf kurz vor dem Ereignis noch auswerten können.
Was hältst du davon?
1753344504266.png
Code:
REGION Init
    // Statement section REGION
    //
    #Inst_R_TRIG_startUp(CLK := #SPS_Neustart);
    
    IF #Inst_R_TRIG_startUp.Q OR #Reset OR #statZykluszähler > 100 THEN
        #statZykluszähler := 0;
        #stati := 0;
        #statEnable := true;
        
    END_IF;
    
END_REGION

REGION Werte speichern
    // Statement section REGION
    //
    #stati := #statZykluszähler;
    IF #statZykluszähler < 101 AND #statEnable THEN
        #Messwertpuffer[#stati] :=#Pufferwert;
    END_IF;
    
END_REGION

REGION Zykluszähler
    // Statement section REGION
    //
    IF #statEnable THEN
        #statZykluszähler := #statZykluszähler + 1;
    END_IF;
    
END_REGION
REGION Auslösewert speichern und Aufzeichnung beenden
    
    //
    #inst_R_TRIG_Auslösewert(CLK := #Trigger);
    
    IF #inst_R_TRIG_Auslösewert.Q THEN
        // Wert der zum Zeitpunkt des Eintretens der Triggerbedingung aktuell war speichern
        #Auslösewert := #Pufferwert;
        //Aufzeichnung der Messwerte beenden, damit sie nicht von Werten nach dem Ereignis überschrieben werden
        #statEnable := false;
    END_IF;
        
        
END_REGION
REGION #Reset
    // Statement section REGION
    //
    IF #Reset THEN
        FOR #stati := 0 TO 100 DO
            #Messwertpuffer[#stati] := 0;
        END_FOR;
    END_IF;
    
END_REGION
 
Zurück
Oben