S7 Analogwerte - Ich hab da mal ne Frage

vierlagig

Level-1
Beiträge
9.882
Reaktionspunkte
2.021
Zuviel Werbung?
-> Hier kostenlos registrieren
S7 Analogwerte - Ich hab da mal ne Frage

Grundlagen

Analogwertverarbeitung nutzt man, wenn nicht nur die Zustände AN und AUS betrachtet werden sollen, sondern einen Bereich z.B. eines Temperatur- oder Füllstandssignals oder zur Sollwertvorgabe.
Typische Analogsignale sind 0..20mA, 4..20mA, 0..10V und der normierte Widerstandswert eines Pt100. Dabei stellen die Werte dieser Signale nur ein Abbild der tatsächlichen physikalischen Größe dar.

Bsp.: Füllstand 0...100% mit 4..20mA

Code:
   0%              75%      100%
   |<---- 12mA ---->|         |
   |                |         |
   |<--------- 16mA --------->|
   |                |         |
   4mA              |        20mA
                   [B]16mA[/B]
Der Messbereich umfasst 16mA daraus resultiert, dass 0,16mA einem Prozent entsprechen.
für 75% Füllstand errechnet sich demnach 0,16mA/% * 75% = 12mA im Messbereich, dass heißt an der Analogeingang wird ein Wert von 16mA (12mA + Offset 4mA) gemessen und diese 16mA entsprechen einem Füllstand von 75%. 60% Füllstand liefern demnach 13,6mA
Da Werte kleiner 4mA im normalen Betrieb nicht vorkommen dürfen, können diese als Drahtbruchüberwachung genutzt werden.

Aber wie bekomm ich diese Werte nun in mein Programm?

Einlesen

Im Falle einer korrekt aufgebauten Hardware und konsistenten Systemdaten ist das alles ganz einfach.

Was automatisch passiert?

Um Analogsignale in einer SPS verarbeiten zu können müssen diese digitalisiert werden. Das übernimmt die Baugruppe mit unterschiedlichen Auflösungen. Typische Auflösungen sind 8, 12 und 15 Bit, jeweils zuzüglich Vorzeichen. Je größer die Auflösung desto genauer die Signalauswertung.

Bsp.: 8 Bit

mit 8 Bit können 256 Bereiche abgebildet werden
bei 0..10V bedeutet das 10V : 256 = 0,039 V/Bit
daraus folgt: Es werden Spannungsunterschiede > 39mV erkannt

Neben der Auflösung sind auch Wandlungs- und Zykluszeit von Interesse bei der Einsatzplanung von Analogbaugruppen.

Die Wandlungszeit für einen Kanal setzt sich zusammen aus der Grundwandlungszeit und zusätzlichen Bearbeitungszeiten der Baugruppe für:
- Widerstandsmessung
- Drahtbruchüberwachung.
Die Grundwandlungszeit hängt direkt ab vom Wandlungsverfahren (integrierendes Verfahren, sukzessive Approximation) des Analogeingangs. Bei integrierenden Wandlungsverfahren geht die Integrationszeit direkt mit in die Wandlungszeit ein.

Die Zykluszeit für die Analogbaugruppe setzt sich aus den Wandlungszeiten der Kanälen zusammen, da diese sequentiell den digitalisierten Wert übergeben.

Bei Analogausgaben gilt es zusätzlich zu Wandlungszeiten und Zykluszeit, die Einschwing- und Antwortzeit zu beachten.

Als Einschwingzeit wird die Zeit vom Anliegen des gewandelten Wertes
bis zum Erreichen des spezifizierten Wertes am Analogausgang bezeichnet. Sie ist lastabhängig. Dabei muß zwischen ohmscher, kapazitiver und induktiver Last unterschieden werden

Die Antwortzeit, d. h. die Zeit vom Anliegen der digitalen Ausgabewerte im internen Speicher bis zum Erreichen des spezifizierten Wertes am Analogausgang ist im ungünstigsten Fall die Summe aus Zykluszeit und Einschwingzeit. Der ungünstigste Fall liegt dann vor, wenn kurz vor Übertragung eines neuen Ausgabewertes der Analogkanal gewandelt wurde und erst nach Wandlung der anderen Kanäle wieder gewandelt wird (Zykluszeit).

Die entsprechenden Werte können den Baugruppendaten entnommen werden.

Was muß ich jetzt eigentlich noch machen?

Die Adresse des Kanals herausfinden. Dazu in der Hardwarekonfiguration den Eingangs-Bereich der Eingangskarte betrachten und entsprechend interpretieren. Analogsignale werden WORD-weise Adressiert.

z.B. eine 8-Kanal-Analogeingangskarte

der E-Bereich ist mit 6...21 angegeben.

bedeutet:

Kanal 1 ---> EW 6
Kanal 2 ---> EW 8
Kanal 3 ---> EW 10
...
Kanal 8 ---> EW 20

Mit dieser Adresse kann man dann, den digitalisierten Wert des Analogwertes im Programm aufrufen:

Code:
      L     EW 10
Aber es gibt doch auch noch PEW

Der Unterschied zwischen EW und PEW liegt in der Zuordnung und damit auch der Aktualität des Wertes.

EW bezeichnet einen Eingangswert der im Prozessabbild der CPU liegt (typisch bis EB 255, bei größeren SPS aber auch einstellbar) und am Ende des Zykluses in das Prozessabbild geladen werden.

PEW bezeichnet einen Eingangwert der beim Aufruf gelesen wird. Liegt das EW außerhalb des Prozessabbildes muss mit PEW gearbeitet werden, in den anderen Fällen kann mit PEW gearbeitet werden. Bei der Verwendung von PEW kann dieses innerhalb eines Zykluses an unterschiedlichen Aufrufstellen unterschiedliche Werte haben.

Verarbeiten

Lädt man den digitalisierten Wert eines Analogeinganges erschließt sich daraus noch nicht für jeden der Wert des Messwertgebers. Da könnte zum Beispiel sowas stehen wie: 16#1719

Um mit einem Analogwert sinnvoll arbeiten zu können bietet es sich an, ihn zu skalieren und im Format REAL weiter zu verarbeiten.
Dafür gibt es den Siemens-Standard-Baustein FC 105 SCALE. Dieser funktioniert auf Grund des Siemens-typischen Skalierungsfaktors K nur mit Siemens-Baugruppen. Für andere Hersteller kann man sich aber mit Hilfe der Berechnungsvorschrift des FC105 sehr schnell eigene Skalierungsumgebungen schaffen.

FC105-STEP 7-Hilfe schrieb:
OUT = [ ((FLOAT (IN) - K1)/(K2-K1)) * (HI_LIM-LO_LIM)] + LO_LIM

Die Konstanten K1 und K2 werden unterschiedlich gesetzt, je nachdem, ob der Eingabewert BIPOLAR oder UNIPOLAR ist.
· BIPOLAR: Es wird angenommen, daß der ganzzahlige Eingabewert zwischen -27648 und 27648 liegt, deshalb sind K1 = -27648,0 und K2 = +27648,0.
· UNIPOLAR: Es wird angenommen, daß der ganzzahlige Eingabewert zwischen 0 und 27648 liegt, deshalb sind K1 = 0,0 und K2 = +27648,0
Ein Aufruf des FC 105 könnte so aussehen:

Code:
      CALL  "SCALE"
       IN     :=PEW10                   //Eingangswort
       HI_LIM :=1.000000e+002           //Skalierungsobergrenze
       LO_LIM :=0.000000e+000           //Skalierungsuntergrenze
       BIPOLAR:="LOG0"                  //bi- oder unipolar - hier unipolar
       RET_VAL:=MW8                     //Fehlerinformation
       OUT    :=MD10                    //Skalierter Messwert in REAL
Der FC 105 macht eigentlich nichts anderes als:

Code:
      L     #in 
      ITD    
      DTR    
      T     #in_real 
      L     #hi_lim 
      L     #lo_lim 
      -R     
      L     #in_real 
      *R     
      L     2.764800e+004       //Skalierungsfaktor
      /R     
      L     #lo_lim 
      +R     
      T     #out
Der Skalierungsfaktor ergibt sich aus der Spezifikation der A/D-Wandlung. Nachzulesen in den Baugruppendaten.
Mit dem skalierten und konvertierten Real-Wert kann man dann wie gewohnt weiterarbeiten.

Die Angaben oben beziehen sich auf Strom- und Spannungssignale. Das Einlesen und skalieren des Widerstandswertes eines Pt100 ist wesentlich einfacher:

Code:
      L     PEW 10
      ITD    
      DTR
      L     1.000000e+001
      /R
      T     MD 10
Schreiben

Neben dem Erfassen von Messwerten dienen Analogsignale auch der Vorgabe von Sollwerten.
Code:
      T     PAW 10
Die Analogausgangskarten wandeln einen digitalen Wert in ein analoges Spannungs- oder Stromsignal (0..10V; 4..20mA)
Im wesentlichen gelten die selben Grundlagen wie für Analogeingänge.
Skalierung und Konvertierung eines REAL-Wertes in ein Analogkompatibles WORT übernimmt hier für Siemens-Baugruppen der FC106 UNSCALE mit der Berechnungsvorschrift

OUT = [ ((IN - LO_LIM)/(HI_LIM - LO_LIM)) * (K2 - K1) ] + K1

oder eben

Code:
      L     #hi_lim 
      L     #lo_lim 
      -R 
      T     #delta
      L     #wert               //der auszugebende Wert
      L     #lo_lim
      -R        
      L     #delta 
      /R     
      L     2.764800e+004       //Skalierungsfaktor
      *R     
      RND 
      T     #out
____________________________________________________________________________________________________

Dank an Ralle für Korrektur und Hinweise!
Viel Spaß!
 
Zuletzt bearbeitet von einem Moderator:
SCALE UNSCALE SCL für TIA, z.B. S7-1200

Wer SCALE und UNSCALE mit der selben Funktionalität wie in Step7 V5.x für TIA braucht (z.B. für S7-1200), hier 2 Bausteine in SCL:
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
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

Den SCL-Quellcode verwenden:
1) die Datei SCALE_UNSCALE_TIA.scl.txt 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

Alternativ zu 1..2 kann auch der Quelltext der einzelnen FUNCTIONs hier aus dem CODE-Block in eine Standard-Textdatei kopiert werden und unter irgendeinName.scl gespeichert werden. (z.B. mit Notepad)
 

Anhänge

  • SCALE_UNSCALE_TIA.scl.txt
    4,7 KB · Aufrufe: 254
Zuletzt bearbeitet:
Zurück
Oben