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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: Analogwerte einlesen

  1. #11
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.786
    Danke
    398
    Erhielt 2.414 Danke für 2.010 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ... oder -25 bis 100 wenn es nur um positive Werte geht ...

    Gruß
    Larry

  2. #12
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.636
    Danke
    786
    Erhielt 654 Danke für 497 Beiträge

    Standard

    Ich hab da mal n kleinen Baustein geschrieben. Lässt sich sicher optimieren. Funktioniert aber.

    ich hab den eben mal geschrieben um wirklich Unter- und Obergrenze sowohl von Eingangswert anzugeben.
    Ist natürlich jetzt ne fertige Lösung aber, kannst ihn ja auf deine Bedürfnisse anpassen und ggf auch verkleinern.

    Code:
    FUNCTION ANA_E_EINL_SKAL : VOID
    TITLE = 'scaling Peripherical Input words'
    // Input will be converted directly from PEW to AUSG_REAL and AUSG_INT
    // the Linearity is calculatet from UGR_IN to UGR_Out and OGR_IN to OGR_OUT
    
    AUTHOR : VoR
    FAMILY : Peripher
    NAME : Obj_scal
    VERSION : '1.6'
    
    VAR_INPUT
            EING : WORD ; // Input (format word) direkt PEW
          UGR_IN : INT ;  // Lower Limit Input
          OGR_IN : INT ;  // Upper Limit Input
         UGR_OUT : REAL ; // Lower Output = Lower Input
         OGR_OUT : REAL ; // Upper Output = Upper Input
      INT_FACTOR : REAL ; // Faktor for the Integer Input (Normaly 10.0) means 13.7 REAL out is 137 for INT
         OBJ_RoI : BOOL ; // Manualoverride for Int (FALSE) or Real (TRUE) Output?
          OBJ_AH : BOOL ; // Manualoverride aktiv inaktiv 
    END_VAR
    VAR_OUTPUT
             FEH : BOOL ; // Codefailure
              BU : BOOL ; // Limit excceeded
    END_VAR
    
    VAR_IN_OUT
       AUSG_REAL : REAL ;  // Output scaled (Format REAL)
        AUSG_INT : INT ;   // Output scaled (Format INT)
    END_VAR
    
    VAR_TEMP
       OGR_IN_MAX : BOOL ; // Input >= Upper limit input
       UGR_IN_MAX : BOOL ; // Input <= Upper limit input
      OGR_IN_REAL : REAL ; // Upper limit input in format REAL
      UGR_IN_REAL : REAL ; // Lower limit input in format REAL
        EING_REAL : REAL ; // Input im format REAL
          LIMIT_R : REAL ; // limited input (for calculation)
         LIM_X_UG : REAL;  // temporary VAR for limiter
         LIM_X_OG : REAL;  // Dito
    END_VAR
    
    
    BEGIN
    
        EING_REAL:=INT_TO_REAL(WORD_TO_INT(EING)); // peripheral input from WORD in REAL 
        OGR_IN_REAL:=INT_TO_REAL(OGR_IN); 
        UGR_IN_REAL:=INT_TO_REAL(UGR_IN); 
           
    IF (UGR_IN_REAL >= OGR_IN_REAL) THEN
        FEH := TRUE;
    ELSE
        FEH := FALSE;
    END_IF;
    
    
    // proof if limit exceeded
    IF EING_REAL >= (OGR_IN_REAL + 10.0) THEN
       OGR_IN_MAX := TRUE;
    ELSE
       OGR_IN_MAX := FALSE;
    END_IF;
       
    IF EING_REAL < (UGR_IN_REAL - 10.0) THEN
       UGR_IN_MAX := TRUE;
    ELSE
       UGR_IN_MAX := FALSE;
    END_IF;
    
    IF UGR_IN_MAX OR OGR_IN_MAX THEN
        BU := TRUE; // limit exceeded input
    ELSE
        BU := FALSE;
    END_IF;
      
    (*sorting limits for calculation*)  
      IF UGR_IN_REAL < OGR_IN_REAL THEN
         LIM_X_UG:= UGR_IN_REAL;
         LIM_X_OG:= OGR_IN_REAL;
         
      ELSIF OGR_IN_REAL <= UGR_IN_REAL THEN 
         LIM_X_UG:= OGR_IN_REAL;
         LIM_X_OG:= UGR_IN_REAL;
         
      END_IF;   
    
    (*input should be limited*)
    LIMIT_R:=LIMIT(Mn:=LIM_X_UG, IN:=EING_REAL, Mx:=LIM_X_OG); 
    
    (*calculating limited data*)
    IF NOT OBJ_RoI AND NOT OBJ_AH THEN
       AUSG_REAL := ((OGR_OUT-UGR_OUT) / (OGR_IN_REAL - UGR_IN_REAL)
                    * LIMIT_R
                   + (OGR_OUT - (OGR_OUT - UGR_OUT)
                   / (OGR_IN_REAL  -UGR_IN_REAL) * OGR_IN_REAL));
        AUSG_INT := REAL_TO_INT(INT_FACTOR * AUSG_REAL);
        
    ELSIF NOT OBJ_RoI AND OBJ_AH THEN
       AUSG_REAL := (INT_TO_REAL(AUSG_INT) / INT_FACTOR); 
       
    ELSE
        AUSG_INT := REAL_TO_INT(INT_FACTOR * AUSG_REAL);  
            
    END_IF;
          
    END_FUNCTION

  3. #13
    Registriert seit
    15.04.2011
    Beiträge
    1.122
    Danke
    229
    Erhielt 208 Danke für 176 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    ... oder -25 bis 100 wenn es nur um positive Werte geht ...

    Gruß
    Larry
    Ist korrekt, aber TE hat im seinem 1. Beitrag geschrieben: Der AI geht aber von -10V bis +10V.
    Gruß
    190B

  4. #14
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.786
    Danke
    398
    Erhielt 2.414 Danke für 2.010 Beiträge

    Standard

    ... hast Recht ... das hatte ich anders gelesen ...

  5. #15
    Registriert seit
    09.02.2012
    Beiträge
    302
    Danke
    16
    Erhielt 17 Danke für 17 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    @Crack:
    dann hast du aber nicht mehr 100% bei 10 V (sondern nur noch ca. 80 %).

    @TE:
    Du mußt dann natürlich den Scale von -xyz% bis 100% gehen lassen - ich habe gerade nicht die Muse den korrekten Wert zu errechnen - das läßt sich aber über die Steigung machen ...

    Gruß
    Larry
    Hallo!

    Ja Sorry, hab mich verlesen dachte geht von 2V 0% bis 8V 100%


    lg

  6. #16
    Registriert seit
    03.12.2009
    Beiträge
    64
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Hallo,

    versuche es mal so:

    L PEW xxxx
    L Dein_Offset // also die 20 % oder so
    L 1000 // Max des Messwertes entspricht 100,0 %
    *D // multipliziere Doppelword
    L (27648 - Dein_Offset) //
    / D // dividiere Doppelword
    T MW 10

    Nun steht in dem M10 10 ein Wert von 0..100% der normiert ist auf einen Eingang von 2--10 Volt.

    Dein_Offset muss Du natürchlich durch den Wert für die 2 Volt ersetzen.
    Hab's nicht probiert wird aber so gehen, bedenke die berechnungen müssen vom Typ D sein.
    Ist kurz schnell und kommt ohne blöde Realverarbeitung aus, die nur Augenwischerei ist.

    Gruss

    Oliver

  7. #17
    Registriert seit
    03.12.2009
    Beiträge
    64
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard

    L PEW xxxx
    L Dein_Offset // also die 20 % oder so

    -D // diese Zeile hatte ich natürlich vergessen, sorry my fault

    L 1000 // Max des Messwertes entspricht 100,0 %
    *D // multipliziere Doppelword
    L (27648 - Dein_Offset) //
    / D // dividiere Doppelword
    T MW 10

    Gruss

    Oliver

  8. #18
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich bin immer noch der Meinung, das mein Code genau das macht was er soll.

    Analogwerte einlesen
    mfG Aventinus

Ähnliche Themen

  1. Analogwerte einlesen und vergleichen
    Von Elektrikus im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 04.11.2012, 15:37
  2. Analogwerte über USB einlesen und an S7 übertragen
    Von sailor im Forum Hochsprachen - OPC
    Antworten: 3
    Letzter Beitrag: 31.10.2012, 18:04
  3. S5 CPU945 Analogwerte einlesen
    Von hoelle1985 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 15.05.2012, 12:36
  4. Analogwerte mit 8MC11 einlesen und vergleichen
    Von Chry007 im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 22.10.2010, 14:13
  5. Analogwerte mit einer 313C einlesen
    Von Atlas im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 08.08.2009, 18:43

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •