TIA Unscale S7 1200

ruesti

Level-1
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich muss ein Analogsignal für eine Frequenzumrichter ausgeben. Das würde ich gerne mit dem "unscale" Befehl machen. Den finde ich aber nirgens für die S7 1200.
 
Bei unscale ist das auch so schön dass da die option Bipolar ist. Eigentlich sehr schade dass es das nicht mehr gibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei unscale ist das auch so schön dass da die option Bipolar ist. Eigentlich sehr schade dass es das nicht mehr gibt.
Bipolar gibt lediglich an, ob beim jetzigen Scale_X beim Rückskalieren der Wert des Eingangs "Min" =0 oder =-27648 ist.


In Step7 V5.x ist eine sehr detaillierte Baustein-Beschreibung wie der FC106 UNSCALE intern arbeitet. Damit kann man UNSCALE leicht in SCL nachprogrammieren.
Eine solche Beschreibung mit der Formel findet man auch in der TIA-Hilfe unter UNSCALE (ohne die FC Nr.) für die Legacy-Bausteine der S7-1500.
 
SCALE UNSCALE SCL für TIA

In Step7 V5.x ist eine sehr detaillierte Baustein-Beschreibung wie der FC106 UNSCALE intern arbeitet. Damit kann man UNSCALE leicht in SCL nachprogrammieren.
Ich hatte etwas Zeit und Lust. ;):cool:
Code:
FUNCTION "UNSCALE_SCL" : Word
TITLE = 'UNSCALING VALUES'
{ S7_Optimized_Access := 'TRUE' }

AUTHOR  : PN_DP
FAMILY  : CONVERT
NAME    : UNSCALE
VERSION : 1.0
[COLOR="#008000"]//Funktion wie Step7 V5.x > TI-S7 Converting Blocks > FC106 UNSCALE[/COLOR]

   VAR_INPUT
      IN      : Real;   [COLOR="#008000"]// input value to be unscaled[/COLOR]
      HI_LIM  : Real;   [COLOR="#008000"]// upper limit in engineering units[/COLOR]
      LO_LIM  : Real;   [COLOR="#008000"]// lower limit in engineering units[/COLOR]
      BIPOLAR : Bool;   [COLOR="#008000"]// 1=bipolar; 0=unipolar[/COLOR]
   END_VAR
   VAR_OUTPUT
      OUT     : Int;   [COLOR="#008000"]// result of the unscale conversion[/COLOR]
   END_VAR
   VAR_TEMP
      tmp_OUT : Real;
      K1      : Real;
   END_VAR
   VAR CONSTANT
      K2      : Real := +27648.0;
   END_VAR

BEGIN

    [COLOR="#008000"]// Die Konstanten K1 und K2 werden unterschiedlich gesetzt, je nachdem, ob der Eingabewert BIPOLAR oder UNIPOLAR ist.[/COLOR]
    [COLOR="#008000"]// BIPOLAR : Es wird angenommen, daß der ganzzahlige Ausgabewert zwischen -27648 und 27648 liegt, deshalb sind K1 = -27648,0 und K2 = +27648,0.[/COLOR]
    [COLOR="#008000"]// UNIPOLAR: Es wird angenommen, daß der ganzzahlige Ausgabewert zwischen 0 und 27648 liegt, deshalb sind K1 = 0,0 und K2 = +27648,0.[/COLOR]
    IF #BIPOLAR THEN
        #K1 := -27648.0;
    ELSE
        #K1 := 0.0;
    END_IF;

    [COLOR="#008000"]// Liegt der Eingabewert nicht in dem Bereich zwischen LO_LIM und HI_LIM, dann wird der Ausgang (OUT) an den nächsten Grenzwert[/COLOR]
    [COLOR="#008000"]// (den oberen oder den unteren) für den angegebenen Bereich des jeweiligen Typs (BIPOLAR oder UNIPOLAR) gebunden und ein Fehler ausgegeben.[/COLOR]
    [COLOR="#008000"]// Der Signalzustand von ENO wird auf "0" und RET_VAL wird auf W#16#0008 gesetzt.[/COLOR]

    #UNSCALE_SCL := 8; [COLOR="#008000"]// Return: Vorbelegung mit Fehlerstatus W#16#0008[/COLOR]

    IF #HI_LIM > #LO_LIM THEN [COLOR="#008000"]// direkt proportional[/COLOR]

        IF #IN < #LO_LIM THEN
            #tmp_OUT := #K1;
        ELSIF #IN > #HI_LIM THEN
            #tmp_OUT := #K2;
        ELSE
            #UNSCALE_SCL := 0; [COLOR="#008000"]// Return: 0 für OK[/COLOR]
        END_IF;

    ELSE [COLOR="#008000"]// umgekehrt proportional[/COLOR]

        IF #IN < #HI_LIM THEN
            #tmp_OUT := #K1;
        ELSIF #IN > #LO_LIM THEN
            #tmp_OUT := #K2;
        ELSE
            #UNSCALE_SCL := 0; [COLOR="#008000"]// Return: 0 für OK[/COLOR]
        END_IF;

    END_IF;

    IF #UNSCALE_SCL = 0 THEN [COLOR="#008000"]// IN ist OK[/COLOR]

        [COLOR="#008000"]// Die Funktion UNSCALE arbeitet mit der folgenden Gleichung:[/COLOR]
        [COLOR="#008000"]// OUT = [ ((IN-LO_LIM)/(HI_LIM-LO_LIM)) * (K2-K1) ] + K1[/COLOR]
        #tmp_OUT := ( ((#IN - #LO_LIM) / (#HI_LIM - #LO_LIM)) * (#K2 - #K1) ) + #K1; [COLOR="#008000"]// Es muß HI_LIM <> LO_LIM sein![/COLOR]

    END_IF;

    #OUT := DINT_TO_INT(TRUNC(#tmp_OUT));

    [COLOR="#008000"]// ENO: 1 kein Fehler / 0 Fehler[/COLOR]
    ENO := #UNSCALE_SCL = 0;

END_FUNCTION
Code:
FUNCTION "SCALE_SCL" : Word
TITLE = 'SCALING VALUES'
{ S7_Optimized_Access := 'TRUE' }

AUTHOR  : PN_DP
FAMILY  : CONVERT
NAME    : SCALE
VERSION : 1.0
[COLOR="#008000"]//Funktion wie Step7 V5.x > TI-S7 Converting Blocks > FC105 SCALE[/COLOR]

   VAR_INPUT
      IN      : Int;    [COLOR="#008000"]// input value to be scaled[/COLOR]
      HI_LIM  : Real;   [COLOR="#008000"]// upper limit in engineering units[/COLOR]
      LO_LIM  : Real;   [COLOR="#008000"]// lower limit in engineering units[/COLOR]
      BIPOLAR : Bool;   [COLOR="#008000"]// 1=bipolar; 0=unipolar[/COLOR]
   END_VAR
   VAR_OUTPUT
      OUT     : Real;   [COLOR="#008000"]// result of the scale conversion[/COLOR]
   END_VAR
   VAR_TEMP
      IN_Real : Real;
      K1      : Real;
   END_VAR
   VAR CONSTANT
      K2      : Real := +27648.0;
   END_VAR

BEGIN

    [COLOR="#008000"]// Die Konstanten K1 und K2 werden unterschiedlich gesetzt, je nachdem, ob der Eingabewert BIPOLAR oder UNIPOLAR ist.[/COLOR]
    [COLOR="#008000"]// BIPOLAR : Es wird angenommen, daß der ganzzahlige Eingabewert zwischen -27648 und 27648 liegt, deshalb sind K1 = -27648,0 und K2 = +27648,0.[/COLOR]
    [COLOR="#008000"]// UNIPOLAR: Es wird angenommen, daß der ganzzahlige Eingabewert zwischen 0 und 27648 liegt, deshalb sind K1 = 0,0 und K2 = +27648,0.[/COLOR]
    IF #BIPOLAR THEN
        #K1 := -27648.0;
    ELSE
        #K1 := 0.0;
    END_IF;

    [COLOR="#008000"]// Ist der ganzzahlige Eingabewert kleiner als K1, dann wird der Ausgang (OUT) an LO_LIM gebunden und ein Fehler ausgegeben.[/COLOR]
    [COLOR="#008000"]// Ist der ganzzahlige Eingabewert größer als K2, dann wird der Ausgang an HI_LIM gebunden und ein Fehler ausgegeben.[/COLOR]
    [COLOR="#008000"]// Der Signalzustand von ENO wird auf "0" und RET_VAL wird auf W#16#0008 gesetzt.[/COLOR]

    #SCALE_SCL := 8; [COLOR="#008000"]// Return: Vorbelegung mit Fehlerstatus W#16#0008[/COLOR]
    #IN_Real := INT_TO_REAL(#IN);

    IF #IN_Real < #K1 THEN
        #OUT := #LO_LIM;
    ELSIF #IN_Real > #K2 THEN
        #OUT := #HI_LIM;
    ELSE
        #SCALE_SCL := 0; [COLOR="#008000"]// Return: 0 für OK[/COLOR]

        [COLOR="#008000"]// Die Funktion SCALE arbeitet mit der folgenden Gleichung:[/COLOR]
        [COLOR="#008000"]// OUT = [ ((FLOAT(IN) - K1)/(K2-K1)) * (HI_LIM-LO_LIM) ] + LO_LIM[/COLOR]
        #OUT := ( ((#IN_Real - #K1) / (#K2 - #K1)) * (#HI_LIM - #LO_LIM) ) + #LO_LIM;

    END_IF;

    [COLOR="#008000"]// ENO: 1 kein Fehler / 0 Fehler[/COLOR]
    ENO := #SCALE_SCL = 0;

END_FUNCTION

Harald
 

Anhänge

Zuviel Werbung?
-> Hier kostenlos registrieren
In Step7 V5.x ist eine sehr detaillierte Baustein-Beschreibung wie der FC106 UNSCALE intern arbeitet. Damit kann man UNSCALE leicht in SCL nachprogrammieren.
Eine solche Beschreibung mit der Formel findet man auch in der TIA-Hilfe unter UNSCALE (ohne die FC Nr.) für die Legacy-Bausteine der S7-1500.
Vorsicht! Die Beschreibung von UNSCALE in der TIA-Hilfe ist fehlerhaft (irgendwie typisch TIA ;))
TIA V15.1 UNSCALE: Deskalieren schrieb:
Am Parameter BIPOLAR können die folgenden Signalzustände anstehen:
  • Signalzustand "1": Es wird angenommen, dass der Wert am Parameter IN bipolar ist und in einem Wertebereich zwischen -27648 und 27648 liegt. In diesem Fall hat die Konstante "K1" den Wert -27648,0 und die Konstante "K2" den Wert +27648,0.
  • Signalzustand "0": Es wird angenommen, dass der Wert am Parameter IN unipolar ist und in einem Wertebereich zwischen 0 und 27648 liegt. In diesem Fall hat die Konstante "K1" den Wert 0,0 und die Konstante "K2" den Wert +27648,0.
Richtig ist, daß der Ausgabewert (OUT) im Bereich von -27648 bis +27648 bzw. 0 bis +27648 liegt. Der Wert am Parameter IN muß im Bereich LO_LIM bis HI_LIM liegen.

Harald
 
Vorsicht! Die Beschreibung von UNSCALE in der TIA-Hilfe ist fehlerhaft (irgendwie typisch TIA ;))

Richtig ist, daß der Ausgabewert (OUT) im Bereich von -27648 bis +27648 bzw. 0 bis +27648 liegt. Der Wert am Parameter IN muß im Bereich LO_LIM bis HI_LIM liegen.
Ja, ist nicht 100% sicher formuliert, aber:

über dem Zitat steht:
Die Werte der Konstanten "K1" und "K2" werden durch den Signalzustand am Parameter BIPOLAR bestimmt.
"und in einem Wertebereich" bezieht sich also auf den durch die beiden Konstanten K1 und K2 im Zusammenhang mit der Formel angegebenen Wertebereich und nicht auf den Parameter IN (also kein logisches UND, sondern ein grammatikalisches zur Satzteilverknüpfung).


Und zur Sicherheit steht daher unter Deinem Zitat auch noch:
Wenn der Wert am Parameter IN nicht innerhalb der von HI_LIM und LO_LIM definierten Grenzen liegt ...


Als Programmierer ist man da sicher vorbelastet, jedes "und" in logischer Weise zu sehen.
:ROFLMAO:
 
Zuletzt bearbeitet:
Also in meiner deutschen Grammatik und Logik ist das nicht nur "nicht 100% sicher formuliert" sondern eindeutig falsch.
Wer weiß was sich der TIA-Hilfe-Autor gedacht hat, daß er diesen Text absichtlich anders formuliert hat als in der original Beschreibung des UNSCALE in Step7 V5.x. An den Deutsch-Kenntnissen wird es nicht gelegen haben, weil in der englischen Version der Hilfe steht die selbe (zumindest verwirrende) Formulierung.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist ja mal eine irre tolle Antwort. Wow! Normalerweise kenn ich das in Foren dass erst der Fragende zerfleischt wird und sich dann die Antwortenden untereinander zerfleischen. Vielen Dank! Hut ab.

Zu meiner absoluten Schande muss ich aber gestehen dass ich jetzt nicht weis wie ich den Code anwenden soll. :oops:

Wenn ich das einfach in ei SCL Netzwerk einfüge bekomme ich nur 1000 Fehlermeldungen
 
Den SCL-Quellcode verwenden:
1) die Datei SCALE_UNSCALE_TIA.scl.txt von Beitrag #7 oder aus der FAQ downloaden
2) die Datei umbenennen zu SCALE_UNSCALE_TIA.scl (das .txt entfernen)
3) im TIA (Test-)Projekt im Projektbaum unter der CPU > Externe Quellen > Neue externe Datei hinzufügen: die Datei SCALE_UNSCALE_TIA.scl
4) auf den nun erschienenen Eintrag Externe Quellen > SCALE_UNSCALE_TIA.scl > Rechtsmausklick > Bausteine aus Quelle generieren: das erzeugt unter "Programmbausteine" 2 FC: SCALE_SCL + UNSCALE_SCL
5) Enjoy! die Bausteine öffnen, übersetzen, verwenden, oder wieder löschen einzeln oder beide FC
6) der Eintrag SCALE_UNSCALE_TIA.scl unter "Externe Quellen" kann danach gelöscht werden
7) hier im Forum unter dem Download-Beitrag auf "Danke" klicken, falls die Bausteine hilfreich sind :D

Harald
 
Zurück
Oben