Frage zur Zahlenkonvertierung

anne

Level-1
Beiträge
347
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

ich habe grad (mal wieder) ein Verständnisproblem. :p

Ich möchte in FUP über einen Konvertierungsbaustein eine INT-Zahl 22 nach BCD16 wandeln.

Online bekomme ich am Baustein folgende Anzeigen:

IN: 22
OUT: 16#0022

(siehe Anhang)!


Nun komme ich mit der Darstellung am Ausgang OUT nicht ganz klar. Hierbei handelt es sich doch um eine 16-Bit-BCD-Zahl; also ein Word. Somit entspricht die Anzeige ja dem Wert 0000 0000 0000 0022 - oder?

Was ich aber nicht verstehe, warum steht im linken Byte, also Byte 0 die 22 und nicht im rechten Byte, also Byte 1?


Lieben Dank!


Wandlung.jpg
 
...
OUT: 16#0022
...
Hierbei handelt es sich doch um eine 16-Bit-BCD-Zahl; also ein Word.
Ja.

...
OUT: 16#0022
...
Somit entspricht die Anzeige ja dem Wert 0000 0000 0000 0022 - oder?
Nein, sondern 0000 0000 0010 0010.

Bits können nur 0 oder 1 sein. Und die 16# besagt, das jede Zahl/Buchstabe dahinter für 4 Bit (2^4 = Basis 16 = hexadezimal), also die 4 Halbbytes, steht.
In diesem Fall steht in den beiden letzten Halbbytes jeweils die 2 bzw. 0010.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Du von INT nach WORD wandeln möchtest, dann kannst geht das einfach über einen MOVE-Befehl (IN: Deine INT-Variable; OUT: Deine WORD-Variable). Der KOP/FUP Editor könnte dabei meckern, wenn das bei Dir der Fall ist, dann einfach im KOP/FUP-Editor unter "Extras / Einstellungen" unter "KOP/FUP" den Haken bei "Typenüberprüfung von Operanden" entfernen.
 
Was möchtest Du? BCD oder HEX

"22" in BCD sind: 0000 0000 0001 0110

"22" in HEX sind: 0 0 1 6

Jede HEX-Stelle entspricht 4 BCD Stellen

Vielleicht musst Du ja im Status nur mal die Anzeige umstellen!
 
Nein, sondern 0000 0000 0010 0010.

Ja klar, wie doof von mir!


In diesem Fall steht in den beiden letzten Halbbytes jeweils die 2

Aber durch Variable.b0 wird doch eigentlich das linke Byte und durch Variable.b1 das rechte Byte bezeichnet, oder? Und dann müsste es doch genau anders herum angezeigt werden; d.h., Variable.b1 müsste die 22 anzeigen.

@Michael: Ok, danke für diesen Hinweis! Es ist schon alles ok, so wie es in meinem Anhang abgebildet ist.. mir ist es nur nicht klar, warum nicht Variable.b1 die 22 anzeigt?
 
Danke für den Link, Verpolt!

Nur verstehe ich leider noch immer nicht, warum das rechte Byte durch Variable.b0 angezeigt wird und nicht durch Variable.b1? :confused:

In einem MW10 steht doch auch links das Byte10 und rechts das Byte11...
 
... mir ist es nur nicht klar, warum nicht Variable.b1 die 22 anzeigt?
Weil erst das Low-Byte und dann das High-Byte gespeichert wird.
Wenn Du Deine 0000 0000 0010 0010 ins MW200 transferierst, dann steht im MB200 die 0010 0010 und im MB201 die 0000 0000.

[EDIT]Ist natürlich genau anders herum, wie MSB vollkommen Recht hat - im Byte mit der niedrigen Adresse steht das höherwertige Byte -> erst nachdenken, dann posten Hucki![/Edit]
 
Zuletzt bearbeitet:
Lieben Dank für eure Hilfe!

Ich war hier wohl auf nem Irrweg...


Aber wenn ich ein Word (MW200) in folgender Darstellung habe: 0000 0000 0000 0000

Dann liegen doch 0000 0000 (linkes Byte) im MB200 und 0000 0000 (rechtes Byte) im MB201 - warum ist das dann beim Laden nicht gleich?

Das entspricht aber doch nicht dieser Abbildung von Michael, denn das linke Byte wäre dann doch das niederwertigere Byte:

Byte 1 ---- Byte 0
linkes Byte rechtes Byte
___/-\___ ___/-\___
0000 0000 0000 0000
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das liegt daran, das Siemens die Bytes in den Wörtern dreht. Häufig kommt es vor, das bei der Kommunikation mit anderen BUS-Teilnehmern /-Steuerungen sämtliche Bytes und Wörter gedreht werden müssen!


HI-Byte --- LOW Byte
MB 201 --- MB 200
Byte 1 ---- Byte 0
linkes Byte rechtes Byte
___/-\___ ___/-\___
0000 0000 0000 0000 <- BCD
0___ 0___ 2___ 2___ <- HEX
 
Lieben Dank Michael für deine Bemühungen!

Hm, aber soweit ich weiß ist es bei den Alarmen und Meldungen, die auf dem Display angezeigt werden nicht so. Habe nachgesehen und da ist es schon so, dass in einem MW (z.B. Alarmmerkerwort) die ersten 8Bits im linken Byte (LOW-Byte) und die letzten 8Bits im rechten Byte (HIGH-Byte) liegen - allerdings wird hier ja nichts transferiert!

Wenn ich das jetzt richtig verstanden habe, so kommt es erst durch das Laden/Transferieren zu der Drehung der beiden Bytes im Wort; ist das so korrekt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Aber wenn ich ein Word (MW200) in folgender Darstellung habe: 0000 0000 0000 0000

Dann liegen doch 0000 0000 (linkes Byte) im MB200 und 0000 0000 (rechtes Byte) im MB201
...
MB 200 ist das rechte Byte.
Wenn wir normal zählen, dann von links nach rechts. In der SPS wird aber von rechts nach links gezählt.
Damit steht im ersten Byte von MB200, MW200 und/oder MD200 immer der gleiche Byte-Wert, andersrum wäre es nicht so.

[EDIT]Ist natürlich genau anders herum - im Byte mit der niedrigen Adresse steht das höherwertige Byte, dadurch hat man den Effekt vom Vorsatz eben genau nicht -> erst nachdenken, dann posten Hucki!
Ich persönlich würde es so besser finden, aber davon ist es trotzdem nicht richtig[/Edit]


MB203 MB202 MB201 MB200
>---- MW202 >---- MW200
>---- ----- ----- MD200
[EDIT]Hab' ich ein Schwein, dass ich hier nicht die Wertigkeit der Bytes angegeben habe, dadurch ist es wenigstens nicht ganz falsch[/Edit]
 
Zuletzt bearbeitet:
Hm, glaube ich muss doch nochmal nerven...

Habe soeben das hier in den Siemens-Ausbildungsunterlagen gefunden:

Unbenannt.JPG


Das widerspricht aber doch jetzt schon folgender Darstellung, oder?

-----MW200--------
HI-Byte --- LOW Byte
MB 201 --- MB 200
Byte 1 ---- Byte 0
linkes Byte rechtes Byte
___/-\___ ___/-\___
0000 0000 0000 0000 <- BCD
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@hucki
Deine Tabelle ist für die Siemens = BigEndian Welt schlicht und einfach falsch.

Richtig wärs so:
MB200 MB201 MB202 MB203
>MW200 ----- >MW202 -----
>MD200 ----- ----- -----
B3 B2 B1 B0


Laut Hilfe greift man bei der S7-1200 mit b0 aber auf das niederwertigste Byte zu, und nicht auf irgend eine Speicher-Adresse n des jeweiligen Wortes.

Mfg
Manuel
 
@hucki
Deine Tabelle ist für die Siemens = BigEndian Welt schlicht und einfach falsch.

Mfg
Manuel

Das heißt also, wie ich anfangs bereits schrieb, doch von links nach rechts, oder?

Dann muss bei der Darstellung 0000 0000 0010 0010 das rote Byte das niederwertigste Byte sein - na wenn das mal nicht verwirrend ist... :confused:


@Manuel: Wo hast du denn die Beschreibung über "b0" gefunden... finde das nicht in der Hilfe und auch nicht im Handbuch?
 
Zuletzt bearbeitet:
Das heißt also, wie ich anfangs bereits schrieb, doch von links nach rechts, oder?

Dann muss bei der Darstellung 0000 0000 0010 0010 das rote Byte das niederwertigste Byte sein - na wenn das mal nicht verwirrend ist... :confused:


@Manuel: Wo hast du denn die Beschreibung über "b0" gefunden... finde das nicht in der Hilfe und auch nicht im Handbuch?

Von Links nach rechts stimt, siehe Copy VAT tabelle.
 

Anhänge

  • MD20.JPG
    MD20.JPG
    50,1 KB · Aufrufe: 17
Zurück
Oben