Step 7 Berechnung in AWL

Supermario73

Level-2
Beiträge
77
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Wer kann diese Formel von Excel in AWL umsetzen:

=((d/2)^2*ARCCOS(((d/2)-h)/(d/2))-((d/2)-h)*(2*(d/2)*h-h^2)^(0.5))*L

oder als Formel:

Formel.jpg

d= Eingabe Durchmesser
h= Eingabe Füllstand
L= Eingabe Länge des Tanks

Diese Formel berechnet anhand des Füllstands eines zylinderförmigen Tanks das Volumen.

Besten Dank für Eure Hilfe
 
Das können wir alle. Aber du kriegst ja den Lohn dafür.

Fang doch einfach mal an.

L #D
L 2.0
/R
= #Dd2

L #Dd2 // ich weiss nicht zwingend nötig
L #h
-R
T #zwm

Etc.

Mfg René
 
Zuviel Werbung?
-> Hier kostenlos registrieren

Für SUPERMARIO sollte DAS doch nun wirklich kein Problem sein :D:D

Sind das Hausaufgaben? Die Formel sieht toll aus.
Im praktischen Leben würde ich: Auslitern, DB erstellen in der gewünschten Auflösung, Füllhöhe messen und fertig.
 
Nönö berechnen ist schon okay. Kann man sich n baustein machen. 10kubikmeter auslitern kann sich hinziehen.

Ich würd der übersichtlichkeithalber SCL vorziehen.
 
Nönö berechnen ist schon okay. Kann man sich n baustein machen. 10kubikmeter auslitern kann sich hinziehen.

Ich würd der übersichtlichkeithalber SCL vorziehen.

Naja, aber wenn sich in der Praxis die Behältermaße nicht ständig ändern, wovon auszugehen ist, muss man das nicht in jedem Zyklus berechnen sondern vorher einmal in Excel und dann das Ergebnis in die SPS... auch ohne auslitern

abundzu muss man mal klugscheißen...
 
Hmm, würde mich mal interessieren, wie die Abdichtung zwischen Granitblock und Berg funktioniert. Spontan hätte ich ja gedacht, das Wasser drückt eher durch den Spalt, als dass der Block sich hebt... aber schaun wir mal, wenn der erste Prototyp fertig ist...

nebenbei, die Formel sieht eher nach nem liegenden Tank aus, stehend wäre sie V=pi/4*d²*h
 
Zuletzt bearbeitet:
aber wenn sich in der Praxis die Behältermaße nicht ständig ändern
Anscheinend wurde dem TE aber aufgetragen, mit variablen Werten (Eingaben) zu rechnen.
d= Eingabe Durchmesser
h= Eingabe Füllstand
L= Eingabe Länge des Tanks


nebenbei, die Formel sieht eher nach nem liegenden Tank aus, stehend wäre sie V=pi/4*d²*h
Auf seinem Bild mit der Originalformel steht ja auch "Horizontal cylinder" ... ich wollte ihn aber auch schon auf die Formel für den stehenden Zylinder hinweisen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also nun habe ich rausgefunden: In STEP 7 gibt es nur die Möglichkeit mit der Eulerschen Zahl e (e = 2.7182818 ...) zu potenzieren (EXP).....

Ich werde also die Formel weiterbasteln.....:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So nun habe ich mal einen FC erstellt.
Leider Rechnet dieser ein wenig falsch, finde aber im Moment den Fehler nicht.
Verwendete Parameter:
Länge: 2.48
Durchmesser: 1.9
Wasserspiegel: 1.9

Resultat sollte 7.0315 ergeben
doch es spuckt 6.853 aus

Wo ist wohl der Fehler versteckt, ich finde diesen nicht! Wenn jemand einen Vorschlag hat..... dieser ist willkommen!

Quelle:
FUNCTION "Vol_Tank_Calc" : VOID
TITLE =Berechnet das Volumen eines Tankes
VERSION : 0.1


VAR_INPUT
Durchmesser_Tank : REAL ;
Laenge_Tank : REAL ;
Hoehe_Wasserspiegel : REAL ;
END_VAR
VAR_OUTPUT
Liter : REAL ;
END_VAR
VAR_TEMP
Temp_Real_1 : REAL ;
Temp_Real_2 : REAL ;
Temp_Real_3 : REAL ;
Teil_1 : REAL ;
Teil_2 : REAL ;
Teil_3 : REAL ;
Teil_4 : REAL ;
Teil_1_mul_Teil_2 : REAL ;
Teil_3_mul_Teil_4 : REAL ;
END_VAR
BEGIN
NETWORK
TITLE =Teil 4 berechnen

L #Durchmesser_Tank;
L #Hoehe_Wasserspiegel;
*R ;
T #Temp_Real_1;
L #Hoehe_Wasserspiegel;
L #Hoehe_Wasserspiegel;
*R ;
T #Temp_Real_2;

L #Temp_Real_1;
L #Temp_Real_2;
-R ;
T #Temp_Real_3;

CALL "Potenz" (
P_in := #Temp_Real_3,
X_in := 5.000000e-001,
Y_out := #Teil_4);

NETWORK
TITLE =Teil 3 berechnen

L #Durchmesser_Tank;
L 2.000000e+000;
/R ;
L #Hoehe_Wasserspiegel;
-R ;
T #Teil_3;

NETWORK
TITLE =Teil 3 mit Teil 4 multiplizieren

L #Teil_3;
L #Teil_4;
*R ;
T #Teil_3_mul_Teil_4;
NETWORK
TITLE =Teil 1 berechnen

L #Durchmesser_Tank;
L 2.000000e+000;
/R ;
T #Temp_Real_1;

CALL "Potenz" (
P_in := #Temp_Real_1,
X_in := 2.500000e+000,
Y_out := #Teil_1);

NETWORK
TITLE =Teil 2 berechnen

L #Durchmesser_Tank;
L 2.000000e+000;
/R ;
T #Temp_Real_1;

L #Teil_3;
L #Temp_Real_1;
/R ;
T #Temp_Real_2;
ACOS ;
T #Teil_2;

NETWORK
TITLE =Teil 1 mit Teil 2 multiplizieren

L #Teil_1;
L #Teil_2;
*R ;
T #Teil_1_mul_Teil_2;

NETWORK
TITLE =#Teil_1_mul_Teil_2 von Teil_3_mul_Teil_4 subtrahieren

L #Teil_1_mul_Teil_2;
L #Teil_3_mul_Teil_4;
-R ;
T #Temp_Real_1;
NETWORK
TITLE =...mit der Länge multiplizieren

L #Temp_Real_1;
L #Laenge_Tank;
*R ;
T #Liter;
END_FUNCTION


Quelle des FC3:
FUNCTION FC 3 : VOID
TITLE =Potenz
VERSION : 0.1


VAR_INPUT
P_in : REAL ; //Basis
X_in : REAL ;
END_VAR
VAR_OUTPUT
Y_out : REAL ;
END_VAR
BEGIN
NETWORK
TITLE =Potenz

L #P_in;
LN ;
L #X_in;
*R ;
EXP ;
T #Y_out;
END_FUNCTION
 
Zuletzt bearbeitet:
Hi

Mhm Mir hat ein schlauer mann bei Siemens gesagt das beim rechnen mit real zahlen fehler auftreten ( rechenfehler) in der cpu) hatte mengenrechner mit realzahlen gemacht die aber falsch rechneten nicht viel aber ein bischen. er sagte ich muss da umdispunieren und mit int und ganzen zahlen rechnen sprich vergleich wann ich eine gewisse zahl adieren kann und die dann adieren aber im ganzzahlbereich mit gleitzahlen rechnet die s7 falsch. Ob das bei jeder S7 ist weis ich nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Mhm Mir hat ein schlauer mann bei Siemens gesagt das beim rechnen mit real zahlen fehler auftreten ( rechenfehler) in der cpu) hatte mengenrechner mit realzahlen gemacht die aber falsch rechneten nicht viel aber ein bischen. er sagte ich muss da umdispunieren und mit int und ganzen zahlen rechnen sprich vergleich wann ich eine gewisse zahl adieren kann und die dann adieren aber im ganzzahlbereich mit gleitzahlen rechnet die s7 falsch. Ob das bei jeder S7 ist weis ich nicht.

Das ist was ganz anderes...

bei real kannst Du irgendwann nicht mehr 1 dazuaddieren, weils nicht im Real abgebildet wird. Aber im DINT geht's noch... Im real gehen 8 bits für den Exponenten verloren, bei DINT stehen die zur Verfügung

Gruß
 
@ducati

Genau das wars!!!!! Ich danke Dir!!! Habe ich nicht gefunden.

Der Fehler war:

CALL "Potenz" (
P_in := #Temp_Real_1,
X_in := 2.500000e+000, muss 2.000000e+000 sein!
Y_out := #Teil_1);

Werde nun noch die runden Ende des Tanks links und rechts berechnen und mit dem Zylinder addieren das Ganze, wahrscheinlich morgen, hier einstellen!

Besten Dank und Grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
auf meiner hp liegt ein projekt zum berechnen eines liegenden zylinders
ob ich das mit der obigen formel berechnet hab weiß ich nicht mehr. 100 jahre her
 
@ducati
Ja hast recht, doch ich habs gelassen, damit die Nachvollziehbarkeit auch noch in 5 Monaten möglich ist.:p

@Volker
Vielen Dank für Dein Link mit all den Bausteinen

So, nun die Quelle für FC3
Code:
FUNCTION FC 3 : VOID
TITLE =Potenz
VERSION : 0.1


VAR_INPUT
  P_in : REAL ;     //Basis
  X_in : REAL ;     
END_VAR
VAR_OUTPUT
  Y_out : REAL ;  
END_VAR
BEGIN
NETWORK
TITLE =Potenz

      L     #P_in; 
      LN    ; 
      L     #X_in; 
      *R    ; 
      EXP   ; 
      T     #Y_out; 
END_FUNCTION

...und die Berechnung des Volumens für liegen Zylinder mit runden Köpfen
Code:
FUNCTION "Vol_Tank_Calc" : VOID
TITLE =Berechnet das Volumen eines Tankes
VERSION : 0.1


VAR_INPUT
  Durchmesser_Tank : REAL ;        
  Laenge_Tank : REAL ;   
  Hoehe_Wasserspiegel : REAL ;  
END_VAR
VAR_OUTPUT
  Liter : REAL ;     
END_VAR
VAR_TEMP
  Temp_Real_1 : REAL ;   
  Temp_Real_2 : REAL ;   
  Temp_Real_3 : REAL ;   
  Teil_1 : REAL ;  
  Teil_2 : REAL ;  
  Teil_3 : REAL ;  
  Teil_4 : REAL ;  
  Teil_1_mul_Teil_2 : REAL ;         
  Teil_3_mul_Teil_4 : REAL ;         
  Zylinder : REAL ;             
  Koepfe : REAL ;               
END_VAR
BEGIN
NETWORK
TITLE =Teil 4 berechnen

      L     #Durchmesser_Tank; 
      L     #Hoehe_Wasserspiegel; 
      *R    ; 
      T     #Temp_Real_1; 
      L     #Hoehe_Wasserspiegel; 
      L     #Hoehe_Wasserspiegel; 
      *R    ; 
      T     #Temp_Real_2; 

      L     #Temp_Real_1; 
      L     #Temp_Real_2; 
      -R    ; 
      T     #Temp_Real_3; 

      CALL "Potenz" (
           P_in                     := #Temp_Real_3,
           X_in                     := 5.000000e-001,
           Y_out                    := #Teil_4);

NETWORK
TITLE =Teil 3 berechnen

      L     #Durchmesser_Tank; 
      L     2.000000e+000; 
      /R    ; 
      L     #Hoehe_Wasserspiegel; 
      -R    ; 
      T     #Teil_3; 

NETWORK
TITLE =Teil 3 mit Teil 4 multiplizieren

      L     #Teil_3; 
      L     #Teil_4; 
      *R    ; 
      T     #Teil_3_mul_Teil_4; 
NETWORK
TITLE =Teil 1 berechnen

      L     #Durchmesser_Tank; 
      L     2.000000e+000; 
      /R    ; 
      T     #Temp_Real_1; 

      CALL "Potenz" (
           P_in                     := #Temp_Real_1,
           X_in                     := 2.000000e+000,
           Y_out                    := #Teil_1);

NETWORK
TITLE =Teil 2 berechnen

      L     #Durchmesser_Tank; 
      L     2.000000e+000; 
      /R    ; 
      T     #Temp_Real_1; 

      L     #Teil_3; 
      L     #Temp_Real_1; 
      /R    ; 
      T     #Temp_Real_2; 
      ACOS  ; 
      T     #Teil_2; 
NETWORK
TITLE =Teil 1 mit Teil 2 multiplizieren

      L     #Teil_1; 
      L     #Teil_2; 
      *R    ; 
      T     #Teil_1_mul_Teil_2; 

NETWORK
TITLE =#Teil_1_mul_Teil_2 von Teil_3_mul_Teil_4 subtrahieren

      L     #Teil_1_mul_Teil_2; 
      L     #Teil_3_mul_Teil_4; 
      -R    ; 
      T     #Temp_Real_1; 
NETWORK
TITLE =...mit der Länge multiplizieren

      L     #Temp_Real_1; 
      L     #Laenge_Tank; 
      *R    ; 
      T     #Zylinder; 
NETWORK
TITLE =Köpfe berechnen

      L     #Hoehe_Wasserspiegel; 
      L     #Hoehe_Wasserspiegel; 
      *R    ; 
      T     #Temp_Real_1; 

      L     3.141593e+000; 
      L     6.000000e+000; 
      /R    ; 
      L     #Temp_Real_1; 
      *R    ; 
      T     #Temp_Real_2; 

      L     1.500000e+000; 
      L     #Durchmesser_Tank; 
      *R    ; 
      L     #Hoehe_Wasserspiegel; 
      -R    ; 
      T     #Temp_Real_3; 

      L     #Temp_Real_2; 
      L     #Temp_Real_3; 
      *R    ; 
      T     #Koepfe; 
NETWORK
TITLE =Zylinder und Köpfe addieren

      L     #Koepfe; 
      L     2.000000e+000; 
      *R    ; 
      L     #Zylinder; 
      +R    ; 
      L     1.000000e+003; 
      *R    ; 
      T     #Liter; 
END_FUNCTION

Wünsche allen frohes Arbeiten und beste Grüsse......
 
Berechnungen in AWL. Na ja ...
SCL wäre da schon die bessere Sprache.
Und schau die deine Berechnung noch mal genau an ( Köpfe )
Schlagwort Klöpperboden ...

Grüße
wiesel
 
Zurück
Oben