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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: SCL Parität ermitteln

  1. #11
    Registriert seit
    17.03.2011
    Ort
    im Wald
    Beiträge
    284
    Danke
    11
    Erhielt 36 Danke für 35 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Upps,

    wer lesen kann ist klar im Vorteil. Sorry

  2. #12
    Registriert seit
    29.03.2004
    Beiträge
    5.742
    Danke
    143
    Erhielt 1.688 Danke für 1.226 Beiträge

    Standard

    Wie wärs denn damit:
    Code:
    FUNCTION ParityCheck : BOOL
    // Return: 
    // false = Even (Gerade Anzahl Bits ist true)
    // true  = Odd  (Ungerade Anzahl Bits ist true)
    VAR_INPUT
        IN : BYTE;
    END_VAR
    
    VAR_TEMP
        val : BYTE;
    END_VAR
    
    BEGIN
        val := IN;
        val := val XOR SHR(IN := val, N := 4);
        val := val XOR SHR(IN := val, N := 2);
        val := val XOR SHR(IN := val, N := 1);
        IF (val AND B#16#1) <> b#16#0  THEN
            ParityCheck := true;
        ELSE
            ParityCheck := false;
        END_IF;
    END_FUNCTION

  3. #13
    Registriert seit
    24.03.2010
    Beiträge
    126
    Danke
    3
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Hi,

    das geht noch kürzer...

    Compute parity in parallel

    unsigned int v; // word value to compute the parity of v ^= v >> 16; v ^= v >> 8; v ^= v >> 4; v &= 0xf; return (0x6996 >> v) & 1; The method above takes around 9 operations, and works for 32-bit words. It may be optimized to work just on bytes in 5 operations by removing the two lines immediately following "unsigned int v;". The method first shifts and XORs the eight nibbles of the 32-bit value together, leaving the result in the lowest nibble of v. Next, the binary number 0110 1001 1001 0110 (0x6996 in hex) is shifted to the right by the value represented in the lowest nibble of v. This number is like a miniature 16-bit parity-table indexed by the low four bits in v. The result has the parity of v in bit 1, which is masked and returned.

    Für Byte- Werte kann man die ersten beiden XORs weglassen.

  4. #14
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard

    @erdmann, würdest Du mir bitte noch mal auf Deutsch erklären, wie das funktioniert?

  5. #15
    Matze001 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    11.12.2009
    Beiträge
    2.115
    Danke
    388
    Erhielt 390 Danke für 271 Beiträge

    Standard

    Und vielleicht "kurz" in SCL umschreiben

  6. #16
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    Zitat Zitat von erdmann Beitrag anzeigen
    Hi,

    das geht noch kürzer...

    Compute parity in parallel


    unsigned int v; // word value to compute the parity of v ^= v >> 16; v ^= v >> 8; v ^= v >> 4; v &= 0xf; return (0x6996 >> v) & 1; The method above takes around 9 operations, and works for 32-bit words. It may be optimized to work just on bytes in 5 operations by removing the two lines immediately following "unsigned int v;". The method first shifts and XORs the eight nibbles of the 32-bit value together, leaving the result in the lowest nibble of v. Next, the binary number 0110 1001 1001 0110 (0x6996 in hex) is shifted to the right by the value represented in the lowest nibble of v. This number is like a miniature 16-bit parity-table indexed by the low four bits in v. The result has the parity of v in bit 1, which is masked and returned.

    Für Byte- Werte kann man die ersten beiden XORs weglassen.

    Für meinen Geschmack hat Zotos die Aufgabenstellung am besten gelöst. Der Code ist auf den ersten Blick nachvollziehbar. Die Lösung von erdmann ist was für Spezialisten...
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  7. #17
    Registriert seit
    24.03.2010
    Beiträge
    126
    Danke
    3
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Hallo,

    das kommt von einer meiner liebsten Sammlung von solchen
    "Sonderberechnungen", zusammengetragen von Sean Eron Andersen.
    http://graphics.stanford.edu/~seander/bithacks.html
    Davon gibt es noch eine:
    http://aggregate.org/MAGIC/

    Für ein Byte:
    v ^= v >> 4;
    v &= 0xf;
    return (0x6996 >> v) & 1

    Funktionieren tut das ganze so:
    Die erste Zeile kombiniert die zwei Nibbles mittels XOR.
    Anschliessend wird maskiert, sodass nur noch die unteren 4 bit übrigbleiben.
    Die "magische Zahl" ist eine kleine Lookup- Table, die für die 16 Möglichkeiten
    jeweils die Parität enthält.

    Das funktioniert tatsächlich.

    mfg Erdmann

  8. Folgender Benutzer sagt Danke zu erdmann für den nützlichen Beitrag:

    hucki (20.03.2012)

  9. #18
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard

    Danke für die Erklärung.
    Leider hab' ich immer noch Probleme es ganz zu verstehen.
    Die Kombination der Nibbles ist mir z.B. noch unklar:
    Werden nur die beiden Halbbytes miteinander kombiniert, wenn ja - wie adressier ich die?
    Oder werden die beiden Halbbytes miteinander vertauscht und dann das Ergebnisbyte mit dem Originalbyte kombiniert?

    Wäre es Dir möglich, die Vorgehensweise in AWL oder SCL zu schreiben?


    PS: Mein Englisch ist leider nur rudimentär vorhanden und auch mit dieser Schreibweise
    Zitat Zitat von erdmann Beitrag anzeigen
    ...
    Für ein Byte:
    v ^= v >> 4;
    v &= 0xf;
    return (0x6996 >> v) & 1
    ...
    hab' ich einige Schwierigkeiten (ist alles schon 'ne Weile her), so daß mir die Links nicht wirklich weiter helfen.
    Geändert von hucki (20.03.2012 um 10:52 Uhr)

  10. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    Matze001 (20.03.2012)

  11. #19
    Registriert seit
    24.03.2010
    Beiträge
    126
    Danke
    3
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Hallo,

    in AWL:
    Code:
    L     #V                          // Byte
          PUSH                              // Akku duplizieren
          SRW   4                           // Hohes Nibble nach unten
          XOW                               // beide Nibbles kombinieren
          UW    W#16#F                      // maskieren
          L     W#16#6996                   // "Magic Number"
          SRW                               // schieben
          UW    W#16#1                      // Bit 0 bleibt übrig
          L     0
          <>I                               // wenn <> 0
          =     #ODD                        // => Parity odd
    mfg Erdmann

  12. Folgende 2 Benutzer sagen Danke zu erdmann für den nützlichen Beitrag:

    hucki (20.03.2012),jack911 (21.03.2012)

  13. #20
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ein letzte Frage, die sich mir nicht ganz erschließt:
    Zitat Zitat von erdmann Beitrag anzeigen
    ...das geht noch kürzer...
    Zitat Zitat von hucki Beitrag anzeigen
    ...
    Code:
    ...
       TmpByte := InByte;
       CheckPari := NOT TmpArray[0];
       FOR i := 1 TO 7 DO
           CheckPari := CheckPari XOR TmpArray[i];
       END_FOR;
    ...
    gegen (auch wenn's noch kein SCL ist, aber m.M.n. die Anzahl der nötigen Anweisungen - SRW, XOR, UW, SRW, UW, <>1):
    Zitat Zitat von erdmann Beitrag anzeigen
    ...
    Code:
    L     #V                          // Byte
          PUSH                              // Akku duplizieren
          SRW   4                           // Hohes Nibble nach unten
          XOW                               // beide Nibbles kombinieren
          UW    W#16#F                      // maskieren
          L     W#16#6996                   // "Magic Number"
          SRW                               // schieben
          UW    W#16#1                      // Bit 0 bleibt übrig
          L     0
          <>I                               // wenn <> 0
          =     #ODD                        // => Parity odd
    ...
    Und bei WORD oder DWORD wird's ja noch mehr, oder?

Ähnliche Themen

  1. CFC / SCL - Nummer des Instanz-DB ermitteln?
    Von TVG206 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 04.12.2015, 13:19
  2. in SCL Adresse von String im IDB ermitteln
    Von Ralle im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 03.03.2011, 09:39
  3. Array länge mit SCL ermitteln
    Von Linowitch im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 08.07.2010, 12:12
  4. SCL DB Länge ermitteln
    Von Dotzi im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 03.07.2010, 20:01
  5. Parität aus einem DW ermitteln
    Von spunky im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 07.06.2005, 09:37

Lesezeichen

Berechtigungen

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