Step 7 Analogwerte einlesen

Placebo

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe hier einiges über Analogwertskalierung gelesen, leider war für mein Problem bisher nichts passendes dabei (oder ich habs nicht gefunden).

Ich habe einen Klappenantrieb, bei dem das Rückmeldesignal, wo die Klappe grad steht, im Bereich von 2 bis 10V liegt.
Nun möchte ich dieses Signal auf 0% (=2V) bis 100%(=10V) skalieren. Der AI geht aber von -10V bis +10V.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist eine S7-315-2DP

naja, wenn ich die FC105 nehme und als Grenzen 0 (untere) bis 100 (obere) eintrage, habe ich, wenn ich den PEW auf 2V=5529Int simuliere schon 10%. (hier sollte er aber bei bei 0% stehen)
wenn ich als Grenzen 2 (untere) bis 10 (obere) eintrage, hat mein fc105 ausgang bei 0int 2(V), er sollte aber ja erst bei 5529int anfangen.
 
Zuletzt bearbeitet:
@Placebo:
das habe ich jetzt komplett nicht verstanden ...
Was hast du an welchen IN's des FC eingetragen und was hat das dann bewirkt bzw. was möchtest du, dass es bewirkt ?
Welcher Wert (skaliert) soll bei welchem Spannungseingang kommen ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok also, mein analoger Eingang ist auf +-10V eingestellt.
-10V =-27648integer (int) 0V=0int und +10V= +27648INT

Mein Klappenantrieb liefert aber eine Rückmeldung im Bereich von +2V bis +10V
2V müssten dann doch 5529INT entsprechen oder?!

Die Rückmeldung möchte ich so skalieren, dass +2V = 0% entsprechen(Klappe zu) und +10V = 100% entsprechen(Klappe auf)


Wenn ich jetzt die fc105 von 0 bis 100 (%) skaliere, hab ich bei 2V(bzw.5529INT) am PEW schon 20% an meinem OUT der FC105.
 
hm was ist wenn du einfach bei deinem Minimumwert deine 5529 Subtrahierst ( damit du auf Null bist ) und dann mit dem FC105 Skalierst ?

Als Test 0 Low High 125
 
@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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,

Hier mal ein Codeschnipsel mit dem das Skalieren funktionieren müsste. Der FC105 geht immer von 0 Volt als Untergrenze aus, bzw von -10V bei bipolarer Betriebsart.

Code:
      L     27648
      L     5529
      -I    
      ITD   
      DTR   
      L     1.000000e+002
      TAK   
      /R    
      L     "Eingangswort"
      +     -5529
      ITD   
      DTR   
      *R    
      T     "Skalierter Wert" // als Real
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@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% :D


lg
 
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
 
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
 
Zurück
Oben