Rechenoperationen (DINT mit INT)

Son1317

Member
Beiträge
8
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Es gibt ja die möglickeit in den Eigenschaften das man mit einem INT-Format mit einem DINT-Format rechnen kann.
Ich hatte bis jetzt das Glück, dass das Ergebnis nie größer als ein INT-Format war!
Mich würde jetzt nur gerne mal interessieren was die SPS anstellt bzw. wie sie vor geht wenn die Zahl größer als ein INT-Format ist (z.B. DINT-Format).
Dort erscheint irgendwie ein wirkürliches Ergebenis!:confused:
 

borromeus

Well-known member
Beiträge
2.270
Punkte Reaktionen
329
Ich verstehe zwar nicht genau was Du meinst, aber wenn Du DINT-Zahlen mit INT Befehlen bearbeitest wird
a) wegen des Vorzeichens
b) wegen nicht berücksichtiger Bits 16-31
klarerweise ein seltsames Ergebnis entstehen.
 

Aventinus

Well-known member
Beiträge
1.347
Punkte Reaktionen
319
Zuviel Werbung?
->Hier kostenlos registrieren
Du kannst den INT-Wert in DINT wandeln und schon gehts weiter. Der AWL-Befehl lautet ITD.

Zum Zurückwandeln gibts keinen Befehl. Entweder der DINT-Wert ist im Zahlenbereich eines INT, dann transferierst du ganz einfach in einen INT. Ist er DINT ausserhalb passt es sowieso nicht.
 

Aventinus

Well-known member
Beiträge
1.347
Punkte Reaktionen
319
Nee, das Vorzeichen steht beim DINT ganz woanders. Das funktioniert nur, wenns positiv ist. Gruß

Das funktioniert doch, denn wenn du eine negative Zahl > -32768 hast dann sind die Bits 15-31 true und somit ist es egal ob das Bit 31 oder das Bit 15 das Vorzeichen ist. Bei positiven Zahlen ist es ähnlich, ist die Zahl < 32767 sind die Bits 15-31 false.
 
OP
S

Son1317

Member
Beiträge
8
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Ich starte einfach mal ein Beispiel:
Int = 16 Bit <-- dort steht die Zahl 15 drinnen -->Binär: 0000 0000 0000 1111
DInt = 32Bit <-- dort steht die Zahl 70000 drinnen -->Binär:0000 0000 0000 0001 0001 0001 0111 0000

Sobald die Zahl 15 in den Akku geladen wird, werden die reslichen Bits 16-31 mit nullen gefüllt!
Somit ist dies doch möglich das ich so rechnen kann oder??
oder ist es notwendig das ich das INT ind einem DINT wandel??
 

borromeus

Well-known member
Beiträge
2.270
Punkte Reaktionen
329
Ist möglich so, aber ab 32767 wirds unangenehm.
Sprich!
Was willst Du eigentlich machen.
Wenn ich eine INT mit einer DINT addieren muss heisst das bei mir:
L DW
L DD
+D
Warum funktioniert das bei Dir nicht?

und bedenke dennoch die eventuellen Probleme beim Vorzeichen der INT-Zahl!!!!!!
Du musst da wissen was Du tust.
 

Aventinus

Well-known member
Beiträge
1.347
Punkte Reaktionen
319
Notwendig ist es nicht, sofern du nur positive Zahlen hast. Denn dann ist das Bitmuster für INT und DINT identisch.

Bei neagiven Zahlen werden aber eim Laden von z.B. -10 die Bits 15-31 mit False aufgefüllt, als Dint wäre das dann aber 65526.
 

RobiHerb

Well-known member
Beiträge
678
Punkte Reaktionen
112
Vorher planen

Ich denke, dass man vorher planen sollte und überlegen muss, welchen Wertebereich man ausfüllen wird. Dann kommt eben INT oder DINT raus. Wenn man später sieht, dass es einen Überlauf geben kann, dann sollte man refaktorieren, sprich das Problem konsequent überarbeiten und nicht rumcasten. Basteln macht über kurz oder lang ein System unübersichtlich und instabil.

Viel schlimmer fallen mir immer wieder Code Schnipsel auf, die in der "Not" anfangen, Typen auf REAL zu casten und später wieder rückwandeln.
 

Perfektionist

Well-known member
Beiträge
3.557
Punkte Reaktionen
518
Viel schlimmer fallen mir immer wieder Code Schnipsel auf, die in der "Not" anfangen, Typen auf REAL zu casten und später wieder rückwandeln.
willst Du nun eine Grundsatzdiskussion über das für und wider von Typwandlungen lostreten?

Bei mir ist es tatsächlich so, dass ich für meine Berechnungen tatsächlich die komplette 32-Bit-Genauigkeit der DINT benötige, aber wegen einer Wurzel- oder Kreisfunktion dann eben doch noch DTR und die Rückwandlung brauche.

Aber ich gebe zu, auch ich habe schon Code gesehen, bei dem nicht einzusehen ist, warum (in meinen Augen unpassende) Daentypen gewählt wurden.
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
Zuviel Werbung?
->Hier kostenlos registrieren
@Perfektionist:
Ich denke nicht, das RobHerb DAS meinte und kann ich seine Aussage nur unterstützen.
Ich habe schon solche Programme gesehen, wo aus den genannten Gründen zwischen den Typen hin und her geswitched wurde - ich hatte da so meine Schwierigkeiten, das zu verstehen und nachzuvollziehen (und hatte am Schluß das Meißte weggeschmissen ...)
Es spricht m.E. gar nichts dagegen, sich vorher Gedanken zu machen, was die Variable machen/darstellen soll und sie entsprechend zu verwenden.

Gruß
Larry
 
Oben