Ausgänge im Binärcode nach 1aus N

  • Hallo Spezialisten,
    ich möchte einen Gruppe von 8 Outputs die binär codiert sind


    SIGNAL NEW_OUT $OUT[100] TO $OUT[107]


    in 1 aus N bringen.


    d.h. ich möchte das ich die Signale nicht über XOR (ganz andere Wertetabelle) verbinde sondern
    das immer ein Signal im Bitmuster steht.


    Beispiel: Der Dezimalwert 3 ist ja gleich 00000011 binär codiert angezeigt
    Es soll aber 00000100 sein.


    Hintergrund ist folgender - Ich möchte damit erreichen, das immer nur ein Ausgang = True ist ohne jedesmal
    eine aufwendige Plausibilität zu programmieren.


    Wer hat hier schon seine Erfahrung gemacht? Wie stell ich's am besten an?


    gruß olaf

  • Schritt für Schritt zum Roboterprofi!
  • Da Du nur die 8 Ausgänge hast und nur einen Ausgang schalten willst, kannst Du ja nur "Dezimalwerte" von 0 bis 8 ausgeben.
    Das würde ich einfach mit ner Switch Anweisung machen.
    In der Switch Anweisung fragst Du den Dezimalwert ab (der ja irgendwo gespeichert sein muss) und weist dann Deinen 8 Ausgängen den passenden Wert zu. In etwa:


    Wert = Variable mit Dezimalwert
    Ausgang = Dein Gruppenausgang


    SWITCH Wert
    CASE 0 Ausgang = 0
    CASE 1 Ausgang = 1
    CASE 2 Ausgang = 4
    CASE 3 Ausgang = 8
    CASE 4 Ausgang = 16
    CASE 5 Ausgang = 32
    CASE 6 Ausgang = 64
    CASE 7 Ausgang = 128
    CASE 8 Ausgang = 256
    END SWITCH


    Nagel mich aber nicht auf die Syntax fest! :-|

    Gruss<br /><br />Dodo

  • Hallo,


    bei einem Byte mag die Sache in einer switch case Anweisung OK sein, bei mehr wird es unuebersichtlich.


    In KRL gibt es leider keinen Exponenten, trotzdem kann man die Sache einfach loessen.


    Code
    if (wert > 0) AND (wert < 9) then
      m_iAusgang = 1 ; 2exp0
      for ii = 2 to wert
        M_iAusgang = M_iAusgang * 2
      endfor  
    else
      M_iAusgang = 0
    endif
    AO_Ausgang = M_iAusgang



    wenn man stat Signal einen Integer verwendet geht´s noch kuerzer:


    Code
    for n= 1 to 8
      $out[DO_StartBit + n  - 1] = FALSE
    endfor
    if (Wert > 0) and (Wert <  9) then
      $out[DO_StartBit - 1 + wert] = TRUE
    endif



    Gruss Stefan

  • stefanM
    Wie definierst Du unübersichtlich? :denk:


    Wenn ich Olaf richtig verstanden habe, reden wir sowieso nur von 8 Ausgängen, die er verwenden will.
    Und solange wir nicht gerade von über 20 Ausgängen reden, finde ich es übersichtlicher, eine lange Switch Anweisung zu haben, die jeder sofort versteht, als eine "Rechenlösung".
    Beim Robbi ist es noch egal, bei ner SPS hättest Du dann noch das Problem, dass Du auch keine Querverweise auf die Ausgänge mehr angezeigt bekommst.
    Von Zykluszeit red ich gar nicht erst!


    Prinzipiell hast Du natürlich recht! :supi:

    Gruss<br /><br />Dodo

  • Na ja über ein "Schiebe links" wäre das alles noch einfacher :P


    Leider hat sich bei DODO noch ein kleiner Verrücker eingeschlichen:


  • Ich danke für Eure Mithilfe!


    StefanM:die mathmatische Lösung ist sehr gut, wenn ich diese im Expertenbereich integrieren würde und mehr als 8 Ausgänge benutze.


    Der Kunde möchte eine übersichtliche unkomplizierte Anwendung und transparenz in der Programmierung wo es möglich ist.
    Deshalb ist die Switch Case Lösung für mich derzeit der Favorit und für den Kunden mit Basiswissen interessant.


    Danke
    Gruß Olaf


  • Na ja über ein "Schiebe links" wäre das alles noch einfacher :P


    Leider hat sich bei DODO noch ein kleiner Verrücker eingeschlichen:


    AUA! Hatte mich auch schon über die 256 gewundert! :wallbash: :wallbash: :wallbash: :denk: :denk: :denk:

    Gruss<br /><br />Dodo


  • Olaf, Du formulierst das sehr gut! :supi:


    Mir ist es schon oft passiert, dass eine Berechnung oder eine Schleife und ähnliche "Hochsprachen-Formulierungen" natürlich wesentlich flexibler, eleganter und für den erfahrerenen Programmierer auch übersichtlicher sind.
    Aber leichter lesbar und vielleicht auch besser zu ändern sind solche Konstrukte schon. Gerade für Anwender.
    Ich programmiere ja auch viel SPS, da muss ein Instandhalter so was auch nachvollziehen können!

    Gruss<br /><br />Dodo

  • Hallo,


    wie wärs mit


    ===========================================================
    $config.dat
    ===========================================================


    SIGNAL AUSGANG $OUT[1] TO $OUT[8]


    DECL INT AUSG[8]
    AUSG[1]=1
    AUSG[2]=2
    AUSG[3]=4
    AUSG[4]=8
    AUSG[5]=16
    AUSG[6]=32
    AUSG[7]=64
    AUSG[8]=128



    ===========================================================
    Hauptprogramm:
    ===========================================================


    AUSGANG = AUSG[3]



    sieht doch auch "schön" aus...

    Kleinere Wunder werden sofort erledigt... größere nach der Mittagspause...

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden