Dezimal in Binär

SCLNewbie

Level-1
Beiträge
42
Reaktionspunkte
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!
 
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.
 
"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:
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:
...
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:
Zurück
Oben