TIA Wer spinnt hier?

Zottel

Level-3
Beiträge
2.299
Reaktionspunkte
278
Zuviel Werbung?
-> Hier kostenlos registrieren
SCL in TIA13: Ich will einen real-Wert auf ein QW schreiben.
Bei:
Code:
#Output_1 := FLOOR(#r);
unterstreicht der Editor das gelb und sagt: Das Vorzeichen oder die Genauigkeit des Werts können verloren gehen.
Das bin ich leid und probiere mal, welche "Spezialversionen" von FLOOR das Zeug kennt:
Code:
#Output_1 := FLOOR_WORD(#r);
Jetzt kriege ich keine Warnungen, sondern 2 richtige Fehler:
1.Der Datentyp 'Word' ist als Rückgabewert für die Funktion 'FLOOR_WORD' nicht zulässig.
2.Eine implizite Konvertierung von Datentyp 'Real' nach 'Undef' ist nicht möglich.
Ich hätte ja Verständnis dafür, wenn es kein FLOOR_WORD gäbe, aber offensichtlich wird der Funktionsname ja so akzeptiert. Wenn es
die Funktion aber gibt, was zum Teufel gibt sie dann zurück?
Und wo tritt der zweite Fehler auf? Klick darauf verweist ins Innere der Klammer. Dort wird also der Datentyp Undef erwartet...

Mal sehen, was das Zeug noch drauf hat...
Code:
#Output_1 := FLOOR_BOOL(#r);
"Der Datentyp 'Bool' ist als Rückgabewert für die Funktion 'FLOOR_BOOL' nicht zulässig."
Code:
#Output_1 := FLOOR_BROT(#r);
Code:
#Output_1 := FLOOR_BOOL(#r);
"Der Operand FLOOR_BROT ist nicht definiert."
Also FLOOR_BOOL() ist wie FLOOR_WORD eine wohlbekannte Funktion, liefert aber kein verwertbares Ergebnis.

Solch ein Verhalten des Compilers würde ausserhalb der Siemens- oder TIA-Welt m.E. niemand hinnehmen!!
 
Hallo Thomas,
da ich selber (noch) nicht mit TIA arbeite : welche Aufgabe genau hat der Befehl "FLOOR" ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ach Larry - ein bisschen google hat noch keinem geschadet :)

Floor/Ceil heisst in den meisten Sprachen/Standardlibs - Auf "Ganzahl" Auf/Abrunden - aber als Fließkomma belassen - floor (2.3) => 2.0
 
"CEIL": Rundung zur nächst größeren ganzen Zahl,
"FLOOR": Rundung zur nächst kleineren ganzen Zahl,
"ROUND": Rundung zur nächsten ganzen Zahl,
"TRUNC": Ohne Rundung.
 
ach Larry - ein bisschen google hat noch keinem geschadet :)

Floor/Ceil heisst in den meisten Sprachen/Standardlibs - Auf "Ganzahl" Auf/Abrunden - aber als Fließkomma belassen - floor (2.3) => 2.0

nicht ganz, wenn es ne Fließkomma bleiben soll dann musst du FLOOR_REAL nehmen, ansonsten wird es ne Ganzzahl ;)

Interessanter wäre für welche CPU das Program da eigentlich ist , FLOOR unterscheidet sich zwischen S7-x00 und S7-1x00
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ach Larry - ein bisschen google hat noch keinem geschadet :)
tut mir leid - ich wußte nicht, dass ich nicht auch mal was fragen darf ... ;)

Floor/Ceil heisst in den meisten Sprachen/Standardlibs - Auf "Ganzahl" Auf/Abrunden - aber als Fließkomma belassen - floor (2.3) => 2.0
ROUND und TRUNC kenne ich als Befehle - FLOOR und CEIL (Fußboden und Decke) hatte ich bislang noch nicht ... ich kenne aber auch scheinbar nicht "die meißten Sprachen" bzw. die "Standard-Libs"

So kommt es dann halt zu der Frage ... und stimmt ... ich wollte lieber rückfragen als googeln ... 8)

Gruß
Larry
 
Aus dem S7-Basic-Handbuch S. 2556 (mit meinen Ergänzungen):

1. FLOOR liefert bezüglich der Ausgangszahl die nächst kleinere Ganzzahl (geht auf dem Zahlenstrahl also immer nach links bis zur nächsten Ganzzahl).
Auch die Zahl 5.0 ist in diesem Sinne eine Ganzzahl.
x := FLOOR (5.678) ---> 5
x := FLOOR (-5.678) --> -6
2. Wird FLOOR in dieser Form verwendet, ist das Ergebnis der Rückgabe eine Ganzzahl im DINT-Format !!!
3. Der FLOOR-Befehl kann auch in einer erweiterten Form verwendet werden:

x := FLOOR_Datentyp (Ausdruck)


- Ausdruck ist logischerweise immer eine Gleitpunktzahl (S7 kennt REAL und LREAL), das Format braucht nicht explizit angegeben zu werden.
- Datentyp ist das Format, in dem der abgerundete Ausdruck zurückgegeben wird (Ganzzahl oder wieder Gleitpunktzahl)
x := FLOOR_LREAL(5.678) ---> 5.000000000000000, x muss dabei einen LREAL-Wert aufnehmen können, sonst gibt es eben Fehler.
x := FLOOR_SINT (-5.678) ---> -6, x muss für einen SINT-Wert aufnahmebereit sein. x als Byte zu vereinbaren scheint nicht auszureichen !

S7-TIA kennt eine fast unüberschaubare Fülle an Datentypen. Laut Handbuch sind es genau 104 (Wahnsinn!!!).
Das Rückgabeformat von FLOOR_xxxxx kann also eine Gleitpunktzahl (Format REAL oder LREAL) oder eine Ganzzahl sein. Für Ganzzahlen gibt es (lt. Handbuch genau 8 Typen).
BOOL,BYTE, WORD, DWORD und LWORD gehören nicht dazu !
Der Ansatz von Siemens in diesem Zusammenhang ist nicht schlecht, diese Datentypen werden nämlich als Bitfolgen bezeichnet, leider steht aber über der Tabelle auch der Begriff Binärzahlen und das muss man falsch nennen.
In einem Handbuch mit 4971 Seiten kann das schon mal vorkommen.
Soweit aus meiner Sicht zur Klarstellung.
Meine Aussagen kann ich leider nicht praktisch testen, weil ich mir S7-TIA-Portal mangels Hardware nur theoretisch erschließen kann.
Deshalb bitte nicht erschlagen, wenn meine Aussagen nicht stimmen sollten.
Schönen Abend noch!

eNDe
 
Interessanter wäre für welche CPU das Program da eigentlich ist , FLOOR unterscheidet sich zwischen S7-x00 und S7-1x00
Für eine 1214. Ich würde nicht TIA nehmen, wenn ich nicht müßte.
Für Ganzzahlen gibt es (lt. Handbuch genau 8 Typen).
BOOL,BYTE, WORD, DWORD und LWORD gehören nicht dazu !
eNDe
Ok, mag ja sein. Aber erstens muß man ständig numerische Werte auf QWs schreiben, QWs sind immer Words. Es sollte dafür auch eine Art geben, wie man das macht, ohne Warnungen zu erzeugen. Vielleicht ist die mir ja entgangen...
Zweitens: Wenn Word kein numerischer Datentyp ist, dann sollte es halt kein FLOOR_WORD geben. Dann sollte es wie jeder andere nicht existierende Bezeichner behandelt werden.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Für eine 1214. Ich würde nicht TIA nehmen, wenn ich nicht müßte.

Ok, mag ja sein. Aber erstens muß man ständig numerische Werte auf QWs schreiben, QWs sind immer Words. Es sollte dafür auch eine Art geben, wie man das macht, ohne Warnungen zu erzeugen. Vielleicht ist die mir ja entgangen...
Zweitens: Wenn Word kein numerischer Datentyp ist, dann sollte es halt kein FLOOR_WORD geben. Dann sollte es wie jeder andere nicht existierende Bezeichner behandelt werden.

Du verlangst einfach zu viel von Siemens. ;)
Wir können doch schon froh sein, dass sie SPS sich nicht mehr verrechnen, wie das noch bis vor Kurzem bei Gleitpunkt-Konstanten der Fall war. :ROFLMAO:
 
welchen Datentyp hat Output_1 bei Dir?
Wenn ich Output_1 als word definiere und die Funktion FLOOR_USINT verwende dann kommen bei mir keine Warnungen und keine Fehler.
 
Zuletzt bearbeitet:
welchen Datentyp hat Output_1 bei Dir?
Word, weil ich es am Ende einem QW zuweisen will.
Ok, ich probiere es mit FLOOR_USINT...aber erst mal nachlesen...
Zitat aus der Hilfe:
Ein Operand vom Datentyp USINT (Unsigned Short INT) hat eine Länge von 8 Bit und enthält Zahlenwerte ohne Vorzeichen. Da gehen mir Bits flöten! Und noch besser: Wenn der Wert von 255 nach 256 wechselt, legt der Motor ne Vollbremsung hin...
Mal sehn ob es ein UINT gibt:
Ein Operand vom Datentyp UINT (Unsigned INT) hat eine Länge von 16 Bit und enthält Zahlenwerte ohne Vorzeichen.
Und FLOOR_UINT gibt es auch. Und auch ohne gelbe Schlange. Somit gibt es eine Methode, dem QW einen Zahlenwert zuzuweisen, ohne die Meckermarkierung.
Für mich ist das an dieser Stelle ausreichend. Aber an anderer Stelle habe ich Ausgänge, die -10V bis +10V machen...
Und ja, es gibt FLOOR_INT. Wenn ich das einem %QW zuweise, wird es wieder gelb markiert.
Aber ich kann meinen Ausgang NICHT als INT definieren (a lá %QI96). Das gibt rot.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn in den Bausteineigenschaften die Option "IEC-Prüfung" nicht gesetzt ist, gibt es nur Warnungen bei einer Zuweisung von einem größeren zu einem kleineren Datentyp. Ist die Option gesetzt ist so eine Typkonvertierung nur explizit erlaubt.
Voreinstellung von Siemens ist ohne IEC-Prüfung. Ich habe dieOption bei mir immer aktiviert. Es lässt sich in den Voreinstellungen anpassen dass neue Bausteine automatisch diese Option gesetzt bekommen.

Ich würde selber überhaupt nicht diese (wie es aussieht halbgaren) Siemens-Spezial-Erweiterungen für Anweisungen verwenden, sondern ganz einfach die vorhandenen Typkonvertierungen nehmen:
Code:
#word_var := DINT_TO_WORD(ROUND(47.11));

Dass der Parser aber augenscheinlich zusammengesetzte nicht sinnvolle Typen erkennt ist schon seltsam. Das funktioniert auch bei anderen Konvertierungsfunktionen wie TRUNC oder ROUND (z.B. ROUND_STRING).
 
Ok, DINT_TO_WORD hält meinen Quelltext sauber.
Also noch die Hilfe gelesen (Im Index DINT_TO_aufgerufen):
Das Bitmuster des Quellwerts wird ohne Änderung rechtsbündig in den Zieldatentyp übertragen. Wenn ein negativer Wert in einen vorzeichenlosen Zieldatentyp konvertiert wird, wird der Freigabeausgang ENO auf "0" gesetzt.
Soweit einverstanden.
Nun steht bei BYTE, WORD, DWORD jeweils eine Verweis auf die Anmerkung 1) und darunter:
1) Bitfolgen (BYTE, WORD, DWORD) und der Datentyp CHAR werden zuerst inklusive Vorzeichen auf die notwendige Breite erweitert, anschließend werden die Bit kopiert. Der Quelltyp entscheidet über die Interpretation.
Das betrifft doch wohl eher BYTE_TO_DINT etc!
 
Zuletzt bearbeitet:
Zurück
Oben