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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Minimalwertauswahl bei Codesys

  1. #1
    Registriert seit
    19.02.2010
    Beiträge
    12
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    bin gerade beim programmieren auf folgendes Problem gestossen:
    Ich habe zwölf Analogwerte. Ich will aus den zwölf Analogwerten den werte auswählen der am niedrigsten ist und diese information binär weiterverarbeiten.
    Soll heisen:
    Wert 1=> "3"
    Wert 2=> "4"
    Wert 3=> "5"
    ....
    Wert 12 => "2" soll binär angezeigt werden das der Wert von 12 der niedrigste ist.
    Das Programm müsste also 12 Analoge Eingänge haben und 12 binäre Ausgänge. Eventuell noch einen analogen Ausgang der zeigt welcher wert bei den Eingängen der niedrigste ist.
    Wichtig ist das wenn mehrer Eingänge den gleichen niedrigsten Wert haben immer der erste in der Reihenfolge signalisiert wird. Soll heisen Ausgangsseitig soll immer nur ein binärer Ausgang anstehen.

    Vielleicht hat da einer eine Idee.
    Eventuell in ST oder CFC.
    Danke!
    lg
    Stefan
    Geändert von Don_Travolta (25.02.2010 um 13:40 Uhr)
    Zitieren Zitieren Minimalwertauswahl bei Codesys  

  2. #2
    Registriert seit
    16.10.2007
    Ort
    östliches Ruhrgebiet
    Beiträge
    259
    Danke
    33
    Erhielt 36 Danke für 31 Beiträge

    Standard

    Such mal nach Bubble Sort

  3. #3
    Registriert seit
    13.10.2009
    Beiträge
    61
    Danke
    24
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Sollte eigentlich funktionieren (habs nicht getestet):

    Code:
    VAR_IN
      Wert1,Wert2,Wert3,... : INT;
    END_VAR
    VAR_OUT
      bWert1istMin,bWert2istMin,bWert3istMin, ... : BOOL;
    END_VAR
    VAR
      minWert : INT;
    END_VAR
    -----------
    
    minWert := MIN(Wert1,Wert2,Wert3,...);
    
    IF minWert = Wert1 THEN
      bWert1istMin := TRUE;
    ELSIF minWert = Wert2 THEN
      bWert2istMin := TRUE;
    ELSIF minWert = Wert3 THEN
      bWert3istMin := TRUE;
    ELSIF ...
    END_IF
    Edit: Die Min-Funktion hat wohl doch nur 2 Parameter.
    Könnte man umgehen mit MIN(MIN(MIN(Wert1,Wert2),Wert3),Wert4), ... *hust*

    Edit2:
    Oder statt verschachteltem Aufruf:
    minWert := MIN(Wert1,Wert2);
    minwert := MIN(minWert,Wert3);
    minWert := MIN(minWert,Wert4);
    ...

    Ein Sortieralgorithmus wie von Controllfreak vorgeschlagen würde auch gehen, aber du brauchst die Zahlen ja vermutlich nicht sortiert und dann kann man sich das sparen.
    Geändert von SPSstudent (25.02.2010 um 15:38 Uhr)

  4. #4
    Registriert seit
    16.10.2007
    Ort
    östliches Ruhrgebiet
    Beiträge
    259
    Danke
    33
    Erhielt 36 Danke für 31 Beiträge

    Standard

    SPS Student hat die bessere Lösung.
    Bubble Sort wäre dann besser wenn die Werte in eine an/absteigende Reihenfolge sortiert werden müssten

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    ... wenn die Werte allerdings in einem ARRAY vorliegen (oder vorliegend gemacht werden können), dann liesse sich das mittels einer Schleife wesentlich eleganter (und auch mit weniger Code machen). Vielleicht etwa so :
    Code:
    Suchwert := Liste[1] ;
     
    for i := 1 to 12 by 1 do
       if Liste[i] < Suchwert then
          Suchwert := Liste[i] ;
       end_if ;
    end_for ;
    Gruß
    LL

  6. #6
    Don_Travolta ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.02.2010
    Beiträge
    12
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hy,
    habe mich für die Lösung von SPSstudent entschieden.

    Habe den FB in ST geschrieben und getest. Folgende Fehler sind mir aufgefallen:
    Ich habe 12 Eingänge in Real definiert und 12 Ausgänge in BOOL und zusätzlich einen REAL-Ausgang und mir anzuzeigen wie groß der MINwert ist.
    Wenn ich für die Eingänge 1-12 die Werte 1-12 vorgebe dann wird der Binäreausgang 01 als TRUE siginalisert. Was auch richtig ist da WERT_01 mit "1" der niedrigste Werte ist.
    Wenn ich aber für 1 einen höheren Wert vorgebe sollte jetzt der WERT_02 der niedrigste sein und nur mehr der Ausgang 02 mit TRUE signalisiert werden. Es beleibt aber der Ausgang 01 weiter mit TRUE anstehen. Gleiches passiert wenn ich jetzt den Eingang 02 erhöhe.
    Wo liegt da das Problem? Vielleicht kann mir wer helfen.

    Danke!
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren Macht a bisserle Probleme  

  7. #7
    Registriert seit
    19.12.2008
    Beiträge
    336
    Danke
    19
    Erhielt 28 Danke für 28 Beiträge

    Standard

    Zitat Zitat von Don_Travolta Beitrag anzeigen
    habe mich für die Lösung von SPSstudent entschieden.
    So wie ich das sehe hast du das nicht getan - die genannte Lösung würde aus meiner Sicht nämlich funktionieren.

  8. #8
    Registriert seit
    20.10.2007
    Ort
    Krauchthal
    Beiträge
    48
    Danke
    4
    Erhielt 6 Danke für 6 Beiträge

    Standard

    so wie du es gelöst hast, setzt du einmal den niedrigsten Wert.
    bWert1istMin
    ändert sich aber nun der niedrigste Wert bleibt dieses Bit immer noch gesetzt plus das neue niedrigste kommt dazu.
    Das heisst du musst z.B. zuerst alle Bits auf FALSE setzten und dann die Zuweisung machen

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    ... ich sehe das so wie Chrigu.
    Das könntest du aber zum Beispiel so ähnlich umgehen :
    Code:
    binWert_01 ;= (minWert = Wert_01) ;
    binWert_02 ;= (minWert = Wert_02) ;
    usw.
    Gruß
    LL

  10. #10
    Don_Travolta ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.02.2010
    Beiträge
    12
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Also ich habe das Programm von SPSstudent 1:1 abgeschrieben.
    ICh habe leider keine Erfahrung in ST. Programmiere sonst immer in CFC/Logicad und da gibts für das ein Modul.
    In Codesys muß ich leider selbe etwas schnitzen.

    Hier mal mein Programmcode:
    MINWERT := MIN(WERT_01,WERT_02);
    MINWERT := MIN(MINWERT,WERT_03);
    MINWERT := MIN(MINWERT,WERT_04);
    MINWERT := MIN(MINWERT,WERT_05);
    MINWERT := MIN(MINWERT,WERT_06);
    MINWERT := MIN(MINWERT,WERT_07);
    MINWERT := MIN(MINWERT,WERT_0;
    MINWERT := MIN(MINWERT,WERT_09);
    MINWERT := MIN(MINWERT,WERT_10);
    MINWERT := MIN(MINWERT,WERT_11);
    MINWERT := MIN(MINWERT,WERT_12);


    IF MINWERT = WERT_01 THEN
    BIN_WERT_01 := TRUE;
    ELSIF MINWERT = WERT_02 THEN
    BIN_WERT_02 := TRUE;
    ELSIF MINWERT = WERT_03 THEN
    BIN_WERT_03 := TRUE;
    ELSIF MINWERT = WERT_04 THEN
    BIN_WERT_04 := TRUE;
    ELSIF MINWERT = WERT_05 THEN
    BIN_WERT_05 := TRUE;
    ELSIF MINWERT = WERT_06 THEN
    BIN_WERT_06 := TRUE;
    ELSIF MINWERT = WERT_07 THEN
    BIN_WERT_07 := TRUE;
    ELSIF MINWERT = WERT_08 THEN
    BIN_WERT_08 := TRUE;
    ELSIF MINWERT = WERT_09 THEN
    BIN_WERT_09 := TRUE;
    ELSIF MINWERT = WERT_10 THEN
    BIN_WERT_10 := TRUE;
    ELSIF MINWERT = WERT_11 THEN
    BIN_WERT_11 := TRUE;
    ELSIF MINWERT = WERT_12 THEN
    BIN_WERT_12 := TRUE;
    END_IF;


    so wie ich das verstehe fehlt mir da also noch was.
    lg

Ähnliche Themen

  1. CoDeSys
    Von doug82 im Forum PC- und Netzwerktechnik
    Antworten: 6
    Letzter Beitrag: 02.11.2011, 21:29
  2. EoE mit CoDeSys 3.4 sp3
    Von HomerX im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 07.06.2011, 10:54
  3. CodeSys
    Von Mark4you im Forum Suche - Biete
    Antworten: 6
    Letzter Beitrag: 01.02.2011, 10:28
  4. CodeSys und S7
    Von Tommi im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 19.12.2010, 20:32
  5. CoDeSys
    Von Gast im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 16.06.2006, 21:35

Lesezeichen

Berechtigungen

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