Step 7 Kurvenprogramm

ka1978

Level-1
Beiträge
139
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo,

hat vielleicht jemand ein Beispielprogramm oder ein Idee für ein Kurven verlauf.

die Kurve soll nachfolgende Beschreibung laufen:

vom P1=20 bis P2=220 (T1=0 bis T2=10 ) läuft mi einer Steigung von 20.
vom P2=220 bis P3=470 (T1=10 bis T2=20 ) läuft mi einer Steigung von 25.
vom P3=470 bis P4=470 (T1=20 bis T2=30 ) läuft mi einer Steigung von 0.
vom P4=470 bis P5=40 (T1=30 bis T2=40 ) läuft mi einer Steigung von -43.
 
Du willst einfach ne einfache XY kurve?

Also Eingang X1 gibt Ausgang Y1 und Eingang X2 gibt Ausgang Y2? Und dazwischen einfach eine Gerade?

Code:
FUNCTION X_Y: REAL
(*Umwandlungsoperation*)
TITLE = 'REAL scalierung von X nach Y'
VERSION : '1.0'
AUTHOR  : vor
NAME    : X_Y
FAMILY  : data

(*X umskalieren nach Y*)
(*X1 nach Y1, X2 nach X2, X wird in Bereichen X1 und X2 begrenzt*)
(*Negative sowie Positive Lineare und Werte sind erlaubt*)
{S7_tasklist:='false';
 S7_blockview:='small'}

VAR_INPUT
   X: REAL; 
  X1: REAL;
  X2: REAL;
  Y1: REAL;
  Y2: REAL;
END_VAR

VAR_TEMP
 LIM_X_UG: REAL;
 LIM_X_OG: REAL;
 LIMIT_R: REAL;
 END_VAR

(*Eingang X wird Limitiert*)
 BEGIN
  IF X1 < X2 THEN
     LIM_X_UG:= X1;
     LIM_X_OG:= X2;
  ELSIF X2 < X1 THEN 
     LIM_X_UG:= X2;
     LIM_X_OG:= X1;
  END_IF;   

(*Eingang X wird Limitiert*)
LIMIT_R:=LIMIT(Mn:=LIM_X_UG, IN:=X, Mx:=LIM_X_OG); 

(*Umrechnung des limitierten X Wertes*)
X_Y:=((Y2-Y1)/(X2-X1)*LIMIT_R+(Y2-(Y2-Y1)/(X2-X1)*X2));
END_FUNCTION
 
Ok , ich formuliere ganz anders, die folgende Koordinaten :p1 (0h,20°C); P2 (10h,220°C); P3 (20h,470°C), P4(30h,470°C) und P5(40,200°C) sind

als Eingabe Werte am Touchpanel zum Darstellung von der Kurve.

ich hoffe, dass es jetzt deutlicher ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah okay, da könntest du obiges Programm im Ganzen erweitern um weitere Stützpunkte oder du erweiterst den Baustein mit einem Output (Act)

und dem Code:
Code:
 Act := (X >= X1) AND (X <= X2);

Damit du siehst wenn X sich in den Grenzen X1 und X2 befindet.

Dann rufst du für die Gerade P1-P2, P2-P3, P3-P4 und P4-P5 den baustein auf jeweils auf wobei X1/Y1 z.B. 0h/20.0 drin hat X2/Y2 10h/220.0

An X hängst du einen TON Zeitausgang an oder was du halt willst. Und lässt den dann laufen.

Mit dem Ausgang Act kopierst du die Werte auf deinen Rückgabewert den du dann verwenden willst.

Und Sämtliche Anschlüsse beschickst du mit den Variablen welche du vom Touch schreiben willst.

mfg René
 
Danke.

ich habe nicht so richtig verstanden, wenn es möglich den Code in AWL zu schreiben, es wäre ganz nett.

ich habe Ein code geschrieben aber leider bis jetzt läuft nicht richtig Sauber.wenn Sie mir Ihre mail adresse geben, sende ich Ihnen den

Code.Natürlich, wenn Sie nicht was dagegen haben.
 
Hallo,

Da poste ich den Code , was mache ich hier nicht so Richtig.

Code:
     U    "DB_werte".Freigabe

      SPB   Anf

      R     M    190.0
      R     M    190.2

      L     0.000000e+000
      T    "DB_werte".Zielwert

      L     1.000000e+000
      T    "DB_werte".Steigung

      SPA   END

Anf:  NOP   0
      NOP   0
      NOP   0

      L     "DB_Werte".p1
      T     "DB_werte".Zielwert

      L     "DB_werte".Sollwert
      L     "DB_werte".Zielwert
      >=R   

      SPB   m02

      L     "DB_werte".p1
      L     "DB_werte".p0
      -R    
      L     "DB_werte".T1
      /R    
      T     "DB_werte".Steigung

      SPA   END

m02:  NOP   0
      L     "DB_werte".p2
      T     "DB_werte".Zielwert

      L     "DB_werte".Sollwert
      L     "DB_werte".Zielwert
      >=R   

      SPB   m03

      L     "DB_werte".p2
      L     "DB_werte".p1
      -R    
      L     "DB_werte".T2
      /R    
      T     "DB_werte".Steigung

      SPA   END

m03:  NOP   0

      L    "DB_werte".p3
      L     "DB_werte".p2
      ==R   
      =     M    190.0

      SPBN  m06

      L     "DB_werte".p3
      T     "DB_werte".Zielwert

      L     0.000000e+000
      T     "DB_werte".Steigung


      U     M    190.2
      SPB   m08

      SPA   END

m06:  NOP   0

      L     "DB_werte".p3
      T     "DB_werte".Zielwert

      L     "DB_werte".Sollwert
      L     "DB_werte".Zielwert

      >R    

      SPB   m08


      L    "DB_werte".p3
      L     "DB_werte".p2
      -R    
      L     "DB_werte".T3
      /R    
      T     "DB_werte".Steigung

      SPA   END


m08:  NOP   0

      L     "DB_werte".p4
      T     "DB_werte".Zielwert

      L    "DB_werte".Sollwert
      L    "DB_werte".Zielwert

      >=R   

      SPB   END

      L     "DB_werte".p4
      L     "DB_werte".p3
      -R    

      L     "DB_werte".T4
      /R    
      T     "DB_werte".Steigung

      SPA   END

END:  NOP   0
 
Hallo,
wenn ich deine Anfrage so richtig verstehe dann willst du eine Hüllkurve für eine Temperatur-Steuerung vorgeben.
Hierbei soll für die Zeitpunkte tStart bis TEnde ein Temperatur-Sollwert ausgegeben werden. Eingeben würdest du hier die Stützstellen und die Zwischenwerte sollen passend erzeugt werden - liege ich da so weit richtig ?
Wenn ja, dann finde ich das in deinem Code nicht wirklich wieder.
Ich würde da wie folgt vorgehen :
- Zunächst einen Zeitgeber erstellen
- die Werte des Zeitgebers ggf. auf deine Zeit-Vorgaben umrechnen.
- Ermitteln, in welchem Zeit-Bereich deiner Hüllkurve du dich gerade befindest.
- den Zwischenwert für den Zeitbereich erzeugen :
Code:
Zeit_im_Zeitfenster = Zeit_absolut - Zeit_Start_Zeitfenster
Steigung_Temperatur = (Temperatur_Ende_Zeitfenster - Temperatur_Start_Zeitfenster) / (Zeit_Ende_Zeitfenster - Zeit_Start_Zeitfenster)
Tempeartur_Ausgabe = Temperatur_Start_Zeitfenster + (Zeit_im_Zeitfenster * Steigung_Temperatur)
... ist zwar ungetestet - ich denke jedoch, dass es so arbeiten würde, wie gewünscht.
Wenn du mit Zwischenwerten arbeitest, wie von mir symbolisch genannt dann brauchst du die Berechnung nur einmal machen ...

Gruß
Larry
 
Zurück
Oben