Dezimal in Binär

SCLNewbie

Active member
Beiträge
42
Punkte Reaktionen
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte eine Dezimalzahl in eine 25 stellige Binärzahl umwandeln. Mein Programm schaut folgendermaßen aus:

VAR
index_dez_to_bin : DINT;
result_devision : DINT;
rest_devision : DINT;
complete_b : ARRAY[0..22,0..0] OF STRING;
example_wert : DINT;
END_VAR;

rest_devision :=example_wert MOD 2;
WHILE rest_devision>0 AND index_dez_to_bin<=25 DO
IF rest_devision=1 THEN
complete_b[index_dez_to_bin,0] :='1';
ELSE
complete_b[index_dez_to_bin,0] :='0';
END_IF;
index_dez_to_bin :=index_dez_to_bin+1;
result_devision :=result_devision/2;
rest_devision :=result_devision MOD 2;
END_WHILE;

Trotzdem liefert er mir einen abnormalen Wert. Wenn ich in der Variablentabelle den dementsprechenden ARRAY-Wert binär darstelle liefert er mir immer : 2#1111_1110_0000_0001_0011_0001_0000_0000. Die ersten 4 Bits geben nach STEP7-Hilfe das Vorzeichen vor. Aber auch der Rest stimmt ja net, was mache ich falsch? Binär sollte eigentlich: 10000101111 rauskommen. Vielen Dank für eure Hilfe!
 

hucki

User des Jahres 2014
Beiträge
6.138
Punkte Reaktionen
1.978
Ohne mir jetzt Deinen Code näher angesehen zu haben (mein SCL ist eh' erst am Anfang):

Dein INT-Wert ist doch sowieso binär gespeichert. Warum verschiebst Du dann nicht einfach(?) die einzelnen Bits in Dein Array?
So würde ich's jedenfalls unter AWL machen.
 

Ralle

Supermoderator
Teammitglied
Beiträge
15.251
Punkte Reaktionen
3.909
"index_dez_to_bin" mußt du vor der While-Schleife auf 0 setzen!
die zu füllenden Array-Felder von "complete_b" solltest du vorher entweder auch auf Null setzen, oder du solltest dafür sorgen, dass deinen Schleife auch 25 "Runden" dreht und alle Array-Felder korrekt füllt., sonst bricht bei einer kleinen Zahl die While-Schleife ja recht schnell ab und alle Felder danach enthalten dann einen alten/ungültigen Wert.
 
Zuletzt bearbeitet:

JoopB

Well-known member
Beiträge
885
Punkte Reaktionen
197
Der Array ist so kurts, sie machen 25 schleifen und dass Array ist 23 string lang.

result_devision :=result_devision/2;
result_devision must vor der WHILE instuction result_devision := example_wert vorbesets wurde.

WHILE rest_devision>0 AND index_dez_to_bin<=25 DO Arbeid so auch nicht, While wurde abgebrochen wenn der keine rest ist. WHILE index_dez_to_bin<=25 DO

Code:
VAR
 index_dez_to_bin : DINT;
 result_devision : DINT;
 rest_devision : DINT;
 complete_b : ARRAY[0..25] OF STRING[2];  //String von 2 zeichen
 example_wert : DINT;
 END_VAR;
 
index_dez_to_bin := 0;
rest_devision :=example_wert MOD 2;
result_devision:=example_wert;
 WHILE  index_dez_to_bin<=25 DO 
IF rest_devision=1 THEN 
complete_b[index_dez_to_bin] :='1';
 ELSE
 complete_b[index_dez_to_bin] :='0';
 END_IF;
 index_dez_to_bin :=index_dez_to_bin+1; 
result_devision :=result_devision/2; 
rest_devision :=result_devision MOD 2; 
END_WHILE;


Joop
 
Zuletzt bearbeitet:

hucki

User des Jahres 2014
Beiträge
6.138
Punkte Reaktionen
1.978
...
Dein INT-Wert ist doch sowieso binär gespeichert. Warum verschiebst Du dann nicht einfach(?) die einzelnen Bits in Dein Array?
...
So würde ich mir das vorstellen:
Code:
[FONT=courier new]VAR
[/FONT][FONT=courier new]    Example_Wert : DINT;
[/FONT][FONT=courier new]    complete_b : ARRAY[0..24] OF STRING[2] ;[/FONT]
[FONT=courier new]    TmpDWORD : DWORD;[/FONT]
[FONT=courier new]    TmpArray AT TmpDWORD : ARRAY[0..31] OF BOOL ;[/FONT]
[FONT=courier new]    Index : INT;[/FONT]
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]TmpDWORD := DINT_TO_DWORD( ABS (Example_Wert));[/FONT]
[FONT=courier new]FOR Index := 0 TO 24 DO[/FONT]
[FONT=courier new]    IF TmpArray[Index] THEN[/FONT]
[FONT=courier new]        complete_b[Index] := '1';[/FONT]
[FONT=courier new]    ELSE[/FONT]
[FONT=courier new]        complete_b[Index] := '0';[/FONT]
[FONT=courier new]    END_IF;[/FONT]
[FONT=courier new]END_FOR;[/FONT]

PS: eventuell noch den Absolutwert von Example_Wert vor der Wandlung in DWORD bilden [Edit] -> Eingebunden incl. Weiterbildung
 
Zuletzt bearbeitet:
Oben