TIA Deskalieren wie FC106 (SCL)

JaJa

Level-1
Beiträge
123
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

ich versuche gerade ein Unscale für eine S7-1200 zu basteln
Die Formel in der Siemens Hilfe ist OUT = [ ((IN–LO_LIM)/(HI_LIM–LO_LIM)) * (K2–K1) ] + #K1

BIPOLAR: K1 = -27648,0 und K2 = +27648,0
UNIPOLAR: K1 = 0,0 und K2 = +27648,0


IF #BIPOLAR THEN
#K1 := -27648.0;
#K2 := +27648.0;
ELSIF NOT #BIPOLAR THEN
#K1 := 0.0;
#K2 := +27648.0;
END_IF;

#OUT_REAL := ((( #IN - #LO_LIM) / (#HI_LIM - #LO_LIM)) * (#K2-#K1)) + #K1;
#OUT := TRUNC(#OUT_REAL);

Das klappt auch aber beim Übersetzen bekomme ich natürlich durch das erzeugen einer Ganzzahl
immer eine Warnung.

"Das Vorzeichen oder die Genauigkeit des Werts können verloren gehen"

Vielleicht jemand eine Idee !? Was ich machen kann damit die Warnung nicht mehr kommt ?

Danke
 
Eigentlich sollte bei der Meldung die Codezeile stehen bei der die Warnung auftritt.
Aber das liegt wohl an deiner TRUNC-Anweisung, denn damit schneidest du die Nachkommastellen ab.
Wenn du meinst das muss so, kannst du die Warnung ignorieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja klar das ist nur wegen der TRUNC Anweisung.
Gibt es denn sonst eine andere Möglichkeit von REAL in Ganzzahl wandeln !?

Eigentlich versuche ich immer 0 Fehler / 0 Warnungen zu bekommen beim übersetzen.

Wenn du meinst das muss so, kannst du die Warnung ignorieren.

Ja klar bei FC106 im Step7 Classic kommt beim Out auch eine INT raus von -27648 bis + 27648 die man dann auch einen Analogausgang geben kann
 
Zuletzt bearbeitet:
Ich gehe dann mal davon aus dass bei dir #Out vom Datentyp INT ist.
Dann liegt die Warnung an der impliziten Typkonvertierung, denn TRUNC hat als Ergebnis den Datentyp DINT, der dann automatisch (d.h. implizit) in INT konvertiert wird.
Um die Warnung zu beseitigen, kannst du eine eigene Typkonvertierung (explizit) hinschreiben:
Code:
#OUT := DINT_TO_INT(TRUNC(#OUT_REAL));
Dann sollte es Ruhe geben.

Du kannst auch ganz ohne TRUNC direkt:
Code:
#OUT := REAL_TO_INT(#OUT_REAL);
schreiben, dann wird aber imho gerundet und nicht abgeschitten.

Wenn du in den Bausteineigenschaften den Haken für die IEC-Prüfung setzt, sind keine impliziten Konvertierungen mehr möglich. D.h. du musst immer explizit hinschreiben wenn von einem Typ in einen anderen konvertiert wird. Die Voreinstellung von Siemens ist ohne IEC-Prüfung, ich würde aber empfehlen das in den Einstellungen wieder umzustellen dass jeder neue Baustein automatisch IEC-Prüfung gesetzt bekommt. Dann wäre deine Codezeile mit der Warnung nämlich überhaupt nicht übersetzbar gewesen.
 
Zurück
Oben