home *** CD-ROM | disk | FTP | other *** search
- (*--------------------------------------------------------------------------*)
- (* Modul: berech.inc *)
- (*--------------------------------------------------------------------------*)
- (* Berechnet aus einer Streckenlast die Groesse und den Angriffspunkt der
- Resultierenden. Wobei Trapezlasten in Rechteck- und Dreieckslasten
- aufgeteilt werden. *)
-
- PROCEDURE Trapezlast (Ort,Lastlaenge,Lastlinks,Lastrechts : REAL;
- VAR Resultierende,Resultort : REAL);
-
- VAR c, (* fuer den Ort der Resultierenden einer Dreieckslast (c/3xL) *)
- GewichtDR, (* Groesse der Deiecksflaeche *)
- GewichtRE, (* Groesse der Rechteckflaeche *)
- OrtDR,OrtRE (* Orte der Resultierenden aus Dreieck und Rechteck *)
- : REAL;
-
- (*------------------------------------------------------------------------*)
-
- FUNCTION MIN (a,b : REAL) : REAL;
-
- BEGIN
- IF a > b THEN
- MIN := b
- ELSE
- MIN := a;
- END; (* min *)
-
-
- BEGIN (* Trapezlast *)
- GewichtDR := ABS (Lastlinks - Lastrechts) * Lastlaenge / 2;
- GewichtRE := MIN (Lastlinks,Lastrechts) * Lastlaenge;
- IF Lastlinks > Lastrechts THEN
- c := 1
- ELSE
- c := 2;
- OrtDR := c/3 * Lastlaenge;
- OrtRE := Lastlaenge / 2;
- Resultierende := GewichtRE + GewichtDR;
- Resultort := Ort + (GewichtRE * OrtRE + GewichtDR * OrtDR) / Resultierende;
- END; (* trapezlast *)
-
- (*---------------------------------------------------------------------------*)
- (* Berechnet beide Auflagerkraefte ('links' und 'rechts'). *)
-
- PROCEDURE Auflagerkraefte (VAR links,rechts : REAL);
-
- VAR Resultierende,Resultort : REAL;
- i : INTEGER; (* Zaehler fuer die Lasten *)
-
- BEGIN
- FOR i:=1 to Anzahl DO BEGIN
- IF Last[i].Laenge <> 0 THEN (* Streckenlast: berechne Resultierende
- und deren Ort *)
- Trapezlast (Last[i].Ort,Last[i].Laenge,Last[i].Links,Last[i].Rechts,
- Resultierende,Resultort)
- ELSE BEGIN (* Einzellast: Resultierende und Ort bekannt *)
- Resultierende := Last[i].Links;
- Resultort := Last[i].Ort;
- END; (* else *)
- links := links + Resultierende * (Feldlaenge - Resultort) / Feldlaenge;
- rechts := rechts + Resultierende * Resultort / Feldlaenge;
- END; (* for *)
- END; (* auflagerkraefte *)
-
- (*--------------------------------------------------------------------------*)
- (* Berechnet die Schittreaktionen (Moment und Querkraft) an beliebiger
- Stelle des Balkens. *)
-
- PROCEDURE Schnittkraft (Ort : REAL; VAR Moment,Querkraft : REAL);
-
- VAR Resultierende,Resultort,
- Hebelarm, (* Abstand der Resultierenden vom Berechnungsort *)
- SummeM,SummeQ, (* Zwischensummen des Momentes und der Querkraft *)
- Laenge, (* Laenge der Last, evtl. nur bis zum Berechnungsort *)
- Rechts (* rechte Ordinate der Last, evtl. Ordinate am Berechnungsort *)
- : REAL;
- i : INTEGER; (* Zaehler fuer die Lasten *)
-
- (*------------------------------------------------------------------------*)
- (* Interpoliert die rechte Ordinate einer Streckenlast, falls der
- Berechnungsort innerhalb der Last liegt. *)
-
- FUNCTION Interpolation (ILinks,IRechts,Ort,WertLinks,WertRechts:REAL):REAL;
-
- BEGIN
- Interpolation := (WertRechts - WertLinks) / (IRechts - ILinks)
- * (Ort - ILinks) + WertLinks
- END; (* interpolation *)
-
-
- BEGIN (* Schnittkraft *)
- SummeM := Auflagerlinks * Ort; (* Moment des linken Auflagers *)
- SummeQ := Auflagerlinks; (* Querkraft am linken Auflager *)
- FOR i:=1 to Anzahl DO BEGIN
- Hebelarm := 0; Resultierende := 0;
- IF (Last[i].Laenge = 0) AND (Last[i].Ort < Ort) THEN BEGIN
- Resultierende := Last[i].Links; (* Einzellast *)
- Hebelarm := Ort - Last[i].Ort;
- END; (* if *)
- IF (Last[i].Laenge <> 0) AND (Last[i].Ort < Ort) THEN BEGIN
- Laenge := Last[i].Laenge; (* Streckenlast, die links vom *)
- Rechts := Last[i].Rechts; (* Berechnungsort liegt. *)
- IF Last[i].Ort + Last[i].Laenge > Ort THEN BEGIN
- (* Streckenlast, deren Anfangspunkt links, und deren Endpunkt *)
- (* rechts vom Berechnungsort liegt, d.h. die rechte Ordinate *)
- (* und die Laenge muss berechnet werden. *)
- Laenge := Ort - Last[i].Ort;
- Rechts := Interpolation (Last[i].Ort,Last[i].Ort+Last[i].Laenge,
- Ort,Last[i].Links,Last[i].Rechts);
- END; (* if *)
- Trapezlast (Last[i].Ort,Laenge,Last[i].Links,Rechts,
- Resultierende,Resultort);
- Hebelarm := Ort - Resultort;
- END; (* if *)
- SummeM := SummeM - Resultierende * Hebelarm; (* summiere Moment *)
- SummeQ := SummeQ - Resultierende; (* summiere Querkraft *)
- END; (* for *)
- Moment := SummeM;
- Querkraft := SummeQ;
- END; (* moment *)
-
- (*--------------------------------------------------------------------------*)
- (* Findet iterativ den Ort des maximalen Momentes auf einen cm genau. *)
-
- FUNCTION OrtMaximumMoment : REAL;
-
- VAR ILinks,IRechts, (* Intervallgrenzen *)
- Step, (* Schrittweite der Untersuchung *)
- dummy : REAL;
- i : INTEGER; (* Zaehler fuer die Genauigkeit *)
-
- (*------------------------------------------------------------------------*)
- (* Berechnet bei Vorgabe eines Intervalls und einer Schrittweite das
- Maximum. Wird mehrmals mit jeweils groesserer Genauigkeit aufgerufen *)
-
- FUNCTION Maximum (links,rechts,step : REAL) : REAL;
-
- VAR Letzt,Jetzt, (* zum Vergleich der berechneten Momente *)
- dummy : REAL; (* Querkraft wird hier nicht benoetigt *)
- i, (* Zaehler *)
- a,b : INTEGER; (* Intervallgrenzen *)
-
- BEGIN
- a := TRUNC (links / step); (* Umrechnung der Intervallgrenzen in *)
- b := TRUNC (rechts / step); (* Integer, zur Verwendung von FOR. *)
- Schnittkraft (links,Letzt,dummy); (* Moment am linken Intervallrand *)
- FOR i:=a+1 TO b DO BEGIN
- Schnittkraft (i*step,Jetzt,dummy); (* Berechne Moment. *)
- IF Jetzt > Letzt THEN BEGIN (* Vergleiche Momente, und behalte *)
- Letzt := Jetzt; (* Groesse und Ort des Groesseren. *)
- Maximum := i * step; (* Rechne Integer in Real zurueck. *)
- END; (* if *)
- END; (* for *)
- END; (* maximum *)
-
-
- BEGIN (* OrtMaximumMoment *)
- ILinks := 0; (* Festlegung der Intervallgrenzen *)
- IRechts := Feldlaenge + 1;
- Step := 10; (* erste Genauigkeit *)
- FOR i:=1 TO 3 DO BEGIN (* Berechne und vergleiche maxi- *)
- Step := Step / 10; (* male Momente zunaechst im *)
- dummy := Maximum (ILinks,IRechts,Step); (* m-Abstand, dann im dm- und *)
- ILinks := dummy - Step; (* zuletzt im cm-Abstand. *)
- IRechts := dummy + Step;
- END; (* for *)
- OrtMaximumMoment := dummy; (* uebergebe gefundenen Ort *)
- END; (* momentmaximum *)
-