# DINT nach INT bei positiven und ganzzahligen Werten (Frequenzmessung)



## poppycock (23 Juli 2009)

Hallo,

ich lese mit meiner 314IFM eine Frequenz mit dem SFB30 ein.
Diese Frequenz wird in dem dazugehörigen Instanz-DB als DINT gespeichert.
Da ich keine negative Zahl erwarte, kann ich doch einfach den DINT-Wert aus dem Instanz-DB in mein Visu-DB als INT schieben, sofern der DINT in ein INT passt!?
Außerdem wird der Wert im Instanz-DB in mHz angegeben, ich benötige diese Angabe in Hz.

Ich habe jetzt folgende Idee:

```
L     DB30.DBD 10 // Instanz-DB
L     1000
/D    
T     DB50.DBW 2 // Frequenz
```
Würde das so funktionieren, um die Frequenz in Hz zu messen und als INT zu speichern?
Die Frequenz kommt NIE über 100Hz, im Normalfall pendelt sich diese bei 80 bis 90Hz ein.
Wenn ich ehrlich bin, gefällt mir die Division nicht, geht das anders?

Sorry für die dummen Fragen, aber irgendwie macht es noch nicht klick, wie ich ein DINT in ein INT schiebe (vorausgesetzt das DINT passt in ein INT)...

Gruß,
poppycock


----------



## Ralle (23 Juli 2009)

Wenn die Grenzen einer Int nicht überschritten werden, geht das.


----------



## poppycock (23 Juli 2009)

Zum Verständnis:

Ich stelle mir gerade eine 1 als DINT vor:
00000000 00000000 00000000 00000001

Nun stelle ich mir eine 1 als INT vor:
xxxxxxxx xxxxxxxx 00000000 00000001

Wenn ich nun dieses DINT als INT speichern will, werden die ersten 16 Bits von rechts nach links "verwendet"?!
Richtig?

Wenn ich folgenden DINT habe:
00000000 00000001 11111111 11111111
kann ich diesen NICHT als ein INT schreiben, weil ich damit den Wertebereich eines INT verlasse?!
Richtig?


----------



## Larry Laffer (23 Juli 2009)

Hallo,
es ist so wie Ralle gesagt hat ...
Denk bitte daran, wie die Bytes und Worte (bei Siemens) in einem Doppelwort / DINT liegen ...

Gruß
LL


----------



## Rainer Hönle (23 Juli 2009)

poppycock schrieb:


> Wenn ich folgenden DINT habe:
> 00000000 00000001 11111111 11111111
> kann ich diesen NICHT als ein INT schreiben, weil ich damit den Wertebereich eines INT verlasse?!
> Richtig?


Stimmt. Und eine DINT von z.B.
00000000 00000000 10111111 11111111
kann auch nicht verwendet werden, da das jeweils oberste Bit das Vorzeichenbit ist und sich somit eine negative Zahl ergeben würde.


----------



## Larry Laffer (23 Juli 2009)

poppycock schrieb:


> Wenn ich folgenden DINT habe:
> 00000000 00000001 11111111 11111111
> kann ich diesen NICHT als ein INT schreiben, weil ich damit den Wertebereich eines INT verlasse?!
> Richtig?


 Du könntest diesen Wert aber z.B. um 2 nach Rechts schieben (durch 4 teilen) - dann ginge es wieder. Ein INT hat (genau wie ein DINT) nun mal seine Bereichsgrenzen ...


----------



## poppycock (23 Juli 2009)

Larry Laffer schrieb:


> Denk bitte daran, wie die Bytes und Worte (bei Siemens) in einem Doppelwort / DINT liegen ...



Wenn ich ein DINT nach DB1.DBD0 speichere, dann kann ich mit DB1.DBW2 das INT herauslesen.
So hast du das doch gemeint, oder?



Rainer Hönle schrieb:


> Und eine DINT von z.B.
> 00000000 00000000 10111111 11111111
> kann auch nicht verwendet werden, da das jeweils oberste Bit das Vorzeichenbit ist und sich somit eine negative Zahl ergeben würde.



Das stimmt auch mal wieder! Irgendwie ist das alles ganz logisch, aber ich verstehe noch immer nicht so ganz, wie ich ein (von der Größe her passendes) DINT in ein INT speichern kann. Werden die führenden Nullen eines DINT einfach ignoriert?

Beispiel:

```
L     DB30.DBD 10 // DINT laden, das in ein INT passt
T     DB50.DBW 2  // als INT speichern
```


----------



## Rainer Hönle (23 Juli 2009)

poppycock schrieb:


> ```
> L     DB30.DBD 10 // DINT laden, das in ein INT passt
> T     DB50.DBW 2  // als INT speichern
> ```


Wenn sichergestellt werden kann, dass der Wertebereich ziwschen -32768 und +32767 liegt, kann dieser Code bedenkenlos verwendet werden. Natürlich kann der Wert auch erst durch 1000 geteilt werden, wenn für das Ergebnis diese Bedingung zutrifft. Im positiven Falle werden die Nullen in den oberen 16 Bits ignoriert und im negativen Falle sind die obersten 17 Bits sowieso 1 und somit bleibt danach das Vorzeichenbit (Bit 15) übrig.


----------



## poppycock (23 Juli 2009)

Rainer Hönle schrieb:


> Wenn sichergestellt werden kann, dass der Wertebereich ziwschen -32768 und +32767 liegt, kann dieser Code bedenkenlos verwendet werden. Natürlich kann der Wert auch erst durch 1000 geteilt werden, wenn für das Ergebnis diese Bedingung zutrifft.


Ja, der Min-Wert ist 0 und der Max-Wert ist <= 100
Von daher ist das sichergestellt!



Rainer Hönle schrieb:


> Im positiven Falle werden die Nullen in den oberen 16 Bits ignoriert und im negativen Falle sind die obersten 17 Bits sowieso 1 und somit bleibt danach das Vorzeichenbit (Bit 15) übrig.


Super, danke! Die Erklärung hat mir sehr zum Verständnis meiner Frage beigetragen!


----------



## poppycock (23 Juli 2009)

*GELÖST! Vielen Dank!*

Mit meinem hundertsten Beitrag gibt es etwas erfreuliches zu berichten!

Es klappt wunderbar!
Ich kann ohne Probleme den mHz-Wert als DINT in ein INT-Datenbereich schieben, der vorher nach Hz umgerechnet wurde:


```
L     DB30.DBD 10 // DINT laden, das in ein INT passt (Frequenz in mHz)
L     1000        // mHz nach Hz
/D                // mHz nach Hz umrechnen
T     DB50.DBW 2  // als INT speichern (Frequenz in Hz)
```
Vielen Dank an alle, die mir geholfen haben mein Verständnisproblem zu beseitigen!

Gruß,
poppycock


----------

