einen von Zehn Merker auf 1 abfragen

Servernexus

Level-1
Beiträge
260
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,
Kann ich 10 unterschiedliche Merker auf einfache Weise auf eins Abfragen. Ich habe 10 Merker und wenn 2 oder mehr davon (egal welcher) 1 Signal haben soll eine Störung ausgegeben werden.

Gibt es da einen Einfachen Weg ohne großen Schreibaufwand?
Danke
 
Über eine Schleife die Merker abfragen und bei 1-Signal einen Zähler aufzählen lassen. Anschließend den Zähler auf => 2 abfragen und Störung ausgeben. Die 10 Merker müssten nur aufeinander folgen (z.B. M20.0 - M21.2).
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
die einzelnen, beliebig verteilten Merker in die einzelnen Bits eines freien Merkerwortes kopieren und jenes Merkerwort auf >1 (Festpunktzahl) prüfen.

Wenn die 10 unterschiedlichen Merker jedoch schon im selben Merkerwort liegen und die verbleibenden 6 Merker immer "0" sind, kann man sich natürlich die Kopiererei sparen

o.s.t.
 
Zuletzt bearbeitet:
geht nicht

die einzelnen, beliebig verteilten Merker in die einzelnen Bits eines freien Merkerwortes kopieren und jenes Merkerwort auf >1 (Festpunktzahl) prüfen.

Wenn die 10 unterschiedlichen Merker jedoch schon im selben Merkerwort liegen und die verbleibenden 6 Merker immer "0" sind, kann man sich natürlich die Kopiererei sparen

o.s.t.

Hallo,

so weisst du dass mindestens 1 bit gesetzt ist - aber nicht ob es >=2 sind.

André
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es da einen Einfachen Weg ohne großen Schreibaufwand?
Danke
Traut sich eigentlich niemand folgenden Vorschlag zu posten?
"Nimm ein ODER-Glied mit 10 Beinchen und beschalte die 10 Beinchen mit deinen Merkern..."

Gruß Approx

edit: was den nun eigentlich? 1 von 10 oder >=2 von 10 ...?
 
Zuletzt bearbeitet:
Ich würde die Merker in ein freies Merkerwort kopieren und dieses Wort auf 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 vergleichen. Dann ist max. 1 Merker HIGH. Bei allen anderen Werter grösser 2 ist was faul.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Klassiker:
http://www.sps-forum.de/showthread.php?30043-Abfangen-von-falscher-Eingabe&p=215197#post215197

Das mit diesen 10 Bits abfragen scheint wohl öfters gebraucht zu werden...
Erklär mir bitte mal, wie Du diesen Thread gefunden hast.
Ich hab' danach gesucht wie ein Blöder, weil mir diese Lösung auch gleich einfiel.
Nur fündig geworden bin ich nicht.
 
Da weiß man natürlich nach welchem Namen man suchen muss. Aber das sind trotzdem über 1.600 Beiträge.
Ich kann mich ja kaum an meine paar erinnern (und die waren sicher nicht alle unsinnig) und müßte vor allem stark überlegen, mit welchen Stichwörtern ich da wieder fündig werde, denn das war bei der obigen Suche sicher mein Hauptproblem.
Also
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, wenn man die Suche nach Beiträgen von sich selbst einschränkt funktioniert das schon ganz gut. Musste aber auch mit dem Suchwort probieren.

Nach dem Schema kann man übrigens auch nach gesetzten mehr als 2 Bits prüfen. Wobei dann schon fast die einfache Vorgehensweise mit Abfragen der gesetzten Bits in einer Schleife so wie es auch der BITSUM-Baustein macht schneller ist.
Code:
      L     #wIN                        // zu prüfendes Wort
      ITD   
      DTR   
      T     #rIn
      UD    DW#16#7FFFFF                // 23 Bits Mantisse
      L     0
      <>D   
      =     #MehrAlsEin                 // Es ist mehr als 1 Bit gesetzt

      L     #rIn
      SRD   23                          // Exponent extrahieren
      L     127                         // Bias des Exponenten abziehen
      -D                                // Anzahl um die geshiftet wird
      L     1                           // Bitmuster das geshiftet wird
      SLD                               // Shift-Operation nach links entspricht Multiplikation mit 2
      DTR   
      T     #r_2hochExp                 // Ergibt 2^Exponent

      L     #rIn                        // Restwert bestimmen der über dem Ganzzahligen vielfachen
      L     #r_2hochExp                 // von 2^x liegt.
      -R                                // Mit diesem Wert nochmal das gleiche wie bei Schritt 1
      UD    DW#16#7FFFFF
      L     0
      <>D   
      =     #MehrAlsZwei                // Es sind mehr als 2 Bits gesetzt
 
Der Vorschlag von Thomas aus dem Schowtreat funktioniert einwand frei. Nur wie sieht das ganze aus wenn ich 30 Bits habe? Wenn ich also mit einem Doppelwort arbeiten muss.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal eine Variante ohne Umweg über Gleitpunktzahl:
Code:
      L     #IN_WORD
      PUSH
      +     -1
      UW
      U     <>0
      =     #Fehler   //true wenn mehr als 1 Bit gesetzt ist

... die auch für 32 Bit DWORD funktioniert:
Code:
      L     #IN_DWORD
      PUSH
      +     L#-1
      UD
      U     <>0
      =     #Fehler   //true wenn mehr als 1 Bit gesetzt ist

... und wenn man auf "genau 1 Bit gesetzt" abfragen will:
Code:
      L     #IN_DWORD
      PUSH
      UD
      U     ==0
      SPB   MNOT
      +     L#-1
      UD
      U     <>0
MNOT: NOT
      =     #Genau1   //true wenn genau 1 Bit gesetzt ist

Die Varianten beruhen zugegebenerweise auf einem schönen uralten Algorithmus, den nicht ich erfunden habe. ;)

Harald

Das stammt aus dem Thread http://www.sps-forum.de/showthread.php?30043-Abfangen-von-falscher-Eingabe/page2 Beitrag 13 und im Beitrag #14 eine kürzere Variante.

Diese Beiträge hast wirst Du heute morgen wohl gelesen haben, denn im Beitrag #20 hast Dich bedankt.

Deswegen verstehe ich Deine Frage nicht mehr. :confused:
 
Ich habe mir mal vor Jahren eine FC dazu geschrieben, vielleicht hlift sie Dir.

Code:
FUNCTION FC 2 : VOID
TITLE =Zählung der gesetzten Bit's innerhalb eines Doppelworts (32 Bit)
//Der Baustein zählt die 1-Signal führenden Bits innerhalb eines Doppelworts. 
//Sollen die 1-Signal führenden Bits innerhalb eines Worts (16 Bit) gezählt 
//werden,sind folgende Änderungen vor zu nehmen:
//1.) In den Deklarationszeilen sind ZAEHLWORT und ZW_Speicher als WORD zu dela-
//    rieren.
//2.) Der Schleifenzähler ist statt 32 mit 16 vor zu besetzen.
AUTHOR : 190B
FAMILY : 
NAME : BIT_Z_32
VERSION : 0.1

VAR_INPUT
  ZAEHLWORT : DWORD ; //Doppelwort, dessen gesetzte Bits gezählt werden sollen.
END_VAR
VAR_OUTPUT
  ANZAHL : INT ; //Anzahl der gezählten, 1-Signal führenden Bit's.
END_VAR
VAR_TEMP
  Zaehler : INT ; //Schleifenzähler
  ZW_Speicher : DWORD ; //Zwischenspeicher
END_VAR
BEGIN
NETWORK
TITLE =
      L     #ZAEHLWORT; // Zählwort an
      T     #ZW_Speicher; // Zwischenspeicher übergeben.
      L     0; // Anzahl mit dem Wert 0
      T     #ANZAHL; // vorbesetzen.
      LAR1  P##ZW_Speicher; // Adressregister vorbelegen.
//;
      L     32; // Schleifenzähler mit 32
Next: T     #Zaehler; // vorbesetzen.
      UN    L [AR1,P#0.0]; // Bit n auf 0-Signal abfragen.
      SPB   M001; // Wenn 0-Signal, dann springen.
      L     #ANZAHL; // Anzahl laden,
      INC   1; // 1 hinzu addieren
      T     #ANZAHL; // und neuen Wert wegspeichern.
M001: +AR1  P#0.1; // Adressregister auf nächstes Bit setzen.
      L     #Zaehler; // Wert des Schleifenzählers laden und bei
      LOOP  Next; // NICHT NULL an den Schleifenanfang springen.
END_FUNCTION
 
Zurück
Oben