unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Math, Menus; const // Общие характеристики стали // Puasson = 0.28; // Yung = 206000; Yung = 216000; Puasson = 0.28; e_0u = -0.5; P_Rab = 7.2; DeltaP = 0.01; DeltaT = 0.1; CorrSpeed = 1; type TfmMain = class(TForm) bCalc: TButton; lResursName: TLabel; lDangerName: TLabel; lPressureName: TLabel; lResurs: TLabel; lDanger: TLabel; lPressure: TLabel; Panel1: TPanel; Label7: TLabel; Label8: TLabel; Label9: TLabel; eDepth: TEdit; eLength: TEdit; eWidth: TEdit; eThickness: TEdit; eDiameter: TEdit; Label10: TLabel; Label11: TLabel; lTest: TLabel; Label1: TLabel; Label2: TLabel; Label3: TLabel; lKBD: TLabel; cbSteel: TComboBox; Label4: TLabel; cbDeform: TCheckBox; PopupMenu1: TPopupMenu; N1: TMenuItem; procedure bCalcClick(Sender: TObject); procedure N1Click(Sender: TObject); private { Private declarations } __Length,__Width,__Depth,__Diameter,__Thickness:Extended; // исходные параметры дефекта _Length,_Width,_Depth,_Diameter,_Thickness:Extended; // параметры дефекта с учетом развития во времени Radius: Extended; // Исходные параметры трубы Length,Width,Diameter,Thickness,Thickness_Ost:Extended; //параметры дефекта с учетом деформации Len_pr:Extended; // Приведенная длина a_0,a_Fi,a_z:Extended; // коэффициента концентрации напряжений Tau_Fi_Nom,Tau_Z_Nom:Extended; // номинальные компоненты напряжений Tau_Fi_E,Tau_Z_E:Extended; // условно-упругие компоненты напряжений Tau_Fi,Tau_Z:Extended; // упруго-пластические компоненты напряжений Tau_I,Tau_I_Nom,Tau_I_E:Extended; // интенсивности номинальных и местных упругих напряжений ae,aN:Extended; // упругий и Нейберовский коэффициенты концентрации mu,k: Extended; // упруго-пластический модуль сдвига и объемный модуль упругости E_Fi,E_Z,E_R:Extended; //компоненты деформации E_Fi_Nom,E_Z_Nom,E_R_Nom:Extended; //номинальные компоненты деформации E_I,E_0,E_1,Q:Extended; // интенсивность деформации, объемная деформация, наибольшая деформация удлинения P_02: Extended; // наибольшее допустимое давление при испытаниях трубопровода P_B: Extended; // полное проектное давление P_Calc,P_result,t,UR:Extended; // искомое давление и условный ресурс Result:Extended; public { Public declarations } end; var fmMain: TfmMain; implementation uses About; {$R *.dfm} procedure TfmMain.bCalcClick(Sender: TObject); var E_Fi_C,E_Z_C,E_R_C:Extended; Fi,Nu,TH,Y:Extended; Pr_s1,Pr_s2:Extended; _n,n:Extended; tmp,tmp2:Extended; i:integer; Tau_02,Tau_B,Tau_T:integer; m,e_0f,e_if,e_iu:Extended; cycle:integer; function Intensivity(a,b,c:Extended;Devider:integer):Extended; begin Result:=SQRT(2)/Devider*SQRT(SQR(a-b)+SQR(b-c)+SQR(c-a)) end; begin bCalc.Enabled:=False; case CbSteel.ItemIndex of 0: begin // характеристики стали 17ГС Tau_02 := 450; Tau_B := 550; Tau_T := 420; m := 0.09; e_0f := 0.0021; e_if := 1.4; e_iu := m; end; //Tau_02 := 345; Tau_B := 510; Tau_T := 360; m := 0.09; e_0f := 0.0021; e_if := 1.4; e_iu := m; end; 1: begin // характеристики стали X70 Tau_02 := 480; Tau_B := 600; Tau_T := 450; m := 0.1; e_0f := 0.0025; e_if := 1.8; e_iu := m; end; 2: begin // характеристики стали Ф Tau_02 := 500; Tau_B := 650; Tau_T := 460; m := 0.11; e_0f := 0.0026; e_if := 1.8; e_iu := m; end; end; try // Преобразование исходных данных в числа __Thickness:=StrToFloat(eThickness.Text); // Толщина стенки трубы __Diameter:=StrToFloat(eDiameter.Text)-2*__Thickness; // Внутренний диаметр __Length:=StrToFloat(eLength.Text); __Width:=StrToFloat(eWidth.Text); __Depth:=(StrToFloat(eDepth.Text)*__Thickness)/100; P_02:=Tau_02*(2*__Thickness)/__Diameter; P_B :=Tau_B*(2*__Thickness)/(__Diameter); //_n := (0.5*(P_02+P_B))/P_Rab; _n := (P_02+0.2)/P_Rab; t:=0; if cbDeform.Checked then cycle:=10 else cycle:=1; // начало цикла расчета условного ресурса repeat _Thickness:=__Thickness; _Diameter:=__Diameter; _Length:=__Length+2*CorrSpeed*t; // расчет размеров дефекта на заданном сроке t _Width:=__Width+2*Corrspeed*t; _Depth:=__Depth+CorrSpeed*t; P_result :=0; // начало цикла поиска номинального давления методом итераций repeat E_Fi:=0; E_Z:=0; E_R:=0; E_Fi_Nom:=0; E_Z_Nom:=0; E_R_Nom:=0; P_result:=P_result+DeltaP; //начало цикла определения деформационных размеров дефекта и трубы for i:=1 to cycle do begin {*** Расчет размеров дефекта и трубы с учетом деформации***} Diameter:=_Diameter*Exp(E_Fi_Nom)+_Width/PI*(Exp(E_Fi-E_Fi_Nom)-1); Thickness:=_Thickness*Exp(E_R_Nom); Thickness_Ost:=(_Thickness-_Depth)*Exp(E_R); Length:=_Length*Exp(E_Z); Width:=_Width*Exp(E_Fi); // *** Расчет коэффициентов концентрации напряжений: *** Len_pr:=Length/SQRT(0.5*Diameter*Thickness_Ost); // расчет приведенной длины дефекта Fi:=2*Width/Diameter; Nu:=Thickness_Ost/Thickness; a_0:=3-Power(2,(3*Nu-1)/(2*Nu)); TH:= TanH((SQRT(3)/2)*(Len_pr+Nu*PI-PI)); a_Fi:=(1+Nu*a_0)/(2*Nu)+TH*(1-Nu*a_0)/(2*Nu); a_Z:=(Pi*Nu+2*(1-Nu)*sin(Fi/2))/(Nu*(Pi-Fi/2*(1-Nu)))+((a_0-1)*(Pi-Fi/2))/Pi; Tau_Fi_Nom:=(P_result*Diameter)/(2*Thickness); Tau_Z_Nom:=Tau_Fi_Nom/2; Tau_I_Nom:=Intensivity(Tau_Fi_Nom,Tau_Z_Nom,0,2); Tau_Fi_E:=Tau_Fi_Nom*a_Fi; Tau_Z_E:=Tau_Z_Nom*a_Z; Tau_I_E:=Intensivity(Tau_Fi_E,Tau_Z_E,0,2); ae:=Tau_I_E/Tau_I_Nom; if (Tau_I_Nom <= Tau_T) and (Tau_I_E <= Tau_T) then aN:=ae else if (Tau_I_Nom >= Tau_T) and (Tau_I_E >= Tau_T) then aN:=Power(ae,(2*m)/(1+m)) else aN:=Power(ae,(2*m)/(1+m))*Power(Tau_I_Nom/Tau_T,(m-1)/(m+1)); // Y:=Length/SQRT(0.5*Diameter*Thickness); Y:=TanH(SQRT(3)/2*(Length/SQRT(0.5*Diameter*Thickness)-Pi)); Tau_Fi:=Tau_Fi_Nom*((1-Y)/2*aN+(1+Y)/2*ae); Tau_Z:=Tau_Z_Nom*ae; Tau_I:=Intensivity(Tau_Fi,Tau_Z,0,2); Mu:= Yung/(2*(1+Puasson)); if Tau_I>Tau_T then Mu:=Mu*Power(Tau_I/Tau_T,(m-1)/m); K:=Yung/(3*(1-2*Puasson)); // расчет компонент деформации E_Fi:=Tau_Fi*(1/(9*k)+1/(3*Mu))+Tau_Z*(1/(9*k)-1/(6*Mu)); E_Z:=Tau_Z*(1/(9*k)+1/(3*Mu))+Tau_Fi*(1/(9*k)-1/(6*Mu)); E_R:=(Tau_Fi+Tau_Z)*(1/(9*k)-1/(6*Mu)); E_I:=Intensivity(E_Fi,E_Z,E_R,3); // расчет интенсивности деформации // расчет номинальных компонент деформации E_Fi_Nom:=(Tau_Fi_Nom*(1+Puasson)-Puasson*(Tau_Fi_Nom+Tau_Z_Nom))/Yung; E_Z_Nom:=(Tau_Z_Nom*(1+Puasson)-Puasson*(Tau_Fi_Nom+Tau_Z_Nom))/Yung; E_R_Nom:=(-Puasson*(Tau_Fi_Nom+Tau_Z_Nom))/Yung; end; //********************************************************* E_0:=(E_Fi+E_Z+E_R)/3; E_1:=Max(Max(E_Fi,E_Z),E_R); Q:= arccos((E_1-E_0)/E_I); Pr_s1:= E_0/e_0f+E_I/e_if; Pr_s2:=E_0/E_0u+(E_I*cos(Q))/e_iu; until (Pr_s1>=1) or (Pr_s2>=1); P_result:=P_result-DeltaP; if t=0 then P_Calc:=P_result; t:=t+DeltaT; n := P_result/P_Rab; until (n<=_n) or (t>10.1); t:=t-DeltaT; with lDanger do if t=0 then Caption:='Закритический' else if (t>0) and (t<=1) then Caption:='Критический' else if t>5 then Caption:='Незначительный' else Caption:='Докритический'; // Отображение полученных результатов lTest.Caption:=FloatToStr(P_Calc); if t<10 then lResurs.Caption:=FloatToStr(t) else lResurs.Caption:='>'+FloatToStr(t); if P_Calc/P_B*100<100 then lPressure.Caption:=FloatTostrF(P_Calc/P_B*100,ffGeneral,4,2) else lPressure.Caption:=FloatTostrF(100,ffGeneral,4,2); lKBD.Caption:=FloatTostrF(P_B/P_Calc,ffGeneral,4,2); except on EConvertError do raise Exception.Create('Неверно заданы параметры расчета.'); end; bCalc.Enabled:=True; end; procedure TfmMain.N1Click(Sender: TObject); begin fmAbout.Show; end; end.