EXOR mit 4 Bedingungen

  • Schritt für Schritt zum Roboterprofi!
  • würde mal behaupten, daß das ein klassiches "nimmer" ist.

    Wolfram (Cat) Henkel

    never forget Asimov's Laws at the programming of robots...

    "Safety is an integral part of function. No safety, no production. I don't buy a car without brakes."


    Messages und Mails mit Anfragen wie "Wie geht das..." werden nicht beantwortet.

    Diese Fragen und die Antworten interessieren jeden hier im Forum.


    Messages and Mails with questions like "how to do..." will not be answered.

    These questions and the answers are interesting for everyone here in the forum.

  • Hi,


    wie für viele andere Fragen im Forum gilt auch hier: Doku lesen hilft meistens weiter !


    Dort steht nämlich (unter "Prioritäten von Operatoren") :
    Grundsätzlich gilt:
    - Geklammerte Ausdrücke werden zuerst bearbeitet.
    - Bei ungeklammerten Ausdrücken wird in der Reihenfolge der Priorität ausgewertet.
    - Verknüpfungen mit Operatoren gleicher Priorität werden von links nach rechts ausgeführt.


    Bei deiner Fragestellung ($IN[1] EXOR $IN[2] EXOR $IN[3] EXOR $IN[4])
    kommt also der dritte Grundsatz zum tragen, d.h. der Ausdruck entspricht:
    ((($IN[1] EXOR $IN[2]) EXOR $IN[3]) EXOR $IN[4])


    Ein einfacher (aber mühsamer) Weg herauszubekommen was da nun wirklich passiert,
    ist das Aufstellen einer entsprechenden Tabelle:


    $IN[1] $IN[2] $IN[3] $IN[4] Ergebnis 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0
    (bitte mal nachrechnen !)


    In Worten: Das Ergebnis ist 1 (=True) wenn
    - genau ein einzelner Eingang 1 ist, oder
    - drei (beliebige) Eingänge 1 sind


    Es gibt bestimmt auch eine einfachere algebraische Methode um das zu bestimmen,
    ist bei mir aber schon ein paar Jahrzehnte her... :wallbash:


    gruß
    rmac

    Einmal editiert, zuletzt von rmac ()

  • Da sieht man, wo es hinführt, aus dem Bauch raus zu antworten.
    rmac hat natürlich Recht.


    :beerchug:

    Wolfram (Cat) Henkel

    never forget Asimov's Laws at the programming of robots...

    "Safety is an integral part of function. No safety, no production. I don't buy a car without brakes."


    Messages und Mails mit Anfragen wie "Wie geht das..." werden nicht beantwortet.

    Diese Fragen und die Antworten interessieren jeden hier im Forum.


    Messages and Mails with questions like "how to do..." will not be answered.

    These questions and the answers are interesting for everyone here in the forum.


  • Hallo,


    wie erreiche ich dann, dass in dieses IF gesprungen wird,wenn nur ein einziger Eingang dieser 4 da ist!


    $CYCFLAG


    Kannst Du die Eingänge als Gruppeneingang definieren?


    If ((Variable = 1) OR (Variable = 2) OR (Variable = 4) OR (Variable = 8)) Then MachWas

    Gruß<br />Markus


  • Eine Verknüfung von mehreren Variablen mit XOR verhält sich so, dass sie genau dann wahr ist, wenn eine ungerade Anzahl der Eingänge wahr ist (in dem Fall wie schon erwähnt einer oder drei)





    Hallo,


    wie erreiche ich dann, dass in dieses IF gesprungen wird,wenn nur ein einziger Eingang dieser 4 da ist!


    $CYCFLAG


    Hmm...
    Mir fällt ad-hoc nichts eleganteres ein als:
    (A and not B and not C and not D) or (not A and B and not C and not D) or (not A and not B and C and not D) or (not A and not B and not C and D)

    Einmal editiert, zuletzt von atw12az5 ()

  • Oder so:



    Beispiel der EXOR_MORE-Funktion:



    PS: Das Programm wurde noch nicht getestet, sollte aber so funktionieren.


    Gruß
    Robotnik

    Einmal editiert, zuletzt von Robotnik ()


  • Hallo,


    wie erreiche ich dann, dass in dieses IF gesprungen wird,wenn nur ein einziger Eingang dieser 4 da ist!


    $CYCFLAG


    Ohne viel Hirnschmalz zu verwenden würde ich das so machen:


    $CONFIG.dat

    Code
    SIGNAL meineInputGruppe $IN[1] TO $IN[4]


    und dann im code:

    Code
    SWITCH meineInputGruppe
      CASE 1, 2, 4, 8
        ;Nur einer der vier Eingänge steht an
      DEFAULT
        ;Mehrere oder kein Eingang steht an
    ENDSWITCH


    lg drudge

    Einmal editiert, zuletzt von Drudge ()

  • Hallo,


    folgende Zeile verursacht bei mir:


    -----> Satzende oder Kommentar erwartet


    bOk = K<>L AND bOk AND NOT bArray[L] OR K==L AND bOk


    wo liegt denn da der Fehler


    $CYCFLAG

  • Und hier noch Robotniks Version ein klein wenig schlanker:


  • Ich hab auch noch eine relativ übersichtliche Einzeiler-Variante (für 4 Eingänge) :ylsuper:


    ...wenn man nämlich die unzulässigen 3 Bit-Kombinationen explizit aussperrt.
    Sieht dann so aus :


    IF ($IN[1] EXOR $IN[2] EXOR $IN[3] EXOR $IN[4]) and not($IN[1] and $IN[2]) and not($IN[3] and $IN[4]) THEN
    ...
    ENDIF


    gruß :beerchug:
    rmac

  • Hab's heut auch mal probiert, in der DEF Zeile fehlt das BOOL....


    DEFFCT BOOL EXOR_MORE(bArray[] :OUT,nStart :IN,nLen :IN)


    und mit den klammern in der Zeile:


    bOk = (K<>L) AND bOk AND NOT bArray[L] OR (K==L) AND bOk


    funktionierts dann.


    @CYCFLAG


    Zur Funktion:
    Das ForNext mit K benötigt mann um das erste Bit mit HighPegel zu finden.
    Dieses wird dann in den Merker bOk geschrieben um dann mit den noch übrigen Elementen verglichen zu werden.
    Damit kein Vergleich auf K==nEnd durchgeführt werden muß wird als nStart für L der Zählwert K geschrieben.
    Die Zeile:
    bOk = (K<>L) AND bOk AND NOT bArray[L] OR (K==L) AND bOk
    ist eigentlich zweigeteilt.
    bei K==L wird der vorhergehende bOk Zustand auf bOk geschrieben, sollte die Schleife schon jetzt am Ende Sein wird bOk (hier normalerweise True) Zurückgegeben.
    Ist K<>L das ist im zweiten durchlauf werden alle weiteren Elemente auf NOT abgefragt und mit bOk UND-verknüpft.


    Sollte kein Eingang High sein wird nach nLen Durchläufen False zurückgegeben.
    Das ist schon alles.

    Einmal editiert, zuletzt von Robotnik ()

  • @CYCFLAG


    Wait For geht schon, nur werden die Werte im EXOR_MORE nicht aktualisiert.


    Besser ist
    While NOT $IN[xy] OR EXEC_MORE(....)
    SetWaitState(Integerwert)
    Endwhile
    SetWaitState(0) ; keine Meldung


    SetWaitState(12) ist dann ein Unterprogramm das zum Beispiel der Visu mitteilt, das auf die Bedingung 12 gewartet wird.

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