Step 7 Zahlenwert im MW Stimmt nicht

S7Anfänger

Level-2
Beiträge
291
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich habe eine Sache, die ich mir mal wieder nicht erklären kann.


Es wird ein Zahlenwert (REAL) in einem FB3 errechnet und dann über einen MOVE als (INT) an OUT gegeben. bis dahin ist alles Klasse und funktioniert wunderbar.

Der FB3 wird dann im OB33 Aufgerufen. Dort wir der OUT dann in das Merkerwort 30 geschrieben. Ab hier kann ich mir den Zahlenwert nicht erklären. Dieser weicht total voneinander ab.
Eine Doppelzuweisung vom MW30 habe ich bei den Referenzdaten geprüft. Dieses MW wird nur einmal geschrieben und einmal gelesen. Auch ein normaler Merker ist nicht ins MW gerutscht.

Kann mir das jemand erklären?

Wenn als Solldrehzahl der REAL Wert 1239.3 steht, möchte ich diesen über den MOVE zu einem INT mit dem Zahlenwert 1239 wandeln. Dieser muss dann in das MW30 geschrieben werden.

Beste Grüße
Hagen
 

Anhänge

  • OB33 NW1.PNG
    OB33 NW1.PNG
    2,3 KB · Aufrufe: 43
  • FB3 NW4 Gleit.PNG
    FB3 NW4 Gleit.PNG
    12,1 KB · Aufrufe: 46
  • FB3 NW4 Auto.PNG
    FB3 NW4 Auto.PNG
    12,2 KB · Aufrufe: 41
Hast Du denn auch an die Wandlung von Real zu INT gedacht?
Eine Realzahl passt nicht in ein Merkerwort (16bit).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin S7Anfänger,

in Deinem ersten Bild wird die temporäre(?) Variable "Drehzahlsollwert" nicht beschrieben, da keine Berechnung aktiviert wurde.
Daher steht in "Drehzahlsollwert" irgend etwas drin...
Du musst temporäre Variablen immer schreiben, bevor Du sie lesen darfst.

Also eine temporäre Variable (TEMP) ist erst einmal nur deklariert, d.h. beschrieben. Aber ihr wurde noch kein Speicherbereich zugewiesen.
Wenn der Baustein mit der TEMP aufgerufen wird, wird ihr ein Speicherbereich zugewiesen (da kann schon irgendwas drin stehen).
Also: erst einmal was gültiges reinschreiben!
Wenn der Baustein verlassen wird, wird der Speicherbereich wieder freigegeben und kann für andere Programmteile verwendet werden!

Wenn Du die TEMP nutzt, um ihren Wert an Deinen Ausgang zu schreiben, aber nichts gültiges drin steht, steht dann auch nichts gültiges im MW30.

VG

MFreiberger
 
Hallo Hagen,

wie andy schon schrieb musst du noch von REAL nach INT umwandeln. Das macht man z.B. mit dem ROUND Befehl! Zudem darf das Ergebnis nicht größer als 32768 sein.

Gruß Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn als Solldrehzahl der REAL Wert 1239.3 steht, möchte ich diesen über den MOVE zu einem INT mit dem Zahlenwert 1239 wandeln. Dieser muss dann in das MW30 geschrieben werden.

Beste Grüße
Hagen

Du musst mit dem Befehl "Round" das ganze in eine DINT verwandeln!
Und von der DINT dann eben nur ein Wort verwenden.
 
Moin Betriebselektriker28,

Du musst mit dem Befehl "Round" das ganze in eine DINT verwandeln!
Und von der DINT dann eben nur ein Wort verwenden.

Achtung! Bei positiven Dint-Werten ist das kein Problem, aber bei negativen Werten entfällt Dir dann das negative Vorzeichen. Das müsste man dann manuell weitergeben (bit31 vom DINT an bit15 vom int).


...oder DI_BCD und dann BCD_I...

VG

MFreiberger
 
Zuletzt bearbeitet:
@S7Anfänger
Schau mal zurück in Deinen Thread vor 3 Wochen:
Code:
        +---------+
        |  DIV_R  |
   ...--|EN       |              +---------+
#In_kg--|IN1   OUT|-#tmp_Real    |  TRUNC  |
 100.0--|IN2   ENO|--------------|EN    OUT|-#Out_Int
        +---------+   #tmp_Real--|IN    ENO|-
                                 +---------+
Je nachdem, wie die wegfallenden Nachkommastellen bei der Umwandlung zu INT behandelt werden sollen (einfach abschneiden oder Ausgabewert runden) kannst Du TRUNC oder ROUND (oder FLOOR) verwenden.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
bei negativen Werten entfällt Dir dann das negative Vorzeichen. Das müsste man dann manuell weitergeben (bit31 vom DINT an bit15 vom int).
Zum Glück haben DINT und INT kein Vorzeichenbit, deshalb kann es beim Verwenden des niederwertigen Words als INT auch nicht entfallen und muß auch nicht weitergegeben werden :cool:

...oder DI_BCD und dann BCD_I...
Na, da kommt man ja erst recht in Teufels Küche... :shock:

Harald
 
Moin PN/DP,

Zum Glück haben DINT und INT kein Vorzeichenbit, deshalb kann es beim Verwenden des niederwertigen Words als INT auch nicht entfallen und muß auch nicht weitergegeben werden :cool:

bzgl. int: ich dachte das ist genau der Kniff im Gegensatz zu eine WORD? Deshalb hat int ja auch den Bereich -32767 - +32768 :??!


VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
bzgl. int: ich dachte das ist genau der Kniff im Gegensatz zu eine WORD? Deshalb hat int ja auch den Bereich -32767 - +32768 :??!
INT hat den Wertebereich -32768 .. +32767

Der clevere Trick ist: Ganzzahlen INT und DINT werden im Zweierkomplement dargestellt und gespeichert.
  • Bei einem negativen DINT-Wert -32768 .. -1 sind alle Bits .31 .. .15 = 1, wenn man davon einfach das höherwertige Word mit den Bits .31 .. .16 wegläßt, dann bleibt übrig ein INT mit dem selben Wert. :cool:
  • Bei einem positiven DINT-Wert 0 .. +32767 sind alle Bits .31 .. .15 = 0, wenn man davon einfach das höherwertige Word mit den Bits .31 .. .16 wegläßt, dann bleibt übrig ein INT mit dem selben Wert.
Deshalb kann man DINT-Werte im Wertebereich von INT (die also für INT zulässig sind), einfach in INT wandeln durch weglassen des höherwertigen Word.

Code:
 3          2          1
10987654 32109876 54321098 76543210 Bit-Nummer

11111111_11111111_10000000_00000000 = -32768 DINT
                  10000000_00000000 = -32768 INT

00000000_00000000_01111111_11111111 = +32767 DINT
                  01111111_11111111 = +32767 INT

Harald
 
Zurück
Oben