Step 7 DWord Bit 0.7=Vorzeichen

SPS`ler

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab auch mal ne Frage zum Word bzw DWord.
Wieso bekomme ich bei einem in der Symboltabelle angelegten Dword eine -2147483648 raus wenn ich bit 0.7 setze?
Ich dachte bei DWord gibt's kein Vorzeichen?

0.7-0.0 1.7-1.0 2.7-2.0 3.7-3.0
Für einen Störmanager benötige ich die Stelle des Bits mit der höchsten Wertigkeit um die dazugehörige Stelle auszugeben. Dies
funktioniert auch super bis bit 0.7 auslöst. Ich brauche keine -2147483648 sondern +2147483648 (10000000000000000000000000000000)

verwende ich ABS bei -2147483648 kommt ne 0

Was mach ich denn nun damit?
 
Wo steht denn der Wert -2147483648?

Ich verstehe Dein Problem noch nicht. Du kannst ja mit Deinen Bits machen was Du möchtest. Wenn das als REAL definiert ist in der Symboltabelle kommen die Bits ja trotzdem.
Was macht der "Störmanager"?
 
Wie lässt du dir dein Doppelword anzeigen?

Doppelword ist vorzeichenlos. Liegt meiner Meinung nach nur an der Darstellung. Stell doch mal auf Hex oder Binär um und schau da doch mal.
 
Das kommt daher, weil jegliche Operationen mit numerischen Datentypen stets "signed" (vorzeichenbehaftet) sind - S7 kennt keine vorzeichenlosen numerischen Datentypen und Operationen. (*) Deshalb werden beim Beobachten (als Dezimal) die Werte auch als signed interpretiert und ggf. negativ angezeigt. Alle Ganzzahl(Festpunkt)-Operationen gehen davon aus, das die Operanden signed sind.

Wenn Du 32-Bit-Werte als "vorzeichenlos" verarbeiten willst, dann darfst Du das nur dann mit den vorzeichenbehafteten Operationen tun, solange der Wert positiv (>= 0) ist, d.h. das Bit .31 = 0 ist.
Für das Bit .31 brauchst Du eine Sonderbehandlung: vergleiche Deinen Wert mit 0
* < 0 : Bit .31 ist 1 --> Du hast das höchstwertige gesetzte Bit gefunden
* >= 0: Bit .31 ist 0 --> Du kannst mit den signed-Operationen weiterarbeiten


(*) DWORD bedeutet NICHT unsigned-DINT! DWORD ist kein numerischer Datentyp zum Rechnen sondern eine Ansammlung von 32 Bits. Einfach den Inhalt eines DWORD als unsigned-DINT interpretieren ist nicht korrekt.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die Antworten =)

ich ermittle mit einem code die höchste ausgelöste Stelle im DW

L #MSB_Data_1
DTR
SRD 23
L 126
-I
T #MSB1

funktioniert auch super bis bit 0.7 auslöst. Den code habe ich aus dem internetz.

Danke Harald für die genaue Erläuterung. Das hilft mir weiter
 
funktioniert auch super bis bit 0.7 auslöst. Den code habe ich aus dem internetz.
Sobald das Vorzeichenbit gesetzt ist funktioniert der Code normaleweise nicht mehr da das DTR vorbezeichenorientiert von einem DINT ausgehend wandelt.

In dem Beitrag hier hatten wir das schon mal detailliert ausprobiert. Da sind auch einige Beispiele drin wie du an deine Bitposition kommst.
http://www.sps-forum.de/simatic/73512-bit-wort-nach-integer-2.html#post510589
 
Danke Ronin, ich hab es wie Harald schrieb über Vergleicher gemacht. Bei einem negativen Wert schreib ich 31 in meine Variable (#MSB1).
 
ist das ne Fangfrage? :p ich generiere darüber Meldenummern. Über Schleifen kopiere ich dann zusätzliche Daten (Zeitstempel, K,G,Q) zur Meldenummer.
dieses Pakete schieb ich dann auf ein 4-zeiligen Display. reicht dir das als info? ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

ich lösche das Bit mit Schiebefunktion um die ermittelte Position und widme mich dann dem nächsten Bit. Bin mir aber noch nicht sicher ob mir das gefällt. :/
 
Zuletzt bearbeitet:
ich ermittle mit einem code die höchste ausgelöste Stelle im DW

L #MSB_Data_1
DTR
SRD 23
L 126
-I
T #MSB1

funktioniert auch super bis bit 0.7 auslöst. Den code habe ich aus dem internetz.
Hmm, dieser Code (und leichte Abwandlungen) wird wohl oft kopiert ohne ihn richtig zu verstehen und ohne genügend zu testen. :cool:
Stand da im "internetz" auch, daß dieser Code nur für WORD funktioniert, aber für DWORD nicht geeignet ist (von dem Vorzeichenproblem/Bit.31 ganz abgesehen)?
Mit DWORD funktioniert er nämlich nicht "super", sondern kann falsche Ergebnisse liefern.
RONIN hat in dem von ihm in Beitrag #7 verlinkten Thread darauf hingewiesen, daß die Formel bei DWORD problematisch ist.


Eigentlich naheliegend ist, mal die Ergebnisse dieser "Wunder"-Formel bei Grenzwerten wie 0 und DW#FFFFFFFF und DW#16#7FFFFFFF ... zu testen - und siehe da, die Formel liefert viele falsche Ergebnisse:
- 0 liefert -126 --> OK, mit 1 Spezialfall können wir leben, Check auf 0 ist einfach
- DW#16#FFFFFFFF liefert 257 --> richtig wäre 32 --> OK, noch eine Gruppe von Spezialfällen wegen Vorzeichen-Bit :rolleyes:
- DW#16#7FFFFFFF liefert 32 --> richtig wäre 31 :shock:
- DW#16#7FFFFFC0 liefert 32 --> richtig wäre 31
- DW#16#7FFFFFBF liefert 31 --> korrekt
- DW#16#3FFFFFFF liefert 31 --> richtig wäre 30
- DW#16#1FFFFFFF liefert 30 --> richtig wäre 29
- DW#16#1FFFFFF0 liefert 30 --> richtig wäre 29
- DW#16#1FFFFFEF liefert 29 --> korrekt
...
- DW#16#01FFFFFF liefert 26 --> richtig wäre 25
- DW#16#01FFFFFE liefert 25 --> korrekt
...
Verdammt, wie viele "Spezialfälle" gibt es denn noch?!! :roll:

Warum diese falschen Ergebnisse?
Weil DTR zum nächsten als Gleitkommazahl darstellbaren Wert rundet, wenn der REAL aus mehr als 24 Bit Ganzzahl gebildet werden soll, weil im REAL-Format nur 23 Bits für die Mantisse zur Verfügung stehen. Und wenn DTR dabei aufrundet, dann wird ein um 1 zu hoher Wert zurückgegeben.

Harald
 
Das habe ich damals auch dabei geschrieben, dass die Prüfung nur bis 24 Bit funktioniert. Die Aufgabenstellung des Fragestellers lautete damals, die Bits in einem WORD zu prüfen, und 16 Bit sind damit immer möglich.
Dass jemand auf die Idee kommt sowas wirklich in der SPS mal zu verwenden, hätte ich auch nicht geglaubt. Ich würde es nicht tun.
 
Habe gerade von PN/DP einen Link zu einem Siemens-FAQ bekommen in dem dieser Algorithmus (der uns ja schon über mehrere Themen hinweg Kopfzerbrechen bereitet) sehr schön erklärt wird.
Da steht dann auch drinnen das dieser (aus schon genannten Gründen) auch nur für WORD geeignet ist.

Ist einen Blick wert:
Maskieren vom niederwertigsten oder höchstwertigen gesetzten Bit in WORD und DWORD Variablen.

Mit der Beschreibung ist eigentlich alles klar wie die Sache funktioniert, warum der Wert 126, usw.
Aber als ich es begriffen habe war der erste Gedanken schon... "Meine Fresse.... was für ein....Schmarrn...." :cool:

Nochmal Danke, Harald.
 
Zuletzt bearbeitet:
Zurück
Oben