3 Word Vergleicher

M.Schlichting

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

ich habe folgendes Problem:

Ich möchte einen vergleicher Programmieren der mir 3 Wörter vergleich. Oder gibt es sowas fertig?
Hat irgendjemand eine anregung für mich?

Danke im vorraus.


Gruß Marcel
 
Bei einen Vergleicher der zwei Werte vergleicht ist ja das Ergebnis meist BOOL.

a > b

ergibt bei a größer b true und andernfalls false
Wenn man nun drei Werte am Eingang hat braucht man auch einen Rückgabewert der das wiederspiegeln kann.

Das kann man z.B. als integer machen in dem man die Nummer des Größten oder des kleinsten Wertes anzeigt.

Auf was würdest DU denn gerne Vergleichen >, >=, <, <=
wenn DU auf gleich testen möchtest reicht auch ein Bool als Rückgabewert.



Als Anregung kann man nich schon mal das ankucken:
http://www.sps-forum.de/showpost.php?p=85730&postcount=6
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort.

Es geht um folgendes:

Ich habe drei Pumpen mit 3 Schwimmerschaltern. 1 Schalter = 1 Pumpe 2 Schalter = 2 Pumpen 3 Schalter = 3 Pumpen.

Jetzt soll es aber so sein das wenn immer nur der erste Schwimmerschalter betätigt wird nicht immer die gleiche Pumpe laufen soll. Dazu wollte ich die Betriebsstunden erfassen und vergleichen. Aus das Vergleichungsergebnis muss mir die Pumpe raus geben mit dem kleinsten wert. Dazu habe ich mir schonmal den FC 27 geschaut. Aber irgendwie funktioniert er nicht. Was muss ich für Werte auf die Ein und Ausgänge des Baustein schalten. In welchen format und was ist mit "
Parameter wie “MD20“ sind ebenfalls zulässig; dazu muss“MD20“ aber in “Symbol“ mit dem entsprechenden Datentyp definiertwerden.

" gemeint?


Danke.
 
Kenne den FC27 nicht, aber warum nicht in der Art wie:

SET
R BED_P1
R BED_P2
R BED_P3

U(
L BS1
L BS2
<=R
)
U(
L BS1
L BS3
<=R
)
=BED_P1
SPB M001

U(
L BS2
L BS1
<=R
)
U(
L BS2
L BS3
<=R
)
=BED_P2
SPB M001

SET
=BED_P3

M001: NOP 0

Kann man mit Integer natürlich auch machen.
BSx sind die Betriebsstunden
BED_Px ist die Startbedingung der jeweiligen Pumpe
 
Danke für die schnelle Antwort.

Es geht um folgendes:

Ich habe drei Pumpen mit 3 Schwimmerschaltern. 1 Schalter = 1 Pumpe 2 Schalter = 2 Pumpen 3 Schalter = 3 Pumpen.

Jetzt soll es aber so sein das wenn immer nur der erste Schwimmerschalter betätigt wird nicht immer die gleiche Pumpe laufen soll. Dazu wollte ich die Betriebsstunden erfassen und vergleichen. Aus das Vergleichungsergebnis muss mir die Pumpe raus geben mit dem kleinsten wert. Dazu habe ich mir schonmal den FC 27 geschaut. Aber irgendwie funktioniert er nicht. Was muss ich für Werte auf die Ein und Ausgänge des Baustein schalten. In welchen format und was ist mit "
Parameter wie “MD20“ sind ebenfalls zulässig; dazu muss“MD20“ aber in “Symbol“ mit dem entsprechenden Datentyp definiertwerden.

" gemeint?


Danke.

Wo liegen denn deine Daten?
Wenn du sie als DINT definiert hast, in DB 1, DBD 0, DBD4, DBD8, DBD12

Wert 1 : P#DB1.DBX 0.0 DINT 1
Wert 2 : P#DB1.DBX 4.0 DINT 1
Wert 3 : P#DB1.DBX 8.0 DINT 1
RET_VAL : P#DB1.DBX 12.0 DINT 1

Als MD10, dann muß in der Symboliktabelle für MD10 eine Symolik und der Datentyp DINT eingetragen sein.

Das wäre aber erst die halbe Miete, du bekommst als Ergebnis den kleinsten Wert, aber nicht, welche Pumpe das ist, also wäre nun noch ein Vergleich mit den Werten der 3 Pumpen fällig, um herauszubekommen, welche Pumpe, diesen Wert denn nun hat.

Deshalb würde ich das gleich mit Vergleichern "zu Fuß" programmieren, da kannst du immer mitführen, welche Pumpe gerade die kleinste ist.

Sieh dir das hier mal an: http://www.sps-forum.de/showthread.php?t=1918&highlight=Sort

Oder siehe oben, das war schneller da :ROFLMAO:!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Aufgabe würde ich so lösen:

Wenn Schwimmer 3
-> Alle Pumpen an

Wenn Schwimmer 2 und nicht 3
-> Alle Pumpen an bis auf die mit den höchsten Betriebsstunden

Wenn Schwimmer 1 und nicht 2 und nicht 3
-> Alle Pumpen aus bis auf die mit den geringsten Betriebsstunden


Es ist noch zu berücksichtigen das die Betriebsstunden gleich sein können dann muss man eben dementsprechende Präferenzen berücksichtigen.

In ST/SCL würde mir das auch nicht schwer fallen.
 
FC 27 geschaut. Aber irgendwie funktioniert er nicht. Was muss ich für Werte auf die Ein und Ausgänge des Baustein schalten. In welchen format und was ist mit "
Parameter wie “MD20“ sind ebenfalls zulässig; dazu muss“MD20“ aber in “Symbol“ mit dem entsprechenden Datentyp definiertwerden.

" gemeint?


Danke.

Mit dem FC27 geht das. Habs eben getestet. Als Ergebnis bekommst du den kleinsten wert. In deinem Fall die Pumpe mit den niedrigsten Betriebsstunden


Mit dem Symbol ist gemeint, das du z.b. das Merkerwort 20 als Int in der der Symboltabelle deklarieren mußt
Sprich du schreibst die Betriebsstunden deiner Pumpen auf Merker (wenn nicht schon geschehen) oder in einen DB

z.b.

Adresse Symbol Datentyp

MW 10 = Betriebsstunden1 >> INT
MW 12 = Betriebsstunden2 >> INT
MW 14 = Betriebsstunden3 >> INT
MW 16 = Ergebnis >> INT
 
Zuletzt bearbeitet:
Meine Lösung in ST (also CoDeSys aber kann man sich leicht in SCL umändern oder ggf. in ALW oder so umschreiben)

Code:
VAR_INPUT
    S_level_1 : BOOL; (* Levelschalter 1 es soll eine Pumpe laufen *)
    S_level_2 : BOOL; (* Levelschalter 2 es sollen zwei Pumpe laufen *)
    S_level_3 : BOOL; (* Levelschalter 3 es sollen drei Pumpe laufen *)
END_VAR
VAR_OUTPUT
    M_pumpe_1 :BOOL; (* Pumpe Nr. 1*)
    M_pumpe_2 :BOOL; (* Pumpe Nr. 2*)
    M_pumpe_3 :BOOL; (* Pumpe Nr. 3*)
END_VAR
VAR
    iBSpumpe1 :INT;  (* Betriebssekunden Pumpe Nr. 1 *)
    iBSpumpe2 :INT;  (* Betriebssekunden Pumpe Nr. 2 *)
    iBSpumpe3 :INT;  (* Betriebssekunden Pumpe Nr. 3 *)
    oszi         :TON;  (* Timer für den Oszzilator *)
    S_level_1old : BOOL; (* Zustandsspeicher für Levelschalter Nr. 1 *)
    S_level_2old : BOOL; (* Zustandsspeicher für Levelschalter Nr. 2 *)
    S_level_3old : BOOL; (* Zustandsspeicher für Levelschalter Nr. 3 *)
END_VAR
Code:
(* Oszzilator für die Betriebssekunden *)
oszi(IN:=NOT oszi.Q, PT:=t#1s);

(* Betriebssekunden hoch zählen *)
IF (oszi.Q) THEN
    IF (M_pumpe_1) THEN
        iBSpumpe1 := iBSpumpe1 + 1;
    END_IF

    IF (M_pumpe_2) THEN
        iBSpumpe2 := iBSpumpe2 + 1;
    END_IF

    IF (M_pumpe_3) THEN
        iBSpumpe3 := iBSpumpe3 + 1;
    END_IF
END_IF

(* Nur bei änderung der Levelschalter Pumpen ansteuerung ändern *)
IF ((S_level_1 <> S_level_1old)
 OR (S_level_2 <> S_level_2old)
 OR (S_level_3 <> S_level_3old)) THEN

    (* Level 3 alle Pumpen an *)
    IF (S_level_3) THEN
        M_pumpe_1 := TRUE;
        M_pumpe_2 := TRUE;
        M_pumpe_3 := TRUE;
    ELSE
        (* Level 2 die Pumpe mit den meisten Betriebsstunden ausschalten den rest anwerfen *)
        IF (S_level_2) THEN
            IF ((iBSpumpe1 >  iBSpumpe2) AND (iBSpumpe1 >  iBSpumpe3)) THEN
                M_pumpe_1 := FALSE;
            ELSE
                M_pumpe_1 := TRUE;
            END_IF

            IF ((iBSpumpe2 >= iBSpumpe1) AND (iBSpumpe2 >  iBSpumpe3)) THEN
                M_pumpe_2 := FALSE;
            ELSE
                M_pumpe_2 := TRUE;
            END_IF

            IF ((iBSpumpe3 >= iBSpumpe1) AND (iBSpumpe3 >= iBSpumpe2)) THEN
                M_pumpe_3 := FALSE;
            ELSE
                M_pumpe_3 := TRUE;
            END_IF
        ELSE
            (* Level 1 die Pumpe mit den wenigsten Betriebsstunden anwerfen die anderen ausschalten *)
            IF (S_level_1) THEN
                IF ((iBSpumpe1 <= iBSpumpe2) AND (iBSpumpe1 <= iBSpumpe3)) THEN
                    M_pumpe_1 := TRUE;
                ELSE
                    M_pumpe_1 := FALSE;
                END_IF

                IF ((iBSpumpe2 < iBSpumpe1) AND (iBSpumpe2 <=  iBSpumpe3)) THEN
                    M_pumpe_2 := TRUE;
                ELSE
                    M_pumpe_2 := FALSE;
                END_IF

                IF ((iBSpumpe3 <  iBSpumpe1) AND (iBSpumpe3 <  iBSpumpe2)) THEN
                    M_pumpe_3 := TRUE;
                ELSE
                    M_pumpe_3 := FALSE;
                END_IF
            ELSE
                (* Level 0 alle Pumpen ausschalten *)
                M_pumpe_1 := FALSE;
                M_pumpe_2 := FALSE;
                M_pumpe_3 := FALSE;
            END_IF
        END_IF
    END_IF
END_IF

(* Um änderungen an den Levelschaltern zu erkennen alte Werte speichern *)
S_level_1old := S_level_1;
S_level_2old := S_level_2;
S_level_3old := S_level_3;
 
Zurück
Oben