Parität aus einem DW ermitteln

S

spunky

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich möchte die Parität aus einem DW ermitteln. D.h. 8 bit Zahl von 1..255 -> wieviel Bits sind gesetzt.

1 -> 00000001 -> Parität 1
2 -> 00000010 -> Parität 1
3 -> 00000011 -> Parität 0
4 -> 00000100 -> Parität 1
5 -> 00000101 -> Parität 0
6 -> 00000110 -> Parität 0
7 -> 00000111 -> Parität 1

d.h. wenn gerade Anzahl Bits gesetzt sind -> Parität 0, ansonsten 1.

Habe bis jetzt noch nichts in der Siemens Bibo gefunden aber vielleicht bin ich ja blind.
Mein Ansatz wäre dann, ich schiebe mir ein Bit durchs Wort und zähle dann mit UW wieviel mal ich ein positives Ergebnis habe, naja aber vielleicht gibts ja noch eine elegantere Möglichkeit.

CPU: 315 2DP
 
Code:
L      MB 8	// in MB8 steht die Zahl
L      2	// Teile die Zahl durch zwei und ermittle
MOD		// mit modulo den divisionsrest
L      0	// vergleiche den divisionsrest mit 0
<>I		// wenn dieser ungleich 0 ist, dann schreibe das
= Parität_0	// Bit auf 1
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit Modulo ist schon klar, funktioniert aber leider dabei nicht.

1 : 2 = 0,5 -> Rest -> Parität 1 o.k.
2 : 2 = 0 -> kein Rest -> Parität 0 -- falsch !!! --- ist ja nur 1 Bit gesetzt.
3 : 2 = 1,5 -> Rest -> Parität 1 --- falsch !!! -- es sind 2 Bits gesetzt

-> ungerade Anzahl von gesetzten Bits = Parität 1
-> gerade Anzahl von gesetzten Bits = Parität 0
 
Hallo,
schau Dir mal in TI_S7_Converting_Blocks den FC 99 an, hier mal die Beschreibung dazu:
Beschreibung

Die Funktion Anzahl der gesetzten Bits zählen (BITSUM) zählt die Anzahl der Bits, die am Eingang IN auf "1" gesetzt werden, und gibt diesen Wert als Funktionswert aus.

Parameter von FC99


Parameter Deklaration Datentyp Speicherbereich Beschreibung
EN Eingang BOOL E, A, M, D, L Der Signalzustand "1" am Freigabeeingang aktiviert die Box.
ENO Ausgang BOOL E, A, M, D, L Der Freigabeausgang hat den Signalzustand "1", wenn die Funktion fehlerfrei ausgeführt wird.
IN Eingang DWORD E, M, D, L, P, Konstante Variable, in der die Bits gezählt werden sollen.
RET_VAL Ausgang INT A, M, D, L, P Ausgegebener Wert.
Fehlerinformation

Diese Funktion erkennt keine Fehlerbedingungen.

Beispiel

Ist der Signalzustand am Eingang E 0.0 = 1 (aktiviert), dann wird die Funktion BITSUM ausgeführt. In diesem Beispiel ist der ausgegebene Wert in MW0 = 13 (”D” in hexadezimaler Schreibweise). Hierbei handelt es sich um die Summe der auf "1" gesetzten Bits in dem Doppelwort des eingegebenen Hexadezimalwerts DW#16#12345678.

Wird die Funktion fehlerfrei ausgeführt, dann werden die Signalzustände von ENO und A 0.0 auf "1" gesetzt.


mfg

dietmar
 
Parität von MW14 = XOR-Verknüfung aller Bits:
U M14.0
X M14.1
X M14.2
X M14.3
X M14.4
X M14.5
X M14.6
X M14.7
X M15.0
X M15.1
X M15.2
X M15.3
X M15.4
X M15.5
X M15.6
X M15.7
gesetztes VKE = ungerade Parität
 
Anonymous schrieb:
Mit Modulo ist schon klar, funktioniert aber leider dabei nicht.

1 : 2 = 0,5 -> Rest -> Parität 1 o.k.
2 : 2 = 0 -> kein Rest -> Parität 0 -- falsch !!! --- ist ja nur 1 Bit gesetzt.
3 : 2 = 1,5 -> Rest -> Parität 1 --- falsch !!! -- es sind 2 Bits gesetzt

-> ungerade Anzahl von gesetzten Bits = Parität 1
-> gerade Anzahl von gesetzten Bits = Parität 0

oh sorry, ich standauf der leitung, habe das so verstanden das ungerade
zahlen erkannt werden sollen...
 
Zurück
Oben