# Füllstandsüberwachung bei stetig sinkenden Füllstand



## FingerJoe (29 September 2021)

Der Füllstand des Behälters sinkt pro Stunde um 1 %. Das ist normal. Nun möchte ich aber einen Alarm anstehen haben wenn der Füllstand pro Stunde um 5 % sinkt. 

Vorhanden ist eine analoge Füllstandsmessung die auf PCS7 übertragen wird.

Wie kann ich das im PCS7 umsetzen das ein Alarm ansteht wenn der Füllstand pro Stunde um 5 % sinkt.

Bitte um Hilfe


----------



## Plan_B (29 September 2021)

In konstanten zeitlichen Abständen den Füllstand ermitteln. Die Differenz ist die Änderung in der Zeit. Große Differenz= Große Änderung.
Schwellwert setzen und Vergleichen. Alarmbit setzen.


----------



## Thomas_v2.1 (29 September 2021)

Das ist z.B. im MonAnL der PCS7 APL schon integriert, und nennt sich dort Gradientenüberwachung. Das kannst du zwar nicht direkt so parametrieren wie du es vorhast, aber ich würde es mir einmal ansehen.


----------



## FingerJoe (30 September 2021)

Danke für die Antworten.
Thomas für eine weitere Prognose über die Gradientenüberwachung würde ich mich freuen.


----------



## Frohnius (30 September 2021)

wie Plan_B das schon beschreibt ....
ich benötige solche funktionen öfters und mache das wie folgt :

real-array in der benötigten größe anlegen und z.b. im minutentakt messen ...


```
FUNCTION rotateRealArray : BOOL // Rotate Real Array beliebiger Länge um eins nach oben
VAR_INPUT
    pt: POINTER TO ARRAY [1..32000] OF REAL ;
    size: UINT;
    new:REAL; // Neuer Wert für array[1]
END_VAR

VAR

    i: UINT;

    ende: UINT;
END_VAR

ende:=size/4  ;

FOR i:=ende TO 2 BY -1 DO
 pt^[i]:=pt^[i-1];
END_FOR
pt^[1]:=new;
rotateRealArray:=TRUE;
```

^^ aufruf nach definition "FuellData:=ARRAY[1..60] of REAL;" mit 
rotateRealArray(ADR(FuellData),SIZEOF(FuellData),Fuellstand.OUT); // Messwerte Füllstand
um dann z.b. jede minute den aktuellen messwert ins array zu schreiben

mit der nächsten funktion lasse ich mir den kleinsten wert des arrays zurückgeben ....


```
FUNCTION minArray: REAL; // gibt den kleinsten wert des real-arrays zurück
// aufruf mit minwert:=minArray(ADR(a),SIZEOF(a));

VAR_INPUT
    pt: POINTER TO ARRAY [1..32000] OF REAL ;
    size: UINT;
END_VAR

VAR
    i:UINT;
    
    ende: UINT;
END_VAR

ende:=size/4;
minArray:=pt^[1];
FOR i:= 1 TO ende DO
    IF minArray > pt^[i] THEN
        minArray:= pt^[i];
    END_IF
END_FOR
```

eine maxArray oder mittelArray funktion bringst du bestimmt selber hin ...

ich mache das mit pointern und size, damit es mit jeder REAL-array größe funktioniert ...


----------



## ducati (30 September 2021)

FingerJoe schrieb:


> Wie kann ich das im PCS7 umsetzen das ein Alarm ansteht wenn der Füllstand pro Stunde um 5 % sinkt.





Frohnius schrieb:


> ich benötige solche funktionen öfters und mache das wie folgt :
> 
> real-array in der benötigten größe anlegen und z.b. im minutentakt messen ...


er will das halt in PCS7 machen!

Bei PCS7 gibts in aller Regel klare Regeln, wie der Programmierstil auszusehen hat.

Von daher ist der Vorschlag von Thomas der Richtige, zumindest falls die APL zum Einsatz kommt.

Irgendwelche selbstgeschriebenen Bausteine zu verwenden, ist in PCS7 meistens nicht gewünscht. Und wenn, dann muss man sich u.U. an nen bestimmten styleguide halten...


----------



## Frohnius (1 Oktober 2021)

ahhh, sry pcs7 hab ich überlesen


----------

