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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Bitsummenprüfung

  1. #1
    Registriert seit
    09.11.2007
    Beiträge
    34
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe folgendes Problem:

    In einem Byte stellt jedes Bit einen Eingang dar.
    Jeder Eingang symbolisiert einen Fehler an der Maschine.

    0011 0100 --> hier habe ich 3 Fehler an der Maschine.

    Folgende Auswertung ist gewünscht:
    Ich soll die Anzahl der Fehler in einen OP darstellen, hierzu müsste ich die Summe der 1nsen in diesen Bit erfassen.
    0000 0000-->keine Eins-->bedeutet kein Fehler
    0001 0000-->eine Eins-->bedeutet ein Fehler
    0010 0010-->mehr als eine Eins-->bedeutet multi Fehler

    Die genaue Anzahl spielt hierfür keine Rolle ich muss nur zwischen 0, 1, und mehr Fehler unterscheiden.


    Hoffentlich könnt Ihr mit meiner Beschreibung etwas anfangen und mir eventuell eine kleine Strategie zukommen lassen.
    Zitieren Zitieren Bitsummenprüfung  

  2. #2
    Registriert seit
    18.09.2004
    Ort
    Münsterland/NRW
    Beiträge
    4.718
    Danke
    729
    Erhielt 1.158 Danke für 969 Beiträge

    Standard

    Suche mal nach Bitsum hier im Forum

  3. #3
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Guckst du hier: http://www.sps-forum.de/showthread.p...ghlight=BitSum

    oder suchst mal unter "Bitsum".
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  4. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Topse (05.05.2008)

  5. #4
    Registriert seit
    18.09.2004
    Ort
    Münsterland/NRW
    Beiträge
    4.718
    Danke
    729
    Erhielt 1.158 Danke für 969 Beiträge

  6. Folgender Benutzer sagt Danke zu marlob für den nützlichen Beitrag:

    Topse (05.05.2008)

  7. #5
    Registriert seit
    23.04.2008
    Beiträge
    75
    Danke
    16
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hier ein AWL-Quelltext.Falls du nicht nur eine Funktion anwenden, sondern auch verstehen willst.

    Code:
    FUNCTION "FCBitSumB" : VOID
    TITLE = Bitsumme aus BYTE
    VERSION : 0.1
    
    VAR_INPUT
     inb :BYTE;
    END_VAR
    
    VAR_OUTPUT
     sum :INT;
    END_VAR
    
    VAR_TEMP
     mask: WORD; //Bitmaske zur Abfrage
    END_VAR
    
    BEGIN
    
    L 0; T #sum;  
    L 1; T #mask;
    
    m1: L #inb ;L #mask; UW ; SPZ m2; // Abfragen mit UW, wenn Bit=0 springen 
     
    L #sum; L 1 ;+I; T #sum;   // Summe um 1 erhöhen
    
    m2: L #mask; SLW 1;T #mask; // Maske verschieben zum nächsten Bit
    
    L 256;<I;SPB m1; //Zurück solange Maske kleiner 256 (8.Bit)
    
    END_FUNCTION
    Nieder mit der Schwerkraft. Freien Fall für freie Bürger !

  8. #6
    Topse ist offline Benutzer
    Themenstarter
    Registriert seit
    09.11.2007
    Beiträge
    34
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Euch allen für die Mühe, hab die Aufgabe mit dem FC99 aus der Bibliothek gelöst.
    Zitieren Zitieren Danke  

  9. #7
    Registriert seit
    06.10.2003
    Beiträge
    3.403
    Danke
    447
    Erhielt 502 Danke für 406 Beiträge

    Standard

    Ich vermisse die Frage nach einer Lösung mit einem Any-Pointer .

    Gruß, Onkel


    Code:
     
    FUNCTION "COUNT_BITS" : VOID
    TITLE =
    VERSION : 0.1
     
    VAR_INPUT
      DATENBEREICH : ANY ; 
    END_VAR
     
    VAR_OUTPUT
      ANZAHL : INT ; //Anzahl gesetzer Einträge
      KEIN_BIT_HIGH : BOOL ; 
      GENAU_EIN_BIT_HIGH : BOOL ; 
      MINDESTENS_EIN_BIT_HIGH : BOOL ; 
      MEHR_ALS_EIN_BIT_HIGH : BOOL ; 
      ERROR : INT ; //0-kein Fehler, 1-Datentyp nicht Byte
    END_VAR
     
    VAR_TEMP
      AR1_TEMP : DWORD ; 
      TEMP_INT : WORD ; 
      TEMP_DINT : DWORD ; 
      TEMP_ANZAHL_HIGH : INT ; 
      LOOP : INT ; 
    END_VAR
     
    BEGIN
     
    NETWORK
    TITLE =
     
    //*** AR1 sichern
          TAR1  #AR1_TEMP; 
          SET   ; 
          SAVE  ; 
     
    //*** Ergebnisse initialisieren
          L     B#16#0; 
          T     #TEMP_ANZAHL_HIGH; 
          T     #ANZAHL; 
          T     #ERROR; 
          SET   ; 
          R     #KEIN_BIT_HIGH; 
          R     #GENAU_EIN_BIT_HIGH; 
          R     #MINDESTENS_EIN_BIT_HIGH; 
          R     #MEHR_ALS_EIN_BIT_HIGH; 
     
    //*** AR2 auf Datenbereich
          L     P##DATENBEREICH; 
          LAR2  ; 
     
    //*** Prüfe, ob DATENBEREICH vom Typ=Byte
          L     W [AR2,P#0.0]; // Typ 
          L     W#16#1002; 
          ==I   ; 
          L     1; // Fehler 1: DATENBEREICH nicht vom Typ Byte
          SPBN  ERR; 
     
    //*** Länge in Bits ermitteln
          L     W [AR2,P#2.0]; // Anzahl Bytes im DATENBEREICH
          SLW   3; 
          T     #LOOP; // Schleifenzähler initialisieren
     
    //*** DB öffnen und Adressregister auf Bereichszeiger
          L     W [AR2,P#4.0]; 
          T     #TEMP_INT; 
          AUF   DB [#TEMP_INT]; 
          L     D [AR2,P#6.0]; 
          LAR2  ; // DATENBEREICH
     
    //*** Schleife zur Zählung der gesetzten Bits
          L     #LOOP; 
    LOOP: T     #LOOP; 
          U      [AR2,P#0.0]; 
          SPBN  M001; 
          L     #TEMP_ANZAHL_HIGH; 
          L     1; 
          +I    ; 
          T     #TEMP_ANZAHL_HIGH; 
    M001: NOP   0; 
          +AR2  P#0.1; // Pointer erhöhen
          L     #LOOP; 
          LOOP  LOOP; 
     
    //*** Anzahl gesetzter Bits
          L     #TEMP_ANZAHL_HIGH; 
          T     #ANZAHL; 
     
    //*** kein Bit high
          L     0; 
          ==I   ; 
          =     #KEIN_BIT_HIGH; 
     
    //*** Genau eine Bit high
          TAK   ; 
          L     1; 
          ==I   ; 
          =     #GENAU_EIN_BIT_HIGH; 
     
    //*** Mindestens ein Bit high
          >=I   ; 
          =     #MINDESTENS_EIN_BIT_HIGH; 
     
    //*** Mehr als ein Bit high
          >I    ; 
          =     #MEHR_ALS_EIN_BIT_HIGH; 
     
    //*** AR1-Register wiederherstellen
          LAR1  #AR1_TEMP; 
          BEA   ; 
     
    //*** Fehler
    ERR:  T     #ERROR; 
     
    //*** AR1-Register wiederherstellen
          LAR1  #AR1_TEMP; 
          BE    ; 
     
    END_FUNCTION
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  10. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    @Onkel

    Dazu hab ich mal ein paar kleine Fragen, weil es wirklich interessant ist darüber nachzudenken.
    Warum rettest du AR1, nutzt dann aber ausschließlich AR2? Hat das einen Grund? Sollte man auch noch AR2 retten oder einfach statt AR2 AR1 nutzen, damit man in Multiinstanz-FB keine Probleme bekommt?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  11. #9
    Registriert seit
    06.10.2003
    Beiträge
    3.403
    Danke
    447
    Erhielt 502 Danke für 406 Beiträge

    Standard

    Hallo Ralle,

    richtig, AR1 wird in diesem Fall nicht verwendet und muss daher auch nicht gesichert werden. Die Zeilen könnte man also getrost löschen.

    AR2 kann man in FCs uneingeschränkt verwenden, so weit ich weiß. Probleme hatte ich damit noch nicht, auch nicht bei Verwendung derartiger FCs in Multiinstnzen. Beim AR2-Verbiegen unmittelbar in FBs sieht es natürlich ganz anders aus.


    Gruß, Onkel


    siehe auch:
    Berger-Bibel "Automatisieren mit Step7 in AWL und SCL" Psalm 25.4
    Geändert von Onkel Dagobert (05.05.2008 um 23:42 Uhr)
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  12. Folgender Benutzer sagt Danke zu Onkel Dagobert für den nützlichen Beitrag:

    Ralle (05.05.2008)

  13. #10
    Registriert seit
    25.08.2003
    Beiträge
    332
    Danke
    46
    Erhielt 54 Danke für 46 Beiträge

    Lächeln


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!

    Habe noch mal über das AR1 nachgedacht: Ich rette das AR1 auch immer, Macht der Gewohnheit.

    Aber !!?!!?
    Wird nicht das AR1 automatisch vom Betriebssystem gerettet? So dass nach Unterbrechung von einem Interrupt-OB und Wiederkehr in das zykl. Programm das AR1 automatisch wiederhergestellt wird? Was meint Ihr?

    Gruß
    Flinn

Lesezeichen

Berechtigungen

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