Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Results 1 to 2 of 2

Thread: S7 Analogwerte - Ich hab da mal ne Frage

  1. #1
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default


    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
                       16mA
    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.

    Quote Originally Posted by FC105-STEP 7-Hilfe
    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ß!
    Last edited by Ralle; 16.03.2009 at 21:45. Reason: kleine Korrektur auf Hinweis von 4L
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]
    Reply With Quote Reply With Quote S7 Analogwerte - Ich hab da mal ne Frage  

  2. Folgende 95 Benutzer sagen Danke zu vierlagig für den nützlichen Beitrag:

    <nemo> (16.04.2008),/*Matthias*/ (17.06.2008),admin77 (08.08.2013),alfonso (16.12.2008),Alleinikoff (15.03.2011),Amson (14.04.2009),and (01.10.2014),Andi1305 (11.04.2012),Andy79 (10.11.2009),arboettc (10.11.2009),Bambi_DEG (04.05.2011),bastler (31.07.2013),Bib0r (22.03.2013),Buschmann (06.06.2012),Bösertom (30.05.2011),ChrisH. (13.02.2012),christian_1982 (24.04.2008),Chromzone (23.11.2016),colorador (22.01.2016),cth (21.04.2008),DeltaMikeAir (24.04.2018),DennisBerger (24.01.2014),DerPraktikant (04.12.2008),Detto (23.08.2011),diabolo150973 (17.09.2011),El Cattivo (03.03.2011),erick_wick (07.03.2011),ETim (20.08.2009),evolem (10.01.2014),Feng (09.06.2011),friendo (01.09.2016),funkenschlosser (29.03.2014),Ganz (19.04.2008),Geminon (15.07.2016),Gerhard Bäurle (23.01.2011),Guste (08.03.2009),homei (30.04.2008),Hondamenn (25.03.2016),Icebaer (29.11.2010),Ide (16.04.2008),jokey (06.09.2008),Kalle Kasten (21.09.2017),Karin (11.01.2019),Karli (27.11.2008),Kieler (27.04.2008),kirk42 (29.11.2008),Koch (31.07.2013),Leitmayr (16.09.2011),mac_hawk (12.04.2009),Manfred Stangl (07.08.2008),manfredo (28.03.2009),MArenz (09.03.2015),mariob (27.09.2014),michael290474 (08.01.2010),mima.sps (13.05.2011),Münchnerjunge (03.02.2015),Peter Schneider (16.04.2010),Pidi (26.08.2008),plc_typ (04.04.2010),Prox (19.06.2008),Reibekuchen (04.08.2014),rnovak (25.05.2008),roadrunner (01.10.2012),Robin (22.09.2008),Roje (04.07.2008),schoofsknaller (28.05.2015),SIGGI (06.10.2008),snowkopp (19.09.2009),SPS_S5_S7 (18.09.2009),stan_keiler (24.03.2010),superbug (16.03.2009),svenhuber (17.10.2014),Syntaxfehler (17.04.2008),T-Rex22 (02.12.2011),TeaKay (20.01.2010),TheQuest (18.11.2016),ThomasM (28.09.2016),TommyG (15.09.2008),tox (16.07.2010),tuneit (30.11.2008),veritas (25.08.2009),WendeMarkus (11.01.2013),xvitali (18.06.2010),yaliiin (22.05.2015),yngola (19.10.2010),zephyr550 (30.10.2012),ziege8 (01.04.2009),zloyduh (25.10.2009)

  3. #2
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    16,174
    Danke
    1,337
    Erhielt 4,764 Danke für 3,850 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    //Funktion wie Step7 V5.x > TI-S7 Converting Blocks > FC105 SCALE
    
       VAR_INPUT
          IN      : Int;    // input value to be scaled
          HI_LIM  : Real;   // upper limit in engineering units
          LO_LIM  : Real;   // lower limit in engineering units
          BIPOLAR : Bool;   // 1=bipolar; 0=unipolar
       END_VAR
       VAR_OUTPUT
          OUT     : Real;   // result of the scale conversion
       END_VAR
       VAR_TEMP
          IN_Real : Real;
          K1      : Real;
       END_VAR
       VAR CONSTANT
          K2      : Real := +27648.0;
       END_VAR
    
    BEGIN
    
        // 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.
        IF #BIPOLAR THEN
            #K1 := -27648.0;
        ELSE
            #K1 := 0.0;
        END_IF;
    
        // Ist der ganzzahlige Eingabewert kleiner als K1, dann wird der Ausgang (OUT) an LO_LIM gebunden und ein Fehler ausgegeben.
        // Ist der ganzzahlige Eingabewert größer als K2, dann wird der Ausgang an HI_LIM gebunden und ein Fehler ausgegeben.
        // Der Signalzustand von ENO wird auf "0" und RET_VAL wird auf W#16#0008 gesetzt.
    
        #SCALE_SCL := 8; // Return: Vorbelegung mit Fehlerstatus W#16#0008
        #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; // Return: 0 für OK
    
            // Die Funktion SCALE arbeitet mit der folgenden Gleichung:
            // OUT = [ ((FLOAT(IN) - K1)/(K2-K1)) * (HI_LIM-LO_LIM) ] + LO_LIM
            #OUT := ( ((#IN_Real - #K1) / (#K2 - #K1)) * (#HI_LIM - #LO_LIM) ) + #LO_LIM;
    
        END_IF;
    
        // ENO: 1 kein Fehler / 0 Fehler
        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
    //Funktion wie Step7 V5.x > TI-S7 Converting Blocks > FC106 UNSCALE
    
       VAR_INPUT
          IN      : Real;   // input value to be unscaled
          HI_LIM  : Real;   // upper limit in engineering units
          LO_LIM  : Real;   // lower limit in engineering units
          BIPOLAR : Bool;   // 1=bipolar; 0=unipolar
       END_VAR
       VAR_OUTPUT
          OUT     : Int;   // result of the unscale conversion
       END_VAR
       VAR_TEMP
          tmp_OUT : Real;
          K1      : Real;
       END_VAR
       VAR CONSTANT
          K2      : Real := +27648.0;
       END_VAR
    
    BEGIN
    
        // Die Konstanten K1 und K2 werden unterschiedlich gesetzt, je nachdem, ob der Eingabewert BIPOLAR oder UNIPOLAR ist.
        // BIPOLAR : Es wird angenommen, daß der ganzzahlige Ausgabewert zwischen -27648 und 27648 liegt, deshalb sind K1 = -27648,0 und K2 = +27648,0.
        // UNIPOLAR: Es wird angenommen, daß der ganzzahlige Ausgabewert zwischen 0 und 27648 liegt, deshalb sind K1 = 0,0 und K2 = +27648,0.
        IF #BIPOLAR THEN
            #K1 := -27648.0;
        ELSE
            #K1 := 0.0;
        END_IF;
    
        // Liegt der Eingabewert nicht in dem Bereich zwischen LO_LIM und HI_LIM, dann wird der Ausgang (OUT) an den nächsten Grenzwert
        // (den oberen oder den unteren) für den angegebenen Bereich des jeweiligen Typs (BIPOLAR oder UNIPOLAR) gebunden und ein Fehler ausgegeben.
        // Der Signalzustand von ENO wird auf "0" und RET_VAL wird auf W#16#0008 gesetzt.
    
        #UNSCALE_SCL := 8; // Return: Vorbelegung mit Fehlerstatus W#16#0008
    
        IF #HI_LIM > #LO_LIM THEN // direkt proportional
    
            IF #IN < #LO_LIM THEN
                #tmp_OUT := #K1;
            ELSIF #IN > #HI_LIM THEN
                #tmp_OUT := #K2;
            ELSE
                #UNSCALE_SCL := 0; // Return: 0 für OK
            END_IF;
    
        ELSE // umgekehrt proportional
    
            IF #IN < #HI_LIM THEN
                #tmp_OUT := #K1;
            ELSIF #IN > #LO_LIM THEN
                #tmp_OUT := #K2;
            ELSE
                #UNSCALE_SCL := 0; // Return: 0 für OK
            END_IF;
    
        END_IF;
    
        IF #UNSCALE_SCL = 0 THEN // IN ist OK
    
            // Die Funktion UNSCALE arbeitet mit der folgenden Gleichung:
            // OUT = [ ((IN-LO_LIM)/(HI_LIM-LO_LIM)) * (K2-K1) ] + K1
            #tmp_OUT := ( ((#IN - #LO_LIM) / (#HI_LIM - #LO_LIM)) * (#K2 - #K1) ) + #K1; // Es muß HI_LIM <> LO_LIM sein!
    
        END_IF;
    
        #OUT := DINT_TO_INT(TRUNC(#tmp_OUT));
    
        // ENO: 1 kein Fehler / 0 Fehler
        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)
    Attached Files Attached Files
    Last edited by PN/DP; 13.01.2021 at 13:06. Reason: Nachtrag: SCL-Quellcode verwenden
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.
    'Funktioniert nicht' ist keine Fehlerbeschreibung

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Reply With Quote Reply With Quote SCALE UNSCALE SCL für TIA, z.B. S7-1200  

  4. Folgende 6 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    Heinileini (13.01.2021),hucki (13.01.2021),nobi (13.01.2021),Ph3niX (13.01.2021),rostiger Nagel (13.01.2021),UDP (13.01.2021)

Similar Threads

  1. TIA Ich habe mal wieder eine SCL Frage (For..To)
    By Magni in forum Simatic
    Replies: 5
    Last Post: 11.07.2018, 16:21
  2. Replies: 43
    Last Post: 16.11.2012, 11:27
  3. Ich hab vom großen S die schnauze voll
    By stift in forum Stammtisch
    Replies: 38
    Last Post: 07.02.2010, 20:05
  4. Hab auch mal eine dumme Frage..
    By Hightowerxxx in forum Simatic
    Replies: 4
    Last Post: 19.09.2005, 10:58

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •