Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: 3 Word Vergleicher

  1. #1
    Registriert seit
    14.06.2007
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren 3 Word Vergleicher  

  2. #2
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    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...30&postcount=6
    Geändert von zotos (14.06.2007 um 07:38 Uhr)
    If you open your Mind too much, your Brain will fall out.

  3. #3
    M.Schlichting ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.06.2007
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  4. #4
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    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

  5. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Zitat Zitat von M.Schlichting Beitrag anzeigen
    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.p...highlight=Sort

    Oder siehe oben, das war schneller da !
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #6
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    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.
    If you open your Mind too much, your Brain will fall out.

  7. #7
    Registriert seit
    23.08.2004
    Beiträge
    565
    Danke
    73
    Erhielt 19 Danke für 18 Beiträge

    Standard

    Zitat Zitat von M.Schlichting Beitrag anzeigen
    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
    Geändert von Bender25 (14.06.2007 um 10:32 Uhr)

  8. #8
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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;
    If you open your Mind too much, your Brain will fall out.

Ähnliche Themen

  1. Vergleicher?
    Von Andreas im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 13.04.2010, 13:05
  2. Vergleicher in S7
    Von Bollmann im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 30.07.2009, 14:35
  3. Zähler = Word -> Vergleicher = int ???
    Von max1de im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.04.2009, 14:55
  4. Vergleicher mit Step 7
    Von KingGanja im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 13.01.2009, 15:04
  5. Problem mit vergleicher
    Von CrackerJack1 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 11.10.2007, 18:35

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •