Step 7 Vergleicherbausteine

Midav

Level-1
Beiträge
30
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich möchte ein Analogwert ( Niveau 0-30cm )

abfragen zB. 0-5 cm 5-10 cm 10-15 cm 15-20 cm usw.

Es soll immer nur ein Merker angesteuert werden bei 0-5cm / 5-10 cm / 10-15- cm .......
wenn das Niveau in diesem Bereich liegt

Ich müsste mir dann einzelne Vergleicher nehmen für die Bereiche und auf Merker legen und diese dann wiederum mit UND bzw. UND NICHT
verknüpfen um so dann ein Ergebniss abzuleiten

Frage gibt es bei Step 7 eventuell einen fertigen Baustein der mehrere Ausgänge hat für einzelne Bereiche die man parametrieren könnte ?

Grüsse Michael
 
Hallo Michael,

leider ist es so, dass du für mehrere Vergleiche auch mehrerer Vergleicher brauchst. ;)
Eine fertige Funktion wirst du so nicht finden.

Je nach Verwendung deiner Schaltung, solltest du noch berücksichtigen, was passiert wenn dein Analogwert leichten Wellengang hat.
Wie schnell dürfen deine „Merker“ umschalten?
Schau mal hier: https://de.wikipedia.org/wiki/Hysterese#Zweipunktregler

LG Cassandra
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum Bleistift:
Code:
//   Niveau 0-30cm; zB. 0-5cm / 5-10 cm / 10-15- cm
//   Niveau vom DatenTyp INT (!), enthält Niveau in mm
CASE Niveau OF  
250..300:
    MBx := 32;  // Mx.5 
200..250:
    MBx := 16;  // Mx.4 
150..200:
    MBx := 8;   // Mx.3 
100..150:
    MBx := 4;   // Mx.2 
50..100:
    MBx := 2;   // Mx.1 
0..50:
    MBx := 1;   // Mx.0 
ELSE
    MBx := 0;   // löscht Mx.0 .. Mx.7 bei BereichsÜberschreitung
END_CASE;
// Anm.: Mx.6 und Mx.7 sind hiermit auch belegt und stehen nicht für andere Zwecke zur Verfügung!
oder
Code:
//   Niveau 0-30cm; zB. 0-5cm / 5-10 cm / 10-15- cm
//   Niveau vom DatenTyp INT, DINT oder REAL, enthält Niveau in cm
IF Niveau < 0 THEN        // bei REAL 0.0
    MBx := 64;            // Mx.6 Unterlauf
ELSIF Niveau < 5 THEN     // bei REAL 5.0
    MBx := 1;             // Mx.0 
ELSIF Niveau < 10 THEN    // bei REAL 10.0
    MBx := 2;             // Mx.1 
ELSIF Niveau < 15 THEN    // bei REAL 15.0
    MBx := 4;             // Mx.2 
ELSIF Niveau < 20 THEN    // bei REAL 20.0
    MBx := 8;             // Mx.3 
ELSIF Niveau < 25 THEN    // bei REAL 25.0
    MBx := 16;            // Mx.4 
ELSIF Niveau <= 30 THEN   // bei REAL 30.0
    MBx := 32;            // Mx.5 
ELSE  
    MBx := 128;           // Mx.7 Überlauf
END_IF;
oder
Code:
//   Niveau 0-30cm; zB. 0-5cm / 5-10 cm / 10-15- cm
//   Niveau vom DatenTyp INT, DINT oder REAL, enthält Niveau in cm
IF Niveau < 0 THEN        // bei REAL 0.0
    MBx := 64;            // Mx.6 Unterlauf
ELSIF Niveau >= 30 THEN   // bei REAL 30.0
    MBx := 128;           // Mx.7 Überlauf
ELSE  
    MBx := SHL (IN:=1, N:=Niveau / 5); // bei REAL  SHL (IN:=1, N:=REAL_TO_INT(Niveau / 5.0))
                                       // bei DINT  SHL (IN:=1, N:=DINT_TO_INT(Niveau / 5))
END_IF;
 
Zuletzt bearbeitet:
Ohne Hysterese ist das ganz schlecht. Das kann man aber mit Heinileinis Beispielen auch hin bekommen, in dem man Lücken zwischen den Bereichen lässt. "MBx" muss dann natürlich zwingend remanent sein.

Code:
//   Niveau 0-30cm; zB. 0-5cm / 5-10 cm / 10-15- cm
//   Niveau vom DatenTyp INT (!), enthält Niveau in mm
CASE Niveau OF
    260..310:
        MBx := 32;  // Mx.5 
    210..240:
        MBx := 16;  // Mx.4 
    160..190:
        MBx := 8;   // Mx.3 
    110..140:
        MBx := 4;   // Mx.2 
    60..90:
        MBx := 2;   // Mx.1 
    10..40:
        MBx := 1;   // Mx.0 
    ELSE
        MBx := 0;   // löscht Mx.0 .. Mx.7 bei BereichsÜberschreitung
END_CASE;
// Anm.: Mx.6 und Mx.7 sind hiermit auch belegt und stehen nicht für andere Zwecke zur Verfügung!
 
Zuletzt bearbeitet:
Ohne Hysterese ist das ganz schlecht.
Sicherlich - wurde ja auch schon in #2 angesprochen. Aber mindestens genauso schlecht finde ich, wenn der TE diese Erfahrung nicht selbst macht, sondern davor bewahrt wird.
Er soll jetzt erstmal die Erfahrung machen, dass man sich auch leicht selbst etwas überlegen und programmieren kann und nicht so lange das WWW nach dem passenden, parametrierbaren Baustein durchsuchen muss, bis sich die Aufgabenstellung - wodurch auch immer - von selbst erledigt hat.
 
Zuletzt bearbeitet:
Hallo,

Das Thema hätte sich super zu einem „Programmierwettbewerb“ geeignet! :ROFLMAO:

Dass die Hysterese nicht jedem SPS-Programmierer bekannt ist, schockt mich immer wieder. Solange es ein Meldelampe ist, die nervös flackert, ist das ja noch kein Problem. Bei größeren Geräten kann man aber auch recht schnell großen Schaden anrichten.

Hier ein Link, der das Prinzip für Anfänger noch etwas besser erklärt:
https://blog.wika.de/know-how/schaltfunktion-hysterese-bei-elektronischen-druckschaltern/

Zusätzlich zur Hysterese kann auch noch eine Verzögerungs-Zeit sinnvoll sein. ;)

Gruß
Chräshe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Thema hätte sich super zu einem „Programmierwettbewerb“ geeignet! :ROFLMAO:
... und es eignet sich immer noch.

"MBx" muss dann natürlich zwingend remanent sein.
Muss es, aber man muss es auch sinnvoll auswerten - insbesondere, wenn die eingelesenen Werte sich erdreisten, von Loch zu Loch der SchweizerKäse-Abfrage zu hüpfen.
Aber diese Erfahrung muss sogar Onkel Dagobert noch machen ... (?)
Das Thema Hysterese ist gar nicht sooo weit vom Thema FlankenErkennung entfernt, wie man es sich auf den ersten Blick vllt wünscht.
 
Code:
//   Niveau 0-30cm; zB. 0-5cm / 5-10 cm / 10-15- cm
//   Niveau vom DatenTyp INT (!), enthält Niveau in mm
CASE Niveau OF
    260..310:
        MBx := 32;  // Mx.5 
    210..240:
        MBx := 16;  // Mx.4 
    160..190:
        MBx := 8;   // Mx.3 
    110..140:
        MBx := 4;   // Mx.2 
    60..90:
        MBx := 2;   // Mx.1 
    10..40:
        MBx := 1;   // Mx.0 
    ELSE
        MBx := 0;   // löscht Mx.0 .. Mx.7 bei BereichsÜberschreitung
END_CASE;
// Anm.: Mx.6 und Mx.7 sind hiermit auch belegt und stehen nicht für andere Zwecke zur Verfügung!
Heinileini möchte bestimmt auf folgende 5 Lücken ansprechen:
241..259
191..209
141..159
91..109
41..59


Startet die Steuerung, während der Sensor in einem der 5 Bereiche steht, ist die Auswertung höchst wahrscheinlich fehlerhaft!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.. Startet die Steuerung, während der Sensor in einem der 5 Bereiche steht, ist die Auswertung höchst wahrscheinlich fehlerhaft!
Sehr spitzfindig! [FONT=Verdana,Arial,Tahoma,Calibri,Geneva,sans-serif]Da ist natürlich was dran. Mit Remanenz und gefilterten Analogwerten muss man sich um solch einen dreisten Hüpfer allerdings wenig Gedanken machen.[/FONT]
 
Sehr spitzfindig! [FONT=Verdana,Arial,Tahoma,Calibri,Geneva,sans-serif]Da ist natürlich was dran. Mit Remanenz und gefilterten Analogwerten muss man sich um solch einen dreisten Hüpfer allerdings wenig Gedanken machen.[/FONT]

Sich auf Remanenz zu verlassen ist dünnes Eis.
Bei uns gab es einen ähnlichen Code bei einer ext. Anlage an einem Depalletierer.
Es gehört auf jedem Fall eine Fehlerbehandlung bzw. Initialisierungroutine dazu.
Bei Bereichsüberschreitung auf 0 zu setzen ist auch keine sehr gute Idee.

So genug kritisiert :ROFLMAO:

Gruß
Blockmove
 
Zurück
Oben