Und - Und nicht

canYon

Level-1
Beiträge
15
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin, ich hab mal wieder eine Frage.
Folgende Aufgabenstellung: Man hat 5 Schalter und eine Lampe, die Lampe soll nur leuchten wenn nur einer von den 5 Schaltern aktiv ist.

Jetzt hab ich mir überlegt wie ich das mache -> Natürlich ganz einfach, 5 UNDs (Jeweils 5 Schalter, 4 davon negiert) und ein Oder.

Aber was mach ich wenn ich jetzt beispielsweise 100 Schalter hätte. Kann man das einfacher lösen oder bräuchte ich theoretisch 100 UNDs ?

MFG
 
Heisst das ding dann nicht XOR ?

Exclusiv-Oder ?

Schau mal, wie das programmiert wird...

Bei der PS3/PS4 sieht das so aus:
Code:
L I 0.0
XO I 0.1
XO I 0.2
XO I 0.3
= Q 0.0

Grad nochmal getestet...... klappt auf der PS4 jedenfalls
 
Wenn die Eingänge zusammenhängen, kannst du eine Schleife machen und über Pointer indirekt adressieren und die Anzahl der Bits welche 1 sind zählen.

Nö, in dem Falle lieber diese Version (aber natürlich abgewandelt) von thomas2.1, die ist durchaus tricky: http://www.sps-forum.de/showthread.php?t=30043&highlight=Mantisse

Aber das ist im falle von 5 Eingängen etwas übertrieben.
Nur mal so als Bsp., die Eingänge müßte man vorher noch in #In_Word schreiben.

Code:
      O Ex1
      O Ex2
      O Ex3
      O Ex4
      O Ex5
      = Ay

      L     #IN_WORD  //alle Bits (Ex1-Ex5) liegen hier drin, nicht benutzte Bit sind 0!
      DTR   
      L     DW#16#7FFFFF
      UD    
      L     L#0
      <>D   
      R Ay
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein XOR liefert eine 0, wenn die Anzahl der gesetzten Bits gerade ist und eine 1, wenn diese ungerade ist. Die Lampe würde somit bei 1, 3, 5 gesetzten Bits an sein.

JO.... auch grad gemerkt... hatte es vorher nur mit zwei Drähten freihand getestet... und bei zwei Ports funktionierts *GGG*

Grad ne 3er-Brücke fest angeschraubt und siehe da...... Du hast recht und der Ausgang kommt trotzdem. :sm23:
 
im Falle von wwwandy könnte das z.B. so aussehen

Code:
      L     P#0.0                       //Pointer mit Anfangsadresse laden (E0.0)
      LAR1  

      L     0                           //Zaehler mit 0 vorbelegen
      T     #Zaehler

      L     100                         //Anzahl zu pruefender Eingaenge

Next: T     #LoopCounter                //Schleifenbeginn

      U     E [AR1,P#0.0]
      SPBN  M0

      L     #Zaehler                    //Wenn Eingang aktiv, dann Zaehler um 1 nach oben
      L     1
      +I    
      T     #Zaehler

M0:   NOP   0

      L     P#0.1                       //Zeiger um 1 Bit nach oben
      +AR1  

      L     #LoopCounter
      LOOP  Next                        //Schleifenende


//Anzahl aktiver Eingaenge pruefen, wenn 1, dann Ausgang aktiv

      L     #Zaehler
      L     1
      ==I   
      =     A      5.0
habs grad mal simuliert - sollte so funktionieren
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@bensen83

die Eingänge müssen Bitweise in #IN_WORD abgelegt werden. Du kannst auch direkt das Eingangswort z.B. EW0 laden, dann musst du aber evtl. nicht verwendete Eingänge ausmaskieren bzw. sicherstellen, dass diese Low bleiben.

Mir gefällt die "REAL"-Variante allerdings nicht so gut, wenn das nicht ordentlich kommentiert ist, dann blickt da nicht unbedingt jeder durch.

Mfg

uncle_tom
 
@Ralle:
Wenn das DTR ein ITD wäre, könnte ich noch was damit anfangen. Aber dann würde der Ausgang gesetzt, wenn mindestens ein Eingang gesetzt ist und nicht wenn genau ein Eingang gesetzt ist. Oder habe ich bloß den Trick nicht verstanden?

Edit: Ich denke jetzt habe ich es kapiert
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok

ich verstehe es auch so, dass der ausgang gesetzt wird, wenn mindestens ein eingang kommt. ich meine ja nur, wenn ich ne undverknüpfung mit ner zahl mache dann kommen doch alle 1en raus und wenn ich die dann mit <> 0 vergleiche, ann kommt doch bei egal wievelen 1en ein ergebnis von 1 raus, oder?
 
Hm das hört sich kompliziert an =) Okay, ich bin grade am Anfang meines SPS Techniker Kurs. Ich denke mal das wird noch dran kommen :p

Danke =)
 
@bensen83

schau dir bitte den Link von Ralle an, der Trick dabei liegt an der Umwandlung der Ganzzahl (INT) zu einer Gleitpunktzahl (REAL).
 
Hm nochmal eine Frage hierzu:

Die Aufgabe so wie ich sie beschrieben habe war natürlich eine Teilaufgabe. Würde man das so lösen wenn es sich nur um 5 Schalter handelt oder macht man das garnicht so.


MFG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also wie du die Mantissen Spielerei bei 100bit durchziehen willst zeigst mir mal. Und LESBAR ist das dann auch nicht mehr, gehört m.E. eher in die "dirty tricks" Kiste. Gruß von Andy

Gääähn,
dann nimm halt den Bitsum Baustein aus der Standard-Lib und das Thema ist abgehakt.

Im anderen Thread war die Frage nach einer anderen bzw. kürzeren Lösung als eine Schleife. Und warum die Mantissen-Spielerei bei 100 Bits scheitern soll erschließt sich mir auch nicht.
 
Hallo!

Ich würd´s wie folgt lösen:

Mit der FC99 die Summe der einsen abfragen, und danach auf 1 vergleichen:
Code:
FUNCTION FC 3 : VOID
TITLE =
VERSION : 0.1
BEGIN
NETWORK
TITLE =
      CALL "BITSUM" (
           IN                       := ED     0,
           RET_VAL                  := MW   100);
      NOP   0; 
NETWORK
TITLE =
      CALL "BITSUM" (
           IN                       := ED     4,
           RET_VAL                  := MW   102);
      NOP   0; 
NETWORK
TITLE =
      L     MW   100; 
      L     MW   102; 
      +I    ; 
      T     MW   104; 
      NOP   0; 
NETWORK
TITLE =
      L     MW   104; 
      L     1; 
      ==I   ; 
      =     A    124.0; 
END_FUNCTION

dementsprechend für das nächste ED wieder ein MW verbrauchen und addieren uswusf....
geht auch :-D
 
Zuletzt bearbeitet:
Zurück
Oben