Inżynier Programista Strona uzupełniająca kanału Inżynier Programista

Obliczanie sprężyny naciskowej - sposób 1

Poniższy algorytm został przedstawiony w odcinku nr 204:

Jeżeli chciałbyś wesprzeć rozwój mojego kanału:

Postaw mi kawę na buycoffee.to

-->	kill(all);
Obliczenia sprężyny naciskowej - schemat obliczeniowy #1
Zadanie 1: Oblicz sprężynę naciskową, która pod zadanym naciskiem siłą F nie przekroczy wymaganego wymiaru ln
  2 Założenia
Maksymalna siła F, która działa na sprężynę, wyrażona w [N]:
 -->	F:35$;
Długość sprężyny ln, która nie może zostać przekroczona po obciążeniu zadaną siłą, w [mm]:
 -->	l_n:24$;
Sprężyna wykonywana z drutu wg standardu SH (High Tensile Strength) ISO 10270-1, gdzie:
Wytrzymałość na rozciąganie Rm dla drutu:
 -->	Rm:2230$;
Naprężenia dopuszczalne dla materiału wynoszą [MPa]:
 -->	%tau_dop:Rm/2.1;
- moduł Kirchhoffa dla materiału wynosi [MPa]:
1) Dla stali wg ISO 10270-1, G = 81500 MPa
2) Dla stali nierdzewnych wg ISO 10270-3, G = 70000 MPa
 -->	G:81500$
  3 Obliczenia
  3.1 Krok 1: Dobór parametru opisującego wskaźnik sprężyny "w":
W typowych zastosowaniach "w" zawiera się w przedziale <7 - 10>
Przyjmuję zatem:
  3.2 Krok 2: Obliczenie współczynnika poprawkowego "k":
 -->	k:float(1+(5/4)*(1/w)+(7/8)*(1/w)^2+(1/w)^3);
  3.3 Krok 3: Obliczenie wymaganej średnicy drutu sprężyny d [mm]:
 -->	d:float(sqrt(8*F*w*k/(%pi*%tau_dop)));
Na podstawie dostępności rzeczywistych wymiarów drutu, dobieram ostateczną średnicę:
 -->	d_real:1$
Na podstawie wartości "d_real" koryguję wartość parametru "w" celem korekty wartości w kroku nr 1:
 -->	iter:0$;
 -->	if d_real>d then
	    w_test:w$
	    while d_real-d>0.01 do
	    (
	        w_test:w_test+0.1,
	        k_test:1+(5/4)*(1/w_test)+(7/8)*(1/w_test)^2+(1/w_test)^3,
	        d:sqrt(8*F*w_test*k_test/(%pi*%tau_dop)),
	        iter:iter+1,
	        if iter>200 then
	        (
	            return(w_test)
	        )
	    );
 -->	if iter>0 then
	    print(concat("Iteracja nr ", iter, ")"), concat("w:", float(round(w_test*10^2)/10^2)), concat("d:", float(round(d*10^2)/10^2)))
	else
	    print("Korekta nie jest wymagana.")$
 -->	d:d_real$
  3.4 Krok 4: Obliczenie wymaganej średnicy podziałowej D [mm]:
 -->	D:float(round(w*d*10^2)/10^2);
 -->	D:8$
 -->	w_real:float(round(D/d*10^2)/10^2);
  3.5 Krok 5: Określenie liczby zwojów nieczynnych z_n:
 -->	z_n:2;
  3.6 Krok 6: Określenie sposobu wykonania zakończenia zwojów p:
Warianty wykonania zakończenia zwojów:
	- zwoje przyłożone i szlifowane, wówczas p = -0,5
	- zwoje przyłożone i nieszlifowane, gdy całkowita liczba zwojów jest liczbą połówkową, wówczas p = 0,5
	- zwoje przyłożone i nieszlifowany, gdy całkowita liczba zwojów jest liczbą całkowitą, wówczas p = 1
 -->	p:-0.5;
  3.7 Krok 7: Określenie zależności pomiędzy średnicą drutu d a wskaźnikiem w:
Podana poniżej aproksymacja może zostać zastosowana tylko w przedziale 6 <= w <= 10:
 -->	if d<0.8 then
	    x:0.03*w_real+0.04
	else
	    x:0.03*w_real-0.04$;
 -->	float(x);
  3.8 Krok 8: Obliczenie liczby zwojów czynnych z_c:
 -->	z_c:float((l_n-d*(z_n+p))/(d*(1+x)));
Zakładam ostateczną wartość parametru definiującego liczbę czynnych zwojów "z_c"
  3.9 Krok 9: Obliczenie całkowitej liczby zwojów "z":
 -->	z:z_n+z_c;
  3.10 Krok 10: Obliczenie strzałki ugięcia "f_n" dla zadanej siły "F":
 -->	f_n:float(8*F*z_c*D^3/(G*d^4));
  3.11 Krok 11: Obliczenie sumy minimalnego prześwitu międzyzwojnego "a":
 -->	a:x*z_c*d;
  3.12 Krok 12: Obliczenie długości sprężyny zblokowanej "l_bl":
 -->	l_bl:d*(z+p);
  3.13 Krok 13: Obliczenie długości sprężyny w stanie swobodnym "l_0":
 -->	l_0:l_n+f_n;
  3.14 Krok 14: Obliczenie sztywności sprężyny "c":
 -->	c:F/f_n;
  3.15 Krok 15: Sprawdzenie naprężeń dla założonej siły:
 -->	%tau:float(8*F*w_real*k/(%pi*d^2));
 -->	if %tau>%tau_dop then
	        print(concat("Wartość naprężeń dopuszczalnych została przekroczona o: ", float(round(10^2*100*(%tau-%tau_dop)/%tau)/10^2), "%"))
	    else
	        print("Korekta nie jest wymagana.")$
Rzeczywisty współczynnik bezpieczeństwa wynosi:
 -->	%tau_real:Rm/%tau;
  3.16 Krok 16: Sprawdzenie wartości parametru "l_n" przy maksymalnej sile "F":
 -->	l_n_final:l_0-f_n;
  4 Podsumowanie
  4.1 Wyprowadzenie podsumowania
 -->	t[1]:concat("Średnica drutu d = ", d, " mm")$
 -->	t[2]:concat("Średnica podziałowa sprężyny D = ", D, " mm")$;
 -->	t[3]:concat("Średnica wewnętrzna sprężyny Dw = ", float(round((D-d)*10^2)/10^2), " mm")$
 -->	t[4]:concat("Średnica zewnętrzna sprężyny Dz = ", float(round((D+d)*10^2)/10^2), " mm")$
 -->	t[5]:concat("Wskaźnik sprężyny w = ", float(round(w_real*10^2)/10^2))$
 -->	t[6]:concat("Liczba zwojów czynnych z_c = ", z_c)$
 -->	t[7]:concat("Całkowita liczba zwojów z = ", z)$
 -->	t[8]:concat("Długość sprężyny w stanie swobodnym L_0 = ", float(round(l_0*10^2)/10^2), " mm")$
 -->	t[9]:concat("Długość sprężyny w stanie ściśniętym L_n = ", float(round(l_n_final*10^2)/10^2), " mm")$;
 -->	t[10]:concat("Ugięcie sprężyny pod działaniem siły F = ", F, " N wynosi f_n = ", float(round(f_n*10^2)/10^2), " mm")$
 -->	t[11]:concat("Sztywność sprężyny c = ", float(round(c*10^2)/10^2), " N/mm")$
  4.2 Rezultat
 -->	for i:1 step 1 thru 11 do
	    print(t[i])$;