Real -> Int

Zuviel Werbung?
-> Hier kostenlos registrieren
Aber brauch den Wert doch um Ihn dann wieder bei DI_BCD einzulesen oder nicht?

myReal der Analogwert
myDINT eine Tempvariable
myINT das Ziel wo der Integer Wert hin soll.

Einen Block ROUND mit myReal als Eingang und myDINT als Ausgang und dann einen Block MOVE mit myDINT am Eingang und myINT am Ausgang
 
und jetzt?

Also lieber BastiMG, was ich damit sagen wollte, bei mathematischen Funktionen oder wandlungen, solltest du dich an AWL oder SCL gewöhnen. Zu Überlegen gibt es da nicht viel, alleine übersicht ist da schon auschlaggebend. (Von geschwindigkeiten mal ganz zu schweigen)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
und die anderen zwischenspeicherungen wie tmep_dint und so??

Weist Du was eine TEMP Variable ist?

Wenn "Nein" dann zur Info:
Also eine lokale und nicht statische Variable die im "Kopf" von FCs/FBs im Bereich Temp deklariert werden. Also es gehen Dir keine Merker oder Datenbausteininhalte für diesen Kunstgriff drauf. Also eine Tempvariable tut echt nicht so weh.

Desweiteren kann ich an Repök nur 100% Ack. schicken. Berechnungen lieber in SCL bzw. AWL erledigen.
 
Hi,

ich als Neuling sag dann hier auch mal was...

Also du mußt die Werte in temporären Variablen zwischenspeichern oder du weichst auf AWL aus... Rechenoperationen (Runden, Addieren, Multiplizieren usw.) macht man besser in AWL

In AWL würde dein Frage dann so aussehen

L MD 100
TRUNC
DTB
BTI
T #OutVar
 

Anhänge

  • OB1.pdf
    3,5 KB · Aufrufe: 26
  • FC100.pdf
    3 KB · Aufrufe: 34
  • FC200.pdf
    3 KB · Aufrufe: 28
  • PLCSIM INT 01.jpg
    PLCSIM INT 01.jpg
    154,8 KB · Aufrufe: 34
Es ist bei meinem Programmbeispiel auf jeden Fall der Wertebereich für INT-Zahlen von -32768 bis +32767 zu beachten. Die REAL-Zahlen dürfen also nicht kleiner als -32768 und nicht größer als +32767 sein, es kommt sonst bei Umwandlung in die INT-Zahl ein falsches Ergebnis raus.

Gruß Kai
 

Anhänge

  • PLCSIM INT 02.jpg
    PLCSIM INT 02.jpg
    155,8 KB · Aufrufe: 10
  • PLCSIM INT 03.jpg
    PLCSIM INT 03.jpg
    155,8 KB · Aufrufe: 11
  • PLCSIM INT 04.jpg
    PLCSIM INT 04.jpg
    155,8 KB · Aufrufe: 9
  • PLCSIM INT 05.jpg
    PLCSIM INT 05.jpg
    155,7 KB · Aufrufe: 11
Man muss auch bei Siemens nicht zwangsweise in einer TEMP-Variable zwischenspeichern,
auch nicht bei KOP/FUP.

Einfach im Editor unter Einstellungen -> KOP/FUP die Typüberprüfung ausschalten,
und schon funktioniert auch bei KOP/FUP wie bei AWL.
Am Problem des Überlaufs ändert sich dadurch natürlich auch nichts,
aber bei der Rundung von REAL auf DINT kommt es auch irgendwann zum Überlauf,
bei ca. 2,1 Milliarden.

bild.jpg

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man muss auch bei Siemens nicht zwangsweise in einer TEMP-Variable zwischenspeichern,
auch nicht bei KOP/FUP.

Einfach im Editor unter Einstellungen -> KOP/FUP die Typüberprüfung ausschalten,
und schon funktioniert auch bei KOP/FUP wie bei AWL.
Am Problem des Überlaufs ändert sich dadurch natürlich auch nichts,
aber bei der Rundung von REAL auf DINT kommt es auch irgendwann zum Überlauf,
bei ca. 2,1 Milliarden.

Mfg
Manuel

Dein Tip ist sicherlich für den einen oder anderen Hilfreich.
Aber das Abschalten der Typprüfung würde mich mehr stören als die Tempvariable (auch wenn ich es bei AWL toleriere). In SCL würde ich auf jeden Fall einen expliziten Typecast machen.

Der Roundbaustein verlangt sich ja auch einen DINT dann soll er ihn auch haben ;o)
Code:
ROUND : Zahl runden
Parameter   Datentye    Speicherbereich      Beschreibung
EN          BOOL        E, A, M, D, L, T, Z  Freigabeeingang
IN          REAE        E, A, M, D, L 
                        oder Konstante       Wert, der gerundet wird
OUT         DINT        E, A, M, D, L        IN zur nächsten ganzen Zahl gerundet
ENO         BOOL        E, A, M, D, L        Freigabeausgang
 
Mich persönlich regt im diesem Fall die Tatsache eine Temp-Variable benutzen zu müssen,
ansich mehr auf.

Allerdings ist Siemens da ja auch nicht sehr kosequent,
erstens weil es in AWL sämtliche Möglichkeiten gibt unspezifiert
auf alles mögliche zuzugreifen, und dann weil konsequenterweise ein
MOVE von DINT auf INT auch nicht funktionieren sollte.
Die IEC-Systeme die ich näher kenne, erzeugen eine Fehlermeldung beim kompilieren wenn man sowas macht.

Bei den IEC-Systemen die ich kenne gibt es also auch einen Baustein in jeder Programmiersprache DINT_TO_INT,
das dürfte ja bei Fönigs Liebling Codesys auch so sein.
Bei SCL/ST gibt es ja auch DINT_TO_INT, sogar bei Siemens.

Es handelt sich auch um eine Schwäche des FUP-Editors von Siemens,
das man z.B. einen Zahlenausgang nicht direkt auf einen Zahleneingang
"malen" kann.

Mfg
Manuel
 
Besten Danke. Klappt auch alles jetzt!

Kann ich denn auch den Wert 2x neu speichern ? Quasi so??



L MD 100 //Doppelwort
RND
T DB1.DBW 0 // Wort
T DB13.DBW 0
 
Zurück
Oben