Word to binary converter

j_poool

Level-1
Beiträge
107
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
ich müsste eine 16bit Zahl in eine Binary Zahl umändern
Einen Baustein für eine 8bit->Binary habe ich mir zusammengestellt
Das habe ich ganz eingach so gelöst

CASE wIN OF
0 : bBIT[0]:=0; bBIT[1]:=0; bBIT[2]:=0; bBIT[3]:=0; bBIT[4]:=0; bBIT[5]:=0; bBIT[6]:=0; bBIT[7]:=0;
1 : bBIT[0]:=1; bBIT[1]:=0; bBIT[2]:=0; bBIT[3]:=0; bBIT[4]:=0; bBIT[5]:=0; bBIT[6]:=0; bBIT[7]:=0;
2 : bBIT[0]:=0; bBIT[1]:=1; bBIT[2]:=0; bBIT[3]:=0; bBIT[4]:=0; bBIT[5]:=0; bBIT[6]:=0; bBIT[7]:=0;
usw.
Wenn ich aber eine 16bit Zahl habe dann sind es genau 32767 Zeilen, und das ist eine sehr große Menge

Hat jemand einen Tip wie ich das lösen kann?
Vielen Dank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum so umständlich?
Mach eine FOR-Schleife von 0 bis 15.
In dieser eine Zuweisung zu dem Array-Element mit dem Zähler der FOR-Schleife als Index machen. Als Zuweisung WORD_TO_BOOL(wIN) nehmen, damit wird von Deinem WORD nur das unterste Bit genommen und in ein BOOL konvertiert.
Du kannst aber im WORD_TO_BOOL noch mit AND 16#01 oder AND 1 das unterste Bit vorher ausfiltern, wenn Du ganz sicher sein willst, dass nur das relevante (nämlich das unterste) Bit genommen wird.
Anschließend wIN mit SHR(wIN, 1) um 1 Bit nach rechts schieben, fertig.
 
Zuletzt bearbeitet:
Geht es da nicht einfach um USInt_to_BYTE bzw UInt-To_WORD?
Würde sagen nein.
Der TE hat ein Array (vermutlich vom Typ BOOL nach dem Variablennamen zu schließen). Wenn seine Variable wIN, die aufgrund des Namens wohl ein WORD ist, den Wert 1 hat, setzt er das Array Element 0 auf 1/TRUE und alle anderen auf 0/FALSE was ja dem untersten Bit entsprechen würde. Bei dem Wert 2 setzt er Element 2 auf 1/TRUE und alle anderen auf 0/FALSE was dem Setzen des zweiten BITS (Bei Zählung von 1) entspricht. Bei dem Wert drei vermute ich mal will er Element 0 und 1 auf 1/TRUE setzen und den Rest auf 0/FALSE.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Womit programmierst Du? Kann man in Deinem Programmiersystem eine UNION eines INT oder UINT oder WORD mit einem Bit-Array machen? Dann brauchst Du nur den 16-Bit-Wert in die Union laden und kannst direkt (oder langsamer per Schleife) die einzelnen Bits herausladen. Dabei noch die Endianer beachten...

Was hast Du vor? Warum willst/musst Du den Wert in einzelne Bits zerlegen? Schreib doch mal etwas genauer, was Du vorhast. Vielleicht ist das Zerlegen auch unnötig.

Warum so umständlich?
Mach eine FOR-Schleife von 0 bis 15.
In dieser eine Zuweisung zu dem Array-Element mit dem Zähler der FOR-Schleife als Index machen. Als Zuweisung WORD_TO_BOOL(wIN) nehmen, damit wird von Deinem WORD nur das unterste Bit genommen und in ein BOOL konvertiert.
Du kannst aber im WORD_TO_BOOL noch mit AND 16#01 oder AND 1 das unterste Bit vorher ausfiltern, wenn Du ganz sicher sein willst, dass nur das relevante (nämlich das unterste) Bit genommen wird.
Anschließend wIN mit SHR(wIN, 1) um 1 Bit nach rechts schieben, fertig.
Diese umständliche Anleitung kann man gehörig falsch auslegen ...

Harald
 
Womit programmierst Du? Kann man in Deinem Programmiersystem eine UNION eines INT oder UINT oder WORD mit einem Bit-Array machen? Dann brauchst Du nur den 16-Bit-Wert in die Union laden und kannst direkt (oder langsamer per Schleife) die einzelnen Bits herausladen. Dabei noch die Endianer beachten...

Was hast Du vor? Warum willst/musst Du den Wert in einzelne Bits zerlegen? Schreib doch mal etwas genauer, was Du vorhast. Vielleicht ist das Zerlegen auch unnötig.


Diese umständliche Anleitung kann man gehörig falsch auslegen ...

Harald
Hab es schon etwas bearbeitet, wollte dem TE aber auch nicht die Lösung auf dem silbernen Tablett liefern.
Aaah, verdammt, ich vergesse andauernd die UNION, damit ginge es natürlich noch einfacher und direkter, soweit das, wie Harald schon schrieb mit den Indianern passt. (Union geht bei ARRAY OF BOOL nicht)
 
Zuletzt bearbeitet:
ich müsste eine 16bit Zahl in eine Binary Zahl umändern
Was meinst Du mit "16bit Zahl" und was mit "Binary Zahl"?
Wahrscheinlich müsstest Du nur klären, ob die Zahl "Vorzeichen-behaftet" ist oder nicht und dementsprechend INT oder UINT für die dezimale Ganzzahl auswählen.
Was hast Du vor? Warum willst/musst Du den Wert in einzelne Bits zerlegen? Schreib doch mal etwas genauer, was Du vorhast. Vielleicht ist das Zerlegen auch unnötig.
Benötigst Du wirklich die "einzelnen Bits" als BOOL oder ergibt sich diese Notwendigkeit nur aus Deinem evtl. viel zu komplizierten LösungsAnsatz?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe auch nicht genau verstanden, was Dein Ziel ist. Aber man kann auch folgendes machen:
xBool:=xWord.1;
Damit wird das 2. Bit von xWord ausgelesen.
Zusätzlich gibt es in der Util-Lib den Baustein WORD_AS_BIT.
Vielleicht ist etwas davon hilfreich...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder sowas, generell gibt es da viele Möglichkeiten:
Code:
FOR i := 0 TO 15 DO
    bBIT[i] := (wIN AND SHL(1, i)) <> 0;
END_FOR;
Das ist dann (Neben Union Union wird nicht gehen) die absolute Kurzversion, super.
Ich denke einfach zu kompliziert.
 
Zuletzt bearbeitet:
Es gibt da noch mehr zu beachten:
- BOOL ist nicht das selbe wie BIT
- Kann das unbekannte Programmiersystem BIT-Arrays?
- Kann das unbekannte Programmiersystem UNION mit BIT-Array?

Harald
Naja, so unbekannt ist das System ja nicht, es geht um Codesys oder eines der Derivate und die Verhalten sich was angeht meine ich gleich.
Dennoch wäre es schön, wenn sich der TE mal äußern würde.
 
Zurück
Oben