Stützpunkt Kurve

paula23

Level-2
Beiträge
235
Reaktionspunkte
15
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

interesant das man hier und auch bei goolge so wenig findet darüber,
eigentlich dachte ich da gibts einen FB bei Siemens und fertig, beim Wettbewerb gibts das. Ich habe mir mal eine Kurve im Excel gebaut,

Ich habe eine Fördermenge und einen FU, bei einer bestimmten Menge muss ein bestimmter Sollwert zum FU, leider nicht Liniear. Somit brauche ich ca. 20 Stützpunkte.

Gibt es da keinen FB für ?

Danke.
 
Hallo,

Den kannst dir doch selber bauen.

Deinen Sollwert in Abhängigkeit der Fördermenge zum FU übertragen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das wollte ich mir sparen!!!

Heist ich müsste mir die richtigen Paare ermitteln und daraus einen Mittelwert bilden !?

Bei PCS7 gabs das kann ich mich erinnern, aber den FB weis ich nicht mehr.
 
Wird die Fördermenge über ein Bediengerät vorgegeben?

Eingabe z.B. 10 m³ = Sollwert 38Hz
Eingabe z.B. 15 m³ = Sollwert 46Hz
.
.
.
Eingabe z.B. 5 m³ = Sollwert 29Hz

Oder

den Skalierungsfaktor deines Sollwerts anpassen. Eingabe x Faktor = Soll.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
pseudocode:

IF eingabe < 5.0 THEN
MinScale = 0.0, MaxScale = 29.0
END_IF

IF eingabe >= 5.0 AND < eingabe 10.0 THEN
MinScale = 29.0, MaxScale = 38.0
END_IF

IF eingabe >= 10.0 AND < eingabe 15.0 THEN
MinScale = 38.0, MaxScale = 46.0
END_IF

usw.

FU_val = ScaleFunction(InVal=eingabe, MinVal = MinScale, MaxVal=MaxScale)

Kannst du in AWL, LAD, FUP, oder SCL ziemlich einfach erledigen.
 
oder die kurve in nem DB ablegen und dann den entsprechenden wert suchen ...
wenn das ganze wirklich mathematisch (mit überschaubaren aufwand) nicht abbildbar ist...
 
Ja, das wurde ja gehen.
Aber schöner als fixe Rechenwerte wäre ein Skalierfunktion mit variablen Skalier-Werten.
Dann kan man sogar die Stützpunkte auf ein HMI einstellen.

Wenn du keine solche Skalierfunktion hast, dann kann ich eine finden.
 
Schon gefunden:

Code:
FUNCTION "SCALE_ANALOG_SIMPLE" : VOID
TITLE =Scaling of values InPMin..InPMax / SclMin..SclMaxOutput INT
AUTHOR : JMP
FAMILY : STD
VERSION : 0.1

VAR_INPUT
  iInput : INT ; //Raw input value.
  iInpMIN : INT ; //Input minimum definition point.
  iInpMAX : INT ; //Input minimum definition point.
  iSclMIN : INT ; //Scaled minimum definition point.
  iSclMAX : INT ; //Scaled maximum definition point.
END_VAR
VAR_OUTPUT
  iOutput : INT ; //Scaled Output
END_VAR
VAR_TEMP
  Dummy : BOOL ; 
  rInput : REAL ; 
  rInpMIN : REAL ; 
  rInpMAX : REAL ; 
  rSclMIN : REAL ; 
  rSclMAX : REAL ; 
  rRate : REAL ; //Rate of conversion
  rOffset : REAL ; //Offset of conversion.
  rDiffInp : REAL ; 
  rDiffScl : REAL ; 
END_VAR
BEGIN
NETWORK
TITLE =Convert input values from INT to REAL
      L     #iInput; 
      ITD   ; 
      DTR   ; 
      T     #rInput; 
      L     #iInpMIN; 
      ITD   ; 
      DTR   ; 
      T     #rInpMIN; 
      L     #iInpMAX; 
      ITD   ; 
      DTR   ; 
      T     #rInpMAX; 
      L     #iSclMIN; 
      ITD   ; 
      DTR   ; 
      T     #rSclMIN; 
      L     #iSclMAX; 
      ITD   ; 
      DTR   ; 
      T     #rSclMAX; 
NETWORK
TITLE =Calculate the Differences for conversion
      L     #rSclMAX; 
      L     #rSclMIN; 
      -R    ; 
      T     #rDiffScl; 
      L     #rInpMAX; 
      L     #rInpMIN; 
      -R    ; 
      T     #rDiffInp; 
NETWORK
TITLE =Trap error: Input values are same.
      L     #rDiffInp; 
      L     0; 
      ==R   ; 
      BEC   ; 
NETWORK
TITLE =Calculate the RATE for conversion

      L     #rDiffScl; 
      L     #rDiffInp; 
      /R    ; 
      T     #rRate; 
NETWORK
TITLE =Calculate the OFFSET for conversion
      L     #rInpMIN; 
      L     #rRate; 
      *R    ; 
      L     #rSclMIN; 
      TAK   ; 
      -R    ; 
      T     #rOffset; 
NETWORK
TITLE =Calculate scaled value (INT)
      L     #rInput; 
      L     #rRate; 
      *R    ; 
      L     #rOffset; 
      +R    ; 
      RND   ; 
      T     #iOutput; 
END_FUNCTION

Ist halt für INTs, aber um für REALs kann man es sehr einfach modifizieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ich würde auch nur hergehen und einen FB anlegen mit ca. 20 ScaleMin und 20 ScaleMax Werten, eine Auswahl treffen wie du beschrieben hast und die Formel hinterlegen.

Servus.
 
(gelöscht - hatte dein Eintrag falsch verstanden)

Mit festen Werten kannst du die Stützpunkte nicht auf ein HMI einstellen.
Ich kann mir schon vorstellen das es wäre ein Vorteil wenn es handelt um ein FU zu steuern.
 
Zuletzt bearbeitet:
Du kannst auch mal die Datentabelle in Excel eingeben, als Diagramm anzeigen und die Formel für eine Trendlinie ermitteln lassen. Die Formel kommt oft genau genug hin.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit festen Werten kannst du die Stützpunkte nicht auf ein HMI einstellen.
Ich kann mir schon vorstellen das es wäre ein Vorteil wenn es handelt um ein FU zu steuern.


Verstehe ich jetzt nicht, wenn ich 20 Werte nehme, z.b. in 5er schritten von 0..100% ? Ok, ich kann ja nicht scalemix und scalemax anzeigen.

aber da verstehe ich nicht was dein baustein da macht.
 
Oder suche mal nach LINEAR_INT aus der oscat, der kann 20 Wertepaare (ist allerdings ein fetter Baustein von knapp 2kB, weil in SCL geschrieben).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der BIB Technology gibt es den FB436 damit kann man Kurveninterpolation mit Stützpunkten errechnen lassen. Weiß jetzt nicht ob es bei dir funktionieren würde, aber die Werte werden aus einem DB gelesen und in einem DB abgelegt. Mit X und Y Position. Könnte man doch evtl um funktionieren
 
Verstehe ich jetzt nicht, wenn ich 20 Werte nehme, z.b. in 5er schritten von 0..100% ? Ok, ich kann ja nicht scalemix und scalemax anzeigen.

aber da verstehe ich nicht was dein baustein da macht.
Der Baustein skaliert zwischen zwei Stützpunkte.
Vielleicht erklärt diesen Bild es besser:
 

Anhänge

  • Stützpunkte.GIF
    Stützpunkte.GIF
    12,3 KB · Aufrufe: 46
mal schnell für den positiven bereich mit DB-ablage

Code:
*
DATA_BLOCK DB 6
TITLE =
VERSION : 0.1

STRUCT     
   DB_VAR : ARRAY  [0 .. 20, 0 .. 1 ] OF REAL ;    
END_STRUCT ; 
   
BEGIN
   DB_VAR[0, 0] := 0.000000e+000; 
   DB_VAR[0, 1] := 0.200000e+000; 
   DB_VAR[1, 0] := 1.000000e+000; 
   DB_VAR[1, 1] := 1.200000e+000; 
   DB_VAR[2, 0] := 2.000000e+000; 
   DB_VAR[2, 1] := 2.200000e+000; 
   DB_VAR[3, 0] := 3.000000e+000; 
   DB_VAR[3, 1] := 3.200000e+000; 
   DB_VAR[4, 0] := 4.000000e+000; 
   DB_VAR[4, 1] := 4.200000e+000; 
   DB_VAR[5, 0] := 5.000000e+000; 
   DB_VAR[5, 1] := 5.200000e+000; 
   DB_VAR[6, 0] := 6.000000e+000; 
   DB_VAR[6, 1] := 6.200000e+000; 
   DB_VAR[7, 0] := 7.000000e+000; 
   DB_VAR[7, 1] := 7.200000e+000; 
   DB_VAR[8, 0] := 8.000000e+000; 
   DB_VAR[8, 1] := 8.200000e+000; 
   DB_VAR[9, 0] := 9.000000e+000; 
   DB_VAR[9, 1] := 9.200000e+000; 
   DB_VAR[10, 0] := 0.000000e+000; 
   DB_VAR[10, 1] := 0.000000e+000; 
   DB_VAR[11, 0] := 0.000000e+000; 
   DB_VAR[11, 1] := 0.000000e+000; 
   DB_VAR[12, 0] := 0.000000e+000; 
   DB_VAR[12, 1] := 0.000000e+000; 
   DB_VAR[13, 0] := 0.000000e+000; 
   DB_VAR[13, 1] := 0.000000e+000; 
   DB_VAR[14, 0] := 0.000000e+000; 
   DB_VAR[14, 1] := 0.000000e+000; 
   DB_VAR[15, 0] := 0.000000e+000; 
   DB_VAR[15, 1] := 0.000000e+000; 
   DB_VAR[16, 0] := 0.000000e+000; 
   DB_VAR[16, 1] := 0.000000e+000; 
   DB_VAR[17, 0] := 0.000000e+000; 
   DB_VAR[17, 1] := 0.000000e+000; 
   DB_VAR[18, 0] := 0.000000e+000; 
   DB_VAR[18, 1] := 0.000000e+000; 
   DB_VAR[19, 0] := 0.000000e+000; 
   DB_VAR[19, 1] := 0.000000e+000; 
   DB_VAR[20, 0] := 0.000000e+000; 
   DB_VAR[20, 1] := 0.000000e+000; 
END_DATA_BLOCK


FUNCTION FC7 : REAL

VAR_INPUT
   rXValue : REAL; 
END_VAR

VAR_TEMP
   rValue : REAL;
   i : INT;
END_VAR

    FOR i := 0 TO 20 DO
        IF DB6.DB_VAR[i,0] >= rXValue THEN
            rValue := DB6.DB_VAR[i,1];
            EXIT;
        END_IF;    
    END_FOR;
    FC7 := rValue;
END_FUNCTION

is natürlich ausbaufähig
 
Zurück
Oben