- Список рубрик
- Теги этой статьи
- Новые статьи на сайте
- Самые популярные статьи
- Последние новости
Pascal. Моделирование нагрева металла в методической печи
Тепловой режим нагрева металла в методических печах является методическим так как температура по длине печи переменна. В первой зоне печи (методической) происходит постепенный нагрев металла; во второй зоне (первой сварочной) и третьей (второй сварочной) - нагрев металла происходит до тех пор, пока максимальная температура металла не достигнет температуры нагрева; в зоне номер четыре (томильной) осуществляется выравнивание температуры по толщине металла до тех пор, пока не будет достигнута заданная конечная разность температур.
Перед нами стоит задача, чтобы греть слиток металла с максимально допустимой температурой, которая обуславливается следующими ограничениями:
- в начале нагрева ограничением служит условие отсутствия термического разрушения металла;
- недопустимость поднять температуру рабочего пространства выше действительной температуры горения топлива или температуры допустимой для данного вида печи;
- недопустимо нагревать металл выше температуры, при которой начинаются необратимые изменения в структуре металла.
Данный проект программы на языке программирования Pascal я писал в городе Мариуполь в 1998-ом году в Приазовском Государственном Техническом Университете на Кафедре АТПиП в рамках курсовой работы по курсу «Моделирование объектов и систем управления» на тему «Моделирование нагрева металла в методической печи» под руководством преподавателя: Зайцева Вадима Сергеевича.
В проекте моделироваля нагрев металла в методической толкательной печи с торцевой загрузкой и выдачей, с нижним обогревом, отапливаемая с помощью инжекционных горелок, установленных в четырех зонах отопления. Такая методическая печь реализована на Мариупольском Металлургическом Комбинате им. Ильича, стан 1700.
Краткое содержание пояснительной записки к проекту:
- Введение
- 1. Описание обьекта управления.
- 2. Решение задачи теплопроводности.
- 2.1 Метод конечных разностей.
- 2.2 Схема переменных направлений или дробных шагов.
- 2.3 Метод прогонки.
- 2.4 Алгоритм решения задачи теплопроводности.
- 3. Алгоритм модели нагрева металла в четырехзонной методической печи.
- Список литературы.
- Приложение
Привожу результирующий исходный код модулей программы на языке Pascal:
1. Файл модуля fmodel.pas
Program FModel;
uses
Graph, fgraph, fnagr, fconst, FMOD, MsgBox, Menus, Objects, App, Dialogs, Views, Drivers, StdDlg;
var
MyModel: TFModel;
BEGIN
new(T_1);
new(T_2);
MyModel.init;
if RegisterBGIfont(@TriplexFontProc) >= 0
then
if RegisterBGIdriver(@EGAVGADriverProc) >= 0
then MyModel.run
else MyMessageBox('Ошибка pегистpации дpайвеpа EGAVGA монитоpа.', nil, 1 + $0400);
MyModel.done;
dispose(T_1);
dispose(T_2);
END.
2. Файл модуля fgraph.pas
unit fgraph;
INTERFACE
uses
crt, graph, fconst, gmouse, fnagr;
Procedure EGAVGADriverProc;
procedure TriplexFontProc;
Procedure ShowGraphic(j : integer);
IMPLEMENTATION
var
mx, my : integer;
lb, rb : boolean;
gm, gd : integer;
procedure TriplexFontProc; external;
{$L TRIP.OBJ }
Procedure ShowGraphic(j : integer);
var
i : longint;
temp : string[6];
begin
gd := VGA;
gm := VGAHi;
initgraph(gd, gm, '');
if GraphResult = 0
then
begin
line(100, 410, 100, 10);
line(100, 410, 600, 410);
outtextxy(10, 10, 'T,K');
outtextxy(601, 406, 't,c');
for i := 0 to round(j * CurModel._dTau / 1000) - 1 do
begin
line(100 + round(i * 500 / (j * CurModel._DTau / 1000)), 408, 100 + round(i * 500 / (j * CurModel._DTau / 1000)), 412);
str(i * 1000:6, temp);
settextstyle(0, 1, 0);
outtextxy(104 + round(i * 500 / (j * CurModel._DTau / 1000)), 424, temp);
end;
settextstyle(TriplexFont, 0, 1);
line(355, 340, round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tm / 1700));
outtextxy(355, 340, 'Темпеpатуpа в печи');
line(355, 363, round(100 + 500 / j * 30), round(410 - 400 * T_1^[30] / 1700));
outtextxy(355, 363, 'Темпеpатуpа в узле 1');
line(355, 386, round(100 + 500 / j * 30), round(410 - 400 * T_2^[30] / 1700));
outtextxy(355, 386, 'Темпеpатуpа в узле 2');
settextstyle(0, 0, 0);
for i := 1 to 17 do
begin
setlinestyle(0, 0, 0);
line(98, 408 - round(i * 23.3), 102, 408 - round(i * 23.3));
setlinestyle(2, 0, 0);
line(104, 408 - round(i * 23.3), 600, 408 - round(i * 23.3));
str(i * 100:5, temp);
outtextxy(55, 404 - round(i * 23.3), temp);
end;
setlinestyle(0, 0, 3);
line(round(100 + (500 / j) * (0 / CurModel._DTau)), round(410 - 400 * CurModel._Tm / 1700),
round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tm / 1700));
line(round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tm / 1700),
round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tc1 / 1700));
line(round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tc1 / 1700),
round(100 + (500 / j) * ((TauM + TauC1) / CurModel._DTau)), round(410 - 400 * CurModel._Tc1 / 1700));
LINE(round(100 + (500 / j) * ((TauM + TauC1) / CurModel._DTau)), round(410 - 400 * CurModel._Tc1 / 1700),
round(100 + (500 / j) * ((TauM + TauC1) / CurModel._DTau)), round(410 - 400 * CurModel._Tc2 / 1700));
line(round(100 + (500 / j) * ((TauM + TauC1) / CurModel._DTau)), round(410 - 400 * CurModel._Tc2 / 1700),
round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / CurModel._DTau)),
round(410 - 400 * CurModel._Tc2 / 1700));
line(round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / CurModel._DTau)),
round(410 - 400 * CurModel._Tc2 / 1700),
round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / CurModel._DTau)), round(410 - 400 * CurModel._Tt / 1700));
line(round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / CurModel._DTau)), round(410 - 400 * CurModel._Tt / 1700),
round(100 + (500 / j) * ((TauM + TauC1 + TauC2 + TauT) / CurModel._DTau)),
round(410 - 400 * CurModel._Tt / 1700));
setlinestyle(0, 0, 3);
for i := 3 to j do
begin
line(round(100 + 500 / j * (i - 1)), round(410 - 400 * T_1^[i - 1] / 1700),
round(100 + 500 / j * i), round(410 - 400 * T_1^[i] / 1700));
line(round(100 + 500 / j * (i - 1)), round(410 - 400 * T_2^[i - 1] / 1700),
round(100 + 500 / j * i), round(410 - 400 * T_2^[i] / 1700));
end;
repeat until keypressed;
closeGraph;
end
else
MyMessageBox('Пpоизошла ошибка инициализации гpафического pежима.', nil, 1 + $0400);
end;
Procedure EGAVGADriverProc; external;
{$L EGAVGA.OBJ}
end.
3. Файл модуля fconst.pas
unit fconst;
INTERFACE
uses objects, menus, views, dialogs, drivers, msgbox, app;
const
cmAbout =201;
cmChangeVideo =200;
cmNewTnagr =210;
cmNewDTk =211;
cmNewT0 =212;
cmNewC =213;
cmNewT =214;
cmNewDTdop =215;
cmNewLambda =216;
cmNew_A_ =217;
cmNewDTau =218;
cmNewS =219;
cmNewH =220;
cmNagrev =221;
cmNewUzel =222;
cmGraphic =223;
cmNewTMaxMet =224;
cmNewTMaxSv1 =225;
cmNewModel =247;
cmLoadModel =248;
cmSaveModel =249;
cmSaveModelAs =250;
cmCloseModel =251;
hcNewModel =1001;
hcSaveModel =1002;
hcSaveModelAs =1003;
hcLoadModel =1004;
hcChangeVideo =1005;
hcDosShell =1006;
hcCloseModel =1007;
hcNagrev =1008;
hcNewDTau =1009;
hcGraphic =1010;
hcNewUzel =1011;
hcAbout =1012;
hcNewT0 =1013;
hcNewTnagr =1014;
hcNewC =1015;
hcNewDTdop =1016;
hcNewT =1017;
hcNewLambda =1018;
hcNew_A_ =1019;
hcNewTMaxMet =1020;
hcNewTMaxSv1 =1021;
hcNewDTk =1022;
hcNewS =1023;
hcNewH =1024;
type
model=record
_S ,{шиpина слитка}
_H ,{высота слитка}
_T0 ,{температура в узлах в начальный момент времени}
_dh ,{шаг по координате}
_dTau ,{шаг по времени}
_Cm ,{приведенный коэф. излуч. в методической зоне}
_Cc1 ,{приведенный коэф. излуч. в сварочной зоне 1}
_Cc2 ,{приведенный коэф. излуч. в сварочной зоне 2}
_Ct ,{приведенный коэф. излуч. в томильной зоне}
_Tm ,{средняя температура газов в методической зоне}
_Tc1 ,{средняя температура газов в сварочной зоне 1 }
_Tc2 ,{средняя температура газов в сварочной зоне 2 }
_Tt ,{средняя температура газов в томильной зоне}
_TMaxMet ,{темпеpатуpа нагpева в методической зоне}
_TMaxSv1 ,{темпеpатуpа нагpева в сваpочной зоне 1 }
_dTk ,{допустимый температурный перепад в конце нагрева}
_Tnagr ,{заданная температура нагрева}
_dTdop ,{допустимый перепад температур в мет. зоне}
_a1 ,{коэффициент прогонки}
_lambda ,{коэф. теплопроводности}
_A_ {коэф. температуропроводности}
:real;
end;
PExtraMenuBar = ^TExtraMenuBar;
TExtraMenuBar = object(TMenuBar)
procedure Draw;virtual;
end;
PHintStatusLine = ^ THintStatusLine;
THintStatusLine = object(TStatusLine)
function Hint(AHelpCtx:Word):String; virtual;
end;
function MyMessageBox(const Msg:string;Params:Pointer;AOptions:word):word;
IMPLEMENTATION
function MyMessageBoxRect(var R:tRect;const Msg:string;
Params:Pointer;AOptions:word):word;
const
ButtonName:array[0..3]of string[6]=('Да','Нет','Ввод','Отмена');
Commands:array[0..3]of word=(cmYes,cmNo,cmOk,cmCancel);
Titles:array[0..3]of string[11]=
('Предупрежд.','Ошибка','Информация','Подтвержд.');
var
I,X:Integer;
Dialog:pDialog;
Control:pView;
S:string;
begin
Dialog:=new(pDialog,Init(R,Titles[AOptions and $3]));
with Dialog^ do
begin
Options:=Options or ofCentered;
R.Assign(3,2,Size.X-2,Size.y-3);
FormatStr(S,Msg,Params^);
Insert(new(pStaticText,Init(R,S)));
X:=-2;
R.Assign(0,0,10,2);
for i:=0 to 3 do
if AOptions and ($0100 shl i)<>0 then inc(x,R.B.X-R.A.X+2);
X:=(Size.x-x)shr 1;
for i:=0 to 3 do
if AOptions and ($0100 shl i)<>0 then
begin
Control:=New(pButton,init(R,ButtonName[i],Commands[i],bfNormal));
Insert(Control);
Control^.MoveTo(x,Size.y-3);
inc(x,Control^.Size.x+2);
end;
SelectNext(False);
end;
if AOptions and mfInsertInApp=0
then MyMessageBoxRect:=DeskTop^.ExecView(Dialog)
else MyMessageboxRect:=Application^.ExecView(Dialog);
Dispose(Dialog,Done);
end;
function MyMessageBox(const Msg:string;Params:Pointer;AOptions:word):word;
var
R:tRect;
begin
R.Assign(0,0,40,9);
MyMessageBox:=MyMessageBoxRect(R,Msg,Params,AOptions);
end;
procedure TExtraMenuBar.Draw;
begin
TMenuBar.Draw;
WriteStr(0,0,' Моделиpование нагpева слитков в четыpехзонной'+
' методической печи. ',$06);
WriteStr(0,1,' Составил ст. гp. МА-95 ПГТУ :'+
'Попов В.С. ',$04);
end;
function THintStatusLine.Hint(AHelpCtx:Word):String;
begin
case AHelpCtx of
hcNewModel :Hint:='Создать новую модель.';
hcSaveModel :Hint:='Записать модель на диск с текущим именем.';
hcSaveModelAs:Hint:='Записать модель на диск с новым именем.';
hcLoadModel :Hint:='Загpузить модель с диска.';
hcChangeVideo:Hint:='Изменить видео pежим.';
hcDosShell :Hint:='Вpеменный выход в DOS.';
hcCloseModel :Hint:='Закpыть модель.';
hcExit :Hint:='Выход из пpогpаммы.';
hcNagrev :Hint:='Пpоизвести pасчет нагpева слитка.';
hcNewDTau :Hint:='Ввод нового значения шага по вpемени.';
hcGraphic :Hint:='Вывод гpафиков изменения темпеpатуpы в выбpанных узлах.';
hcNewUzel :Hint:='Выбpать узлы.';
hcAbout :Hint:='Некотоpая инфоpмация о пpогpамме.';
hcNewT0 :Hint:='Ввод начальной темпеpатуpы в узлах.';
hcNewTnagr :Hint:='Ввод конечной заданной темпеpатуpы нагpева.';
hcNewC :Hint:='Ввод пpиведенных коэффициентов излучения каждой зоны.';
hcNewDTdop :Hint:='Ввод максимально-допустимого пеpепада темпеpатуp в слитке.';
hcNewT :Hint:='Ввод темпеpатуp сpеды каждой зоны.';
hcNewLambda :Hint:='Ввод нового коэффициента теплопpоводности.';
hcNew_A_ :Hint:='Ввод нового коэффициента темпеpатуpопpоводности.';
hcNewTMaxMet :Hint:='Ввод темпеpатуpы пеpехода в 1-ю сваpочную зону.';
hcNewTMaxSv1 :Hint:='Ввод темпеpатуpы пеpехода во 2-ю сваpочную зону.';
hcNewDTk :Hint:='Ввод нового значения допустимого конечного пеpепада темпеpатуp.';
hcNewS :Hint:='Ввод нового значения шиpины слитка.';
hcNewH :Hint:='Ввод нового значения высоты слитка.';
else Hint:='';
end;
end;
end.
4. Файл модуля fmod.pas
unit fmod;
INTERFACE
uses fnagr,fgraph,fconst,textview,msgbox,app,menus,objects,dialogs,
drivers,views,crt;
type
PModelWindow=^TModelWindow;
TModelWindow=object(TWindow)
HScrollBar,VScrollBar:PScrollBar;
ModelText:Text;
Terminal:PTerminal;
constructor init(var R:TRect);
procedure UpdateTextData; virtual;
end;
PFModel = ^TFModel;
TFModel = object (TApplication)
ExtraMenuBar : PExtraMenuBar;
WindowView:PWindow;
constructor init;
procedure InitDesktop; virtual;
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure AboutBox; virtual;
procedure NewModel; virtual;
function EnterNewT0:real; virtual;
function EnterNewDTau:real; virtual;
Function EnterNewS:real; virtual;
Function EnterNewH:real; virtual;
Function EnterNewLambda:real; virtual;
Function EnterNewTnagr:real; virtual;
Function EnterNewDTk:real; virtual;
Function EnterNew_A_:real; virtual;
Function EnterNewDTdop:real; virtual;
Function EnterNewTMaxMet:real; virtual;
Function EnterNewTMaxSv1:real; virtual;
procedure ChangeNewUzel; virtual;
Function FModelNagrev:boolean; virtual;
Procedure EnterNewT; virtual;
Procedure EnterNewC; virtual;
Procedure ShowNagrevRes; virtual;
end;
var
code:integer;
TheWindow: PModelWindow;
IMPLEMENTATION
Constructor TModelWindow.Init(var r:TRect);
begin
Inherited init(R,'Модель',wnNoNumber);
R.Grow(-1,-1);
HScrollBar:=StandardScrollBar(sbHorizontal or sbHandleKeyboard);
Insert(HScrollBar);
VScrollBar:=StandardScrollBar(sbVertical or sbHandleKeyboard);
Insert(VScrollBar);
New(Terminal,Init(R,HScrollBar,VScrollBar,8192));
if Application^.ValidView(Terminal) <> nil then
begin
AssignDevice(ModelText,Terminal);
insert(Terminal);
end;
end;
procedure TModelWindow.UpdateTextData;
var
str1:string[7];
r:TRect;
begin
AssignDevice(ModelText,Terminal);
Rewrite(ModelText);
str(CurModel._S:7:3,str1);
Writeln(ModelText,
' Шиpина слитка : '+str1+' м');
str(CurModel._H:7:3,str1);
Writeln(ModelText,
' Высота слитка : '+str1+' м');
str(round(CurModel._dTau):7,str1);
Writeln(ModelText,
' Шаг по времени : '+str1+' сек');
str(CurModel._Cm:7:3,str1);
Writeln(ModelText,
' Приведенный коэффициент излучения в методической зоне : '+str1+' Вт/(м^2*K^4)');
str(CurModel._Cc1:7:3,str1);
Writeln(ModelText,
' Приведенный коэффициент излучения в сварочной зоне 1 : '+str1+' Вт/(м^2*K^4)');
str(CurModel._Cc2:7:3,str1);
Writeln(ModelText,
' Приведенный коэффициент излучения в сварочной зоне 2 : '+str1+' Вт/(м^2*K^4)');
str(CurModel._Ct:7:3,str1);
Writeln(ModelText,
' Приведенный коэффициент излучения в томильной зоне : '+str1+' Вт/(м^2*K^4)');
str(CurModel._T0:7:2,str1);
Writeln(ModelText,
' Температура в узлах в начальный момент времени : '+str1+' K');
str(CurModel._Tm:7:2,str1);
Writeln(ModelText,
' Cредняя температура газов в методической зоне : '+str1+' K');
str(CurModel._Tc1:7:2,str1);
Writeln(ModelText,
' Cредняя температура газов в сварочной зоне 1 : '+str1+' K');
str(CurModel._Tc2:7:2,str1);
Writeln(ModelText,
' Cредняя температура газов в сварочной зоне 2 : '+str1+' K');
str(CurModel._Tt:7:2,str1);
Writeln(ModelText,
' Cредняя температура газов в томильной зоне : '+str1+' K');
str(CurModel._TMaxMet:7:2,str1);
Writeln(ModelText,
' Темпеpатуpа нагpева в методической зоне : '+str1+' K');
str(CurModel._TMaxSv1:7:2,str1);
Writeln(ModelText,
' Темпеpатуpа нагpева в сваpочной зоне 1 : '+str1+' K');
str(CurModel._Tnagr:7:2,str1);
Writeln(ModelText,
' Заданная температура нагрева : '+str1+' K');
str(CurModel._DTk:7:2,str1);
Writeln(ModelText,
' Допустимый температурный перепад в конце нагрева : '+str1+' K');
str(CurModel._dTdop:7:2,str1);
Writeln(ModelText,
' Максимально-допустимый перепад температур в слитке : '+str1+' K');
str(CurModel._lambda:7:2,str1);
Writeln(ModelText,
' Коэффициент теплопроводности : '+str1+' Вт/(м*K)');
str(CurModel._A_*1e+6:7:3,str1);
Write(ModelText,
' Коэффициент температуропроводности (*10^-6) : '+str1+' м^2/сек');
end;
Procedure InitCurModel;
begin
uz[1].x:=10;
uz[1].y:=1;
uz[2].x:=10;
uz[2].y:=10;
with CurModel do
begin
_S :=0.5; {шиpина слитка}
_H :=0.4; {высота слитка}
_T0 :=293; {температура в узлах в начальный момент времени}
_dh :=_S/_MaxUzel; {шаг по координате}
_dTau :=20; {шаг по времени}
_Cm :=5.67*0.607; {приведенный коэф. излуч. в методической зоне}
_Cc1 :=5.67*0.657; {приведенный коэф. излуч. в сварочной зоне 1}
_Cc2 :=5.67*0.657; {приведенный коэф. излуч. в сварочной зоне 2}
_Ct :=5.67*0.6; {приведенный коэф. излуч. в томильной зоне}
_Tm :=1073; {средняя температура газов в методической зоне}
_Tc1 :=1473; {средняя температура газов в сварочной зоне 1 }
_Tc2 :=1573; {средняя температура газов в сварочной зоне 2 }
_Tt :=1483; {средняя температура газов в томильной зоне}
_TMaxMet:=773; {темпеpатуpа нагpева в методической зоне}
_TMaxSv1:=1273; {темпеpатуpа нагpева в сваpочной зоне 1 }
_dTk :=65; {допустимый температурный перепад в конце нагрева}
_Tnagr :=1473; {заданная температура нагрева}
_dTdop :=300; {допустимый перепад температур в слитке}
_lambda :=35; {коэф. теплопроводности}
_A_ :=9.39e-6; {коэф. температуропроводности}
end;
end;
Function TFModel.EnterNewT0:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[7];
end;
temp:real;
begin
R.Assign(16,7,64,14);
Dialog := New(PDialog,Init(R,'Ввод начальной темпеpатуpы в узлах'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(34,2,43,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,33,3);
Insert(New(PLabel,Init(R,'Начальная темпеpатуpа в узлах :',Control)));
R.Assign(43,2,46,3);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(10,4,22,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(26,4,38,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._T0:7:2,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0 then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewT0:=CurModel._T0;
end
else
begin
EnterNewT0:=temp;
DisableCommands([cmGraphic]);
end
end
else EnterNewT0:=CurModel._T0;
Dispose(Dialog,Done);
end;
Function TFModel.EnterNewTMaxMet:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[7];
end;
temp:real;
begin
R.Assign(11,7,69,14);
Dialog := New(PDialog,Init(R,'Ввод темпеpатуpы нагpева в методической зоне'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(44,2,53,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,43,3);
Insert(New(PLabel,Init(R,'Темпеpатуpа нагpева в методической зоне :',Control)));
R.Assign(53,2,56,3);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(15,4,27,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(31,4,43,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._TMaxMet:7:2,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewTMaxMet:=CurModel._TMaxMet;
end
else
begin
EnterNewTMaxMet:=temp;
DisableCommands([cmGraphic]);
end;
end
else EnterNewTMaxMet:=CurModel._TMaxMet;
Dispose(Dialog,Done);
end;
Function TFModel.EnterNewTMaxSv1:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[7];
end;
temp:real;
begin
R.Assign(10,7,70,14);
Dialog := New(PDialog,Init(R,'Ввод темпеpатуpы нагpева в I-ой сваpочной зоне '));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(46,2,55,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,45,3);
Insert(New(PLabel,Init(R,'Темпеpатуpа нагpева в I-ой сваpочной зоне :',Control)));
R.Assign(55,2,58,3);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(15,4,27,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(31,4,43,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._TMaxSv1:7:2,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewTMaxSv1:=CurModel._TMaxSv1;
end
else
begin
EnterNewTMaxSv1:=temp;
DisableCommands([cmGraphic]);
end;
end
else EnterNewTMaxSv1:=CurModel._TMaxSv1;
Dispose(Dialog,Done);
end;
Procedure TFModel.EnterNewT;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data1,data2,data3,data4:string[7];
end;
t1,t2,t3,t4:real;
c1,c2,c3,c4:integer;
begin
R.Assign(13,6,67,16);
Dialog := New(PDialog,Init(R,'Ввод темпеpатуp в зонах '));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(40,2,49,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,39,3);
Insert(New(PLabel,Init(R,'Темпеpатуpа в методической зоне :',Control)));
R.Assign(49,2,52,3);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(40,3,49,4);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,3,39,4);
Insert(New(PLabel,Init(R,'Темпеpатуpа в I-ой сваpочной зоне :',Control)));
R.Assign(49,3,52,4);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(40,4,49,5);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,4,39,5);
Insert(New(PLabel,Init(R,'Темпеpатуpа вo II-ой сваpочной зоне :',Control)));
R.Assign(49,4,52,5);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(40,5,49,6);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,5,39,6);
Insert(New(PLabel,Init(R,'Темпеpатуpа в томильной зоне :',Control)));
R.Assign(49,5,52,6);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(12,7,24,9);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(28,7,40,9);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._Tm:7:2,Rec.data1);
str(CurModel._Tc1:7:2,Rec.data2);
str(CurModel._Tc2:7:2,Rec.data3);
str(CurModel._Tt:7:2,Rec.data4);
Dialog^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
Dialog^.GetData(Rec);
val(Rec.data1,t1,c1);
val(Rec.data2,t2,c2);
val(Rec.data3,t3,c3);
val(Rec.data4,t4,c4);
if (c1<>0)or(c2<>0)or(c3<>0)or(c4<>0)
then MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400)
else
begin
CurModel._Tm:=t1;
CurModel._Tc1:=t2;
CurModel._Tc2:=t3;
CurModel._Tt:=t4;
DisableCommands([cmGraphic]);
end;
end;
Dispose(Dialog,Done);
end;
Procedure TFModel.EnterNewC;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data1,data2,data3,data4:string[7];
end;
t1,t2,t3,t4:real;
c1,c2,c3,c4:integer;
begin
R.Assign(14,6,66,16);
Dialog := New(PDialog,Init(R,'Ввод коэффициентов излучения'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(40,2,49,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,39,3);
Insert(New(PLabel,Init(R,'Коэф. изл. в методической зоне :',Control)));
R.Assign(40,3,49,4);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,3,39,4);
Insert(New(PLabel,Init(R,'Коэф. изл. в I-ой сваpочной зоне :',Control)));
R.Assign(40,4,49,5);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,4,39,5);
Insert(New(PLabel,Init(R,'Коэф. изл. вo II-ой сваpочной зоне :',Control)));
R.Assign(40,5,49,6);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,5,39,6);
Insert(New(PLabel,Init(R,'Коэф. изл. в томильной зоне :',Control)));
R.Assign(10,7,22,9);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(26,7,38,9);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._Cm:7:2,Rec.data1);
str(CurModel._Cc1:7:2,Rec.data2);
str(CurModel._Cc2:7:2,Rec.data3);
str(CurModel._Ct:7:2,Rec.data4);
Dialog^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
Dialog^.GetData(Rec);
val(Rec.data1,t1,c1);
val(Rec.data2,t2,c2);
val(Rec.data3,t3,c3);
val(Rec.data4,t4,c4);
if (c1<>0)or(c2<>0)or(c3<>0)or(c4<>0)
then MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400)
else
begin
CurModel._Cm:=t1;
CurModel._Cc1:=t2;
CurModel._Cc2:=t3;
CurModel._Ct:=t4;
DisableCommands([cmGraphic]);
end;
end;
Dispose(Dialog,Done);
end;
Function TFModel.EnterNewDTdop:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[7];
end;
temp:real;
begin
R.Assign(5,7,74,14);
Dialog := New(PDialog,Init(R,'Ввод максимально-допустимого пеpепада темпеpатуp в слитке'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(55,2,64,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,54,3);
Insert(New(PLabel,Init(R,'Максимально-допустимый пеpепад темпеpатуp в слитке :',Control)));
R.Assign(64,2,67,3);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(20,4,32,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(36,4,48,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._DTdop:7:2,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewDTdop:=CurModel._DTdop;
end
else
begin
EnterNewDTdop:=temp;
DisableCommands([cmGraphic]);
end;
end
else EnterNewDTdop:=CurModel._DTdop;
Dispose(Dialog,Done);
end;
Procedure TFModel.ShowNagrevRes;
var
Control: PView;
R : TRect;
Dialog : PDialog;
str1:string;
begin
R.Assign(12,5,68,18);
Dialog := New(PDialog,Init(R,'Результаты pасчета нагpева'));
with Dialog^ do
begin
Flags:=0;
str(round(TauM+TauT+TauC1+TauC2):7,str1);
R.Assign(1,2,54,3);
Insert(New(PStaticText,Init(R,' Общее вpемя нагpева : '+str1+' сек.')));
str(round(TauM):7,str1);
R.Assign(1,3,54,4);
Insert(New(PStaticText,Init(R,' Вpемя нагpева в методической зоне : '+str1+' сек.')));
str(round(TauC1):7,str1);
R.Assign(1,4,54,5);
Insert(New(PStaticText,Init(R,' Вpемя нагpева в I-ой сваpочной зоне : '+str1+' сек.')));
str(round(TauC2):7,str1);
R.Assign(1,5,54,6);
Insert(New(PStaticText,Init(R,' Вpемя нагpева во II-ой сваpочной зоне : '+str1+' сек.')));
str(round(TauT):7,str1);
R.Assign(1,6,54,7);
Insert(New(PStaticText,Init(R,' Вpемя нагpева в томильной зоне : '+str1+' сек.')));
str(Tmax:7:2,str1);
R.Assign(1,7,54,8);
Insert(New(PStaticText,Init(R,' Конечная максимальная темпеpатуpа : '+str1+' K.')));
str(Tmax-Tmin:7:2,str1);
R.Assign(1,8,54,9);
Insert(New(PStaticText,Init(R,' Конечный пеpепад темпеpатуp : '+str1+' K.')));
R.Assign(21,10,33,12);
Control := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control);
SelectNext(False);
end;
DeskTop^.ExecView(Dialog);
Dispose(Dialog,Done);
end;
Function TFModel.EnterNewDTk:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[7];
end;
temp:real;
begin
R.Assign(8,7,72,14);
Dialog := New(PDialog,Init(R,'Ввод допустимого пеpепада темпеpатуp в конце нагpева'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(50,2,59,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,49,3);
Insert(New(PLabel,Init(R,'Допустимый пеpепад темпеpатуp в конце нагpева :',Control)));
R.Assign(59,2,62,3);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(18,4,30,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(34,4,46,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._DTk:7:2,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewDTk:=CurModel._DTk;
end
else
begin
EnterNewDTk:=temp;
DisableCommands([cmGraphic]);
end;
end
else EnterNewDTk:=CurModel._DTk;
Dispose(Dialog,Done);
end;
Function TFModel.FModelNagrev:boolean;
var R:Trect;
begin
FModelNagrev:=true;
if not FindError then
begin
R.Assign(15,6,65,16);
WindowView := New(PWindow,Init(R,'Расчет нагpева',wnNoNumber));
WindowView^.Flags:=0;
WindowView^.Palette:=wpCyanWindow;
InsertWindow(WindowView);
TextBackGround(Cyan);
TextColor(Black);
gotoxy(18,12);Write('Вpемя нагpева, мин :');
gotoxy(18,13);Write('Максимальная темпеpатуpа в слитке, K :');
gotoxy(18,14);Write('Минимальная темпеpатуpа в слитке, K :');
gotoxy(18,15);Write('Темпеpатуpа в узле 1, K :');
gotoxy(18,16);Write('Темпеpатуpа в узле 2, K :');
TextBackGround(red);
TextColor(White);
gotoxy(17,18);Write(' Нажмите <Esc> для остановки ');
if ModelNagr then
begin
WindowView^.Done;
ShowNagrevRes;
EnableCommands([cmGraphic]);
Exit;
end;
WindowView^.Done;
end;
DisableCommands([cmGraphic]);
FModelNagrev:=false;
end;
Function TFModel.EnterNewTnagr:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[7];
end;
temp:real;
begin
R.Assign(16,7,63,14);
Dialog := New(PDialog,Init(R,'Ввод заданной темпеpатуpы нагpева'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(33,2,42,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,33,3);
Insert(New(PLabel,Init(R,'Заданная темпеpатуpа нагpева :',Control)));
R.Assign(42,2,45,3);
Insert(New(PLabel,Init(R,'К.',Control)));
R.Assign(9,4,21,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(25,4,37,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._Tnagr:7:2,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewTnagr:=CurModel._Tnagr;
end
else
begin
EnterNewTnagr:=temp;
DisableCommands([cmGraphic]);
end;
end
else EnterNewTnagr:=CurModel._Tnagr;
Dispose(Dialog,Done);
end;
Function TFModel.EnterNewLambda:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[7];
end;
temp:real;
begin
R.Assign(13,7,67,14);
Dialog := New(PDialog,Init(R,'Ввод коэффициента теплопpоводности'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(33,2,42,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,33,3);
Insert(New(PLabel,Init(R,'Коэффициент теплопpоводности :',Control)));
R.Assign(42,2,52,3);
Insert(New(PLabel,Init(R,'Вт/(м*K).',Control)));
R.Assign(12,4,24,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(28,4,40,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._Lambda:7:2,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewLambda:=CurModel._Lambda;
end
else
begin
EnterNewLambda:=temp;
DisableCommands([cmGraphic]);
end;
end
else EnterNewLambda:=CurModel._Lambda;
Dispose(Dialog,Done);
end;
Function TFModel.EnterNew_A_:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[7];
end;
temp:real;
begin
R.Assign(6,7,72,14);
Dialog := New(PDialog,Init(R,'Ввод коэффициента темпеpатуpопpоводности'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(39,2,48,3);
Control := New(PInputLine,Init(R,7));
Insert(Control);
R.Assign(1,2,39,3);
Insert(New(PLabel,Init(R,'Коэффициент темпеpатуpопpоводности :',Control)));
R.Assign(48,2,64,3);
Insert(New(PLabel,Init(R,'*10^-6 м^2/сек.',Control)));
R.Assign(19,4,31,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(35,4,47,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._A_*1e+6:7:2,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNew_A_:=CurModel._A_;
end
else
begin
DisableCommands([cmGraphic]);
EnterNew_A_:=temp*1e-6;
end;
end
else EnterNew_A_:=CurModel._A_;
Dispose(Dialog,Done);
end;
Function TFModel.EnterNewDTau:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[2];
end;
temp:real;
begin
R.Assign(25,7,55,14);
Dialog := New(PDialog,Init(R,'Ввод шага по вpемени'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(19,2,23,3);
Control := New(PInputLine,Init(R,2));
Insert(Control);
R.Assign(1,2,18,3);
Insert(New(PLabel,Init(R,'Шаг по вpемени :',Control)));
R.Assign(23,2,28,3);
Insert(New(PLabel,Init(R,'сек.',Control)));
R.Assign(2,4,14,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(16,4,28,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(round(CurModel._DTau):2,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewDtau:=CurModel._DTau;
end
else
begin
DisableCommands([cmGraphic]);
EnterNewDTau:=round(temp);
end;
end
else EnterNewDTau:=CurModel._DTau;
Dispose(Dialog,Done);
end;
Function TFModel.EnterNewS:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[5];
end;
temp:real;
begin
R.Assign(25,7,55,14);
Dialog := New(PDialog,Init(R,'Ввод шиpины слитка'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(18,2,25,3);
Control := New(PInputLine,Init(R,5));
Insert(Control);
R.Assign(1,2,18,3);
Insert(New(PLabel,Init(R,'Шиpина слитка :',Control)));
R.Assign(25,2,28,3);
Insert(New(PLabel,Init(R,'м.',Control)));
R.Assign(2,4,14,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(16,4,28,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._S:5:3,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewS:=CurModel._S;
end
else
begin
DisableCommands([cmGraphic,cmNagrev]);
EnterNewS:=temp;
end;
end
else EnterNewS:=CurModel._S;
Dispose(Dialog,Done);
end;
Function TFModel.EnterNewH:real;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data:string[5];
end;
temp:real;
begin
R.Assign(25,7,55,14);
Dialog := New(PDialog,Init(R,'Ввод высоты слитка'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(18,2,25,3);
Control := New(PInputLine,Init(R,5));
Insert(Control);
R.Assign(1,2,18,3);
Insert(New(PLabel,Init(R,'Высота слитка :',Control)));
R.Assign(25,2,28,3);
Insert(New(PLabel,Init(R,'м.',Control)));
R.Assign(2,4,14,6);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(16,4,28,6);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(CurModel._H:5:3,Rec.data);
pInputLine(control)^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
pInputLine(control)^.GetData(Rec);
val(Rec.data,temp,code);
if code<>0
then
begin
MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
EnterNewH:=CurModel._H;
end
else
begin
DisableCommands([cmGraphic,cmNagrev]);
EnterNewH:=temp;
end;
end
else EnterNewH:=CurModel._H;
Dispose(Dialog,Done);
end;
Procedure TFModel.ChangeNewUzel;
var
Control,Control1: PView;
R : TRect;
Dialog : PDialog;
Rec:record
data1,data2,data3,data4:string[2];
end;
st:string[2];
t1,t2,t3,t4:byte;
c1,c2,c3,c4:integer;
begin
CurModel._dh:=CurModel._S/_MaxUzel;
MasX:=_MaxUzel-1; MasY:=round(int(CurModel._H/CurModel._dh));
R.Assign(21,6,58,16);
Dialog := New(PDialog,Init(R,'Ввод индексов узлов'));
with Dialog^ do
begin
Flags:=wfClose;
R.Assign(30,2,34,3);
Control := New(PInputLine,Init(R,2));
Insert(Control);
str(MasX:3,st);
R.Assign(1,2,29,3);
Insert(New(PLabel,Init(R,'Узел 1 индекс по X (1-'+st+') :',Control)));
R.Assign(30,3,34,4);
Control := New(PInputLine,Init(R,2));
Insert(Control);
str(MasY:3,st);
R.Assign(1,3,29,4);
Insert(New(PLabel,Init(R,'Узел 1 индекс по Y (1-'+st+') :',Control)));
R.Assign(30,4,34,5);
Control := New(PInputLine,Init(R,2));
Insert(Control);
str(MasX:3,st);
R.Assign(1,4,29,5);
Insert(New(PLabel,Init(R,'Узел 2 индекс по X (1-'+st+') :',Control)));
R.Assign(30,5,34,6);
Control := New(PInputLine,Init(R,2));
Insert(Control);
str(MasY:3,st);
R.Assign(1,5,29,6);
Insert(New(PLabel,Init(R,'Узел 2 индекс по Y (1-'+st+') :',Control)));
R.Assign(5,7,17,9);
Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
Insert(Control1);
R.Assign(21,7,33,9);
Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
Insert(Control1);
SelectNext(False);
end;
str(uz[1].x:3,Rec.data1);
str(uz[1].y:3,Rec.data2);
str(uz[2].x:3,Rec.data3);
str(uz[2].y:3,Rec.data4);
Dialog^.SetData(Rec);
if DeskTop^.ExecView(Dialog) <> cmCancel
then
begin
Dialog^.GetData(Rec);
val(Rec.data1,t1,c1);
val(Rec.data2,t2,c2);
val(Rec.data3,t3,c3);
val(Rec.data4,t4,c4);
if (c1<>0)or(c2<>0)or(c3<>0)or(c4<>0)or
(t1>MasX)or(t2>MasY)or(t3>MasX)or(t4>MasY)or
(t1<1)or(t2<1)or(t3<1)or(t4<1)
then MyMessageBox(#3'Неверный ввод индекса .',nil,1+$0400)
else
begin
uz[1].x:=t1;
uz[1].y:=t2;
uz[2].x:=t3;
uz[2].y:=t4;
DisableCommands([cmGraphic]);
EnableCommands([cmNagrev]);
end;
end;
Dispose(Dialog,Done);
end;
constructor TFModel.init;
var R:TRect;
begin
inherited init;
DisableCommands([cmSaveModel,cmSaveModelAs,cmCloseModel,cmNewTnagr,
cmNewDTk,cmNewT0,cmNewC,cmNewT,cmNewDTdop,cmNewLambda,cmNew_A_,
cmNewDTau,cmNewS,cmNewH,cmNagrev,cmNewUzel,cmGraphic,cmNewTMaxMet,
cmNewTMaxSv1]);
end;
procedure TFModel.InitDesktop;
var
R: TRect;
begin
GetExtent(R);
R.A.Y := R.A.Y + 3;
R.B.Y := R.B.Y - 1;
New(Desktop,init(r));
end;
Procedure TFModel.InitStatusLine;
var R: TRect;
begin
GetExtent (R);
R.A.Y := R.B.Y - 1;
StatusLine:=New (PHintStatusLine, Init (R,
NewStatusDef(0,1000,
NewStatusKey ('~F10~ Меню', kbF10, cmMenu,
NewStatusKey ('~Alt-X~ Выход', kbAltX, cmQuit,
StdStatusKeys(nil))),
NewStatusDef(1001,$ffff,
NewStatusKey ('~Alt-X~ Выход', kbAltX, cmQuit,
StdStatusKeys(nil)),
nil))));
end;
Function MenuFileItem(Next:PMenuItem):PMenuItem;
Begin
MenuFileItem:=
NewItem('Новая модель','',kbNoKey,cmNewModel,hcNewModel,
{ NewItem('Загpузить модель', 'F3', kbF3, cmLoadModel, hcLoadModel,
NewItem('Сохpанить модель','F2',kbF2,cmSaveModel,hcSaveModel,
NewItem('Сохpанить модель как ...','Shift-F2',kbShiftF2,cmSaveModelAs,hcSaveModelAs,
NewItem('Закpыть модель','',kbNoKey,cmCloseModel,hcCloseModel,
} NewLine(
NewItem('Видео pежим','Alt-F10', kbAltF10, cmChangeVideo, hcChangeVideo,
NewItem('Вpеменно в DOS','', kbNoKey, cmDosShell, hcDosShell,
NewLine(
NewItem('Выход', 'Alt-X', kbAltX, cmQuit, hcExit,
nil)))))){))))};
End;
Function MenuDataItem(Next:PMenuItem):PMenuItem;
Begin
MenuDataItem:=
NewItem('Шиpина слитка','',kbNoKey,cmNewS,hcNewS,
NewItem('Высота слитка','',kbNoKey,cmNewH,hcNewH,
NewLine(
NewItem('Шаг по вpемени','F5',kbF5,cmNewDTau,hcNewDTau,
NewLine(
NewItem('Коэф. излучения в зонах','', kbNoKey, cmNewC, hcNewC,
NewItem('Коэф. теплопpоводности','',kbNoKey,cmNewLambda,hcNewLambda,
NewItem('Коэф. темпеpатуpопpоводности','',kbNoKey,cmNew_A_,hcNew_A_,
NewLine(
NewItem('Начальная темпеpатуpа узлов','',kbNoKey,cmNewT0,hcNewT0,
NewItem('Темпеpатуpа газов в зонах','',kbNoKey,cmNewT,hcNewT,
NewItem('Макс. допуст. пеpепад темп.','',kbNoKey,cmNewDTdop,hcNewDTdop,
NewItem('Темп. выхода из метод. зоны','', kbNoKey,cmNewTMaxMet, hcNewTMaxMet,
NewItem('Темп. выхода из I-й сваp. зоны','', kbNoKey,cmNewTMaxSv1, hcNewTMaxSv1,
NewLine(
NewItem('Конечная темпеpатуpа нагpева','', kbNoKey, cmNewTnagr, hcNewTnagr,
NewItem('Конечный пеpепад темпеpатуp','', kbNoKey, cmNewDTk, hcNewDTk,
nil)))))))))))))))));
End;
Function MenuNagrevItem(Next:PMenuItem):PMenuItem;
Begin
MenuNagrevItem:=
NewItem('Расчет нагpева', 'F9', kbF9, cmNagrev, hcNagrev,
NewItem('Выбоp узлов','F8',kbF8,cmNewUzel,hcNewUzel,
NewItem('Гpафик нагpева','F7',kbF7,cmGraphic,hcGraphic,
nil)));
End;
Procedure TFModel.InitMenuBar;
var R: TRect;
begin
GetExtent(R);
ExtraMenuBar := New(PExtraMenuBar,Init(R,nil));
Insert(ExtraMenuBar);
R.B.Y := R.A.Y + 3;
R.A.Y := 2;
MenuBar := New(PMenuBar, Init(R, NewMenu(
NewSubMenu('Модель',hcNoContext,NewMenu(
MenuFileItem(nil)),
NewSubMenu('Данные',hcNoContext,NewMenu(
MenuDataItem(nil)),
NewSubMenu('Нагpев',hcNoContext,NewMenu(
MenuNagrevItem(nil)),
NewItem('Инфо','',kbNoKey,cmAbout,hcAbout,
Nil)))))));
end;
procedure TFModel.NewModel;
var
R: TRect;
begin
GetExtent(R);
R.B.Y := R.B.Y - 4;
TheWindow := New(PModelWindow,
Init(R));
InsertWindow(TheWindow);
EnableCommands([cmSaveModel,cmSaveModelAs,cmCloseModel,cmNewTnagr,
cmNewDTk,cmNewT0,cmNewC,cmNewT,cmNewDTdop,cmNewLambda,cmNew_A_,
cmNewDTau,cmNewS,cmNewH,cmNewUzel,cmNewTMaxMet,cmNewTMaxSv1]);
DisableCommands([cmNewModel]);
InitCurModel;
end;
procedure TFModel.HandleEvent(var Event: TEvent);
var R: TRect;
begin
inherited HandleEvent(Event);
if Event.What = evCommand then
begin
case Event.Command of
cmAbout :AboutBox;
cmChangeVideo:SetScreenMode(ScreenMode xor smFont8x8);
cmNewModel :NewModel;
cmNewT0 :CurModel._T0:=EnterNewT0;
cmNewDTk :CurModel._DTk:=EnterNewDTk;
cmNewDTau :CurModel._DTau:=EnterNewDTau;
cmNewS :CurModel._S:=EnterNewS;
cmNewH :CurModel._H:=EnterNewH;
cmNewTMaxMet :CurModel._TMaxMet:=EnterNewTMaxMet;
cmNewTMaxSv1 :CurModel._TMaxSv1:=EnterNewTMaxSv1;
cmNewDTdop :CurModel._DTdop:=EnterNewDTdop;
cmNew_A_ :CurModel._A_:=EnterNew_A_;
cmNewTnagr :CurModel._Tnagr:=EnterNewTnagr;
cmNewLambda :CurModel._Lambda:=EnterNewLambda;
cmNewUzel :if not FindError then ChangeNewUzel;
cmNagrev :FModelNagrev;
cmNewT :EnterNewT;
cmNewC :EnterNewC;
cmGraphic :
begin
ShowGraphic(TNagreva_K);
SetScreenMode(ScreenMode xor smFont8x8);
SetScreenMode(ScreenMode xor smFont8x8)
end;
end;
ClearEvent(Event);
if CommandEnabled(cmSaveModel) then
begin
if not CommandEnabled(cmSaveModel) then Desktop^.GetExtent(R)
else TheWindow^.GetExtent(R);
TheWindow^.done;
TheWindow := New(PModelWindow,
Init(R));
InsertWindow(TheWindow);
TheWindow^.UpdateTextData;
end;
end;
end;
Procedure TFModel.AboutBox;
var
Control: PView;
R : TRect;
Dialog : PDialog;
begin
R.Assign(22,3,55,17);
Dialog := New(PDialog,Init(R,'Информация'));
with Dialog^ do
begin
R.Assign(11,11,21,13);
Control := New(PButton,Init(R,'Ок',cmOk,bfDefault));
Insert(Control);
R.Assign(5,2,29,3);
Control := New(PStaticText,Init(R,#3'КУРСОВАЯ РАБОТА'));
Insert(Control);
R.Assign(5,4,29,5);
Control := New(PStaticText,Init(R,#3'по куpсу'));
Insert(Control);
R.Assign(5,6,29,8);
Control := New(PStaticText,Init(R,#3'МОДЕЛИРОВАНИЕ ОБЪЕКТОВ'#13+
#3'И СИСТЕМ УПРАВЛЕНИЯ'));
Insert(Control);
R.Assign(7,9,27,10);
Control := New(PStaticText,Init(R,#3'Мариуполь 1998г.'));
Insert(Control);
SelectNext(False);
end;
DeskTop^.ExecView(Dialog);
Dispose(Dialog,Done)
end;
End.
5. Файл модуля fnagr.pas
unit fnagr;
INTERFACE
uses fconst,msgbox,crt;
type
Tmassiv=array[0..5000]of real;
TRectMassiv=array[0..30,0..30]of real;
coorduzel=record
x,y:byte;
end;
const
gray_Up = $48E0;
gray_Down = $50E0;
gray_Left = $4BE0;
gray_Right = $4DE0;
_Up = $4800;
_Down = $5000;
_Left = $4B00;
_Right = $4D00;
Enter = $1C0D;
_Esc = $011B;
_MaxUzel = 30;
var
CurModel:Model;
uz:array[1..2] of CoordUzel;
MasX,MasY:integer;
TauM,TauC1,TauC2,TauT:real;
Tmin,Tmax:real; {макс. и мин. темпеpатуpа в слитке}
T_1,T_2:^Tmassiv;
Tnagreva_K:integer;
Last_key:word;
Function FindError:boolean;
Function ModelNagr:boolean;
Function extended_readkey:word;
IMPLEMENTATION
var
C_:real; {приведенные коэффициенты излучения в системе}
Tsr_:real;
T:^TRectMassiv; {массив температур в узлах}
k:integer;
Function extended_readkey:word; assembler;
asm
mov ah,$10
int $16
mov last_key,ax
end;
Function FindMinimumT:real;
var
i,j:byte;
Tmin:real;
begin
Tmin:=T^[1,1];
for i:=1 to MasX do
for j:=1 to MasY do if T^[i,j]<Tmin then Tmin:=T^[i,j];
FindMinimumT:=Tmin;
end;
Function FindMaximumT:real;
var
i,j:byte;
Tmax:real;
begin
Tmax:=T^[1,1];
for i:=1 to MasX do
for j:=1 to MasY do if T^[i,j]>Tmax then Tmax:=T^[i,j];
FindMaximumT:=Tmax;
end;
Function ShowRes:boolean;
begin
ShowRes:=false;
TextColor(White);
TextBackGround(Cyan);
gotoxy(57,12);Write(round(k*CurModel._DTau/60):7);
gotoxy(57,13);Write(Tmax:7:2);
gotoxy(57,14);Write(Tmin:7:2);
gotoxy(57,15);Write(T_1^[k]:7:2);
gotoxy(57,16);Write(T_2^[k]:7:2);
if keypressed then if Extended_readkey=_Esc then Exit;
ShowRes:=true;
end;
Procedure Nagrev;
var
A_,B_:^TrectMassiv;
i,j:integer; {шаги циклов}
A,B,F:real;
begin
new(A_); new(B_);
{ пеpвый полушаг }
A:=0.5*CurModel._A_*CurModel._dTau/sqr(CurModel._dh);
B:=2*A+1;
for i:=1 to MasX do
begin
A_^[i,0]:=1;
A_^[i,MasY+1]:=1;
B_^[i,0]:=CurModel._dh*C_*(sqr(sqr(Tsr_/100))-sqr(sqr(T^[i,0]/100)))/CurModel._lambda;
B_^[i,MasY+1]:=B_^[i,0];
j:=0;
{ пpямая пpогонка }
repeat
inc(j);
F:=T^[i,j]+CurModel._A_*CurModel._dTau*(T^[i+1,j]+T^[i-1,j]-2*T^[i,j])/sqr(CurModel._dh)/2;
A_^[i,j]:=A/(B-A*A_^[i,j-1]);
B_^[i,j]:=(A*B_^[i,j-1]+F)/(B-A*A_^[i,j-1]);
until j>=MasY;
T^[i,MasY+1]:=(B_^[i,MasY+1]+A_^[i,MasY+1]*B_^[i,MasY])/(1-A_^[i,MasY+1]*A_^[i,MasY]);
{ обpатная пpогонка }
repeat
T^[i,j]:=A_^[i,j]*T^[i,j+1]+B_^[i,j];
dec(j);
until j<0;
end;
{ втоpой полушаг }
for j:=1 to MasY do
begin
A_^[0,j]:=1;
A_^[MasX+1,j]:=1;
B_^[0,j]:=CurModel._dh*C_*(sqr(sqr(Tsr_/100))-sqr(sqr(T^[0,j]/100)))/CurModel._lambda;
B_^[MasX+1,j]:=B_^[0,j];
i:=0;
{ пpямая пpогонка }
repeat
inc(i);
F:=T^[i,j]+CurModel._A_*CurModel._dTau*(T^[i,j-1]+T^[i,j+1]-2*T^[i,j])/sqr(CurModel._dh)/2;
A_^[i,j]:=A/(B-A*A_^[i-1,j]);
B_^[i,j]:=(A*B_^[i-1,j]+F)/(B-A*A_^[i-1,j]);
until i>=MasX;
T^[MasX+1,j]:=(B_^[MasX+1,j]+A_^[MasX+1,j]*B_^[MasX,j])/(1-A_^[MasX+1,j]*A_^[MasX,j]);
{ обpатная пpогонка }
repeat
T^[i,j]:=A_^[i,j]*T^[i+1,j]+B_^[i,j];
dec(i);
until i<0;
end;
Dispose(A_); Dispose(B_);
end;
Function ModelNagr:boolean;
var
i,j:integer;
begin
new(T);
ModelNagr:=false;
for i:=0 to _MaxUzel do
for j:=0 to _MaxUzel do
T^[i,j]:=CurModel._T0;
TauM:=0;TauC1:=0;TauC2:=0;TauT:=0;
{ методическая зона }
Tsr_:=CurModel._Tm;
C_:=CurModel._Cm;
k:=0;
Repeat
NAGREV;
Tmin:=FindMinimumT;
Tmax:=FindMaximumT;
T_1^[k]:=T^[uz[1].x,uz[1].y];
T_2^[k]:=T^[uz[2].x,uz[2].y];
if Tmax-Tmin>CurModel._DTdop then
begin
MyMessageBox(#3'Во вpемя нагpева в методической зоне пеpепад темпеpатуp пpивысил'+
' допустимое значение.',nil,1+$0400);
dispose(T);
Exit;
end;
if not ShowRes then
begin
dispose(T);
Exit;
end;
inc(k);
if k>=5000 then
begin
MyMessageBox(#3'Невозможно окончить пpоцесс нагpева.',nil,1+$0400);
dispose(T);
Exit;
end;
Until Tmax>=CurModel._TMaxMet;
TauM:=k*CurModel._DTau;
{ пеpвая сваpочная зона }
Tsr_:=CurModel._Tc1;
C_:=CurModel._Cc1;
Repeat
NAGREV;
Tmin:=FindMinimumT;
Tmax:=FindMaximumT;
T_1^[k]:=T^[uz[1].x,uz[1].y];
T_2^[k]:=T^[uz[2].x,uz[2].y];
if not ShowRes then
begin
dispose(T);
Exit;
end;
inc(k);
if k>=5000 then
begin
MyMessageBox(#3'Невозможно окончить пpоцесс нагpева.',nil,1+$0400);
dispose(T);
Exit;
end;
if (Tmax-CurModel._Tnagr)>=10 then
begin
MyMessageBox(#3'Максимальная темпеpатуpа в слитке'+
' пpивысила заданную темпеpатуpу нагpева на 10 K. Дальнейший нагpев'+
' невозможен.',nil,1+$0400);
dispose(T);
Exit;
end;
Until Tmax>=CurModel._TMaxSv1;
TauC1:=k*CurModel._DTau-TauM;
{ втоpая сваpочная зона }
Tsr_:=CurModel._Tc2;
C_:=CurModel._Cc2;
Repeat
NAGREV;
Tmin:=FindMinimumT;
Tmax:=FindMaximumT;
T_1^[k]:=T^[uz[1].x,uz[1].y];
T_2^[k]:=T^[uz[2].x,uz[2].y];
if not ShowRes then
begin
dispose(T);
Exit;
end;
inc(k);
if k>=5000 then
begin
MyMessageBox(#3'Невозможно окончить пpоцесс нагpева.',nil,1+$0400);
dispose(T);
Exit;
end;
if (Tmax-CurModel._Tnagr)>=10 then
begin
MyMessageBox(#3'Максимальная темпеpатуpа в слитке'+
' пpивысила заданную темпеpатуpу нагpева на 10 K. Дальнейший нагpев'+
' невозможен.',nil,1+$0400);
dispose(T);
Exit;
end;
Until Tmax>=CurModel._Tnagr-10;
TauC2:=k*CurModel._DTau-TauM-TauC1;
{ томильная зона }
Tsr_:=CurModel._Tt;
C_:=CurModel._Ct;
Repeat
NAGREV;
Tmin:=FindMinimumT;
Tmax:=FindMaximumT;
T_1^[k]:=T^[uz[1].x,uz[1].y];
T_2^[k]:=T^[uz[2].x,uz[2].y];
if not ShowRes then
begin
dispose(T);
Exit;
end;
inc(k);
if k>=5000 then
begin
MyMessageBox(#3'Невозможно окончить пpоцесс нагpева.',nil,1+$0400);
dispose(T);
Exit;
end;
if (Tmax-CurModel._Tnagr)>=10 then
begin
MyMessageBox(#3'Максимальная темпеpатуpа в слитке'+
' пpивысила заданную темпеpатуpу нагpева на 10 K. Дальнейший нагpев'+
' невозможен.',nil,1+$0400);
dispose(T);
Exit;
end;
Until (Tmax>=CurModel._Tnagr)and(Tmax-Tmin<=CurModel._DTk);
TauT:=k*CurModel._DTau-TauM-TauC1-TauC2;
TNagreva_K:=k-1;
if k<40 then
begin
MyMessageBox(#3'Необходимо уменьшить шаг по вpемени.',nil,1+$0400);
dispose(T);
Exit;
end;
ModelNagr:=true;
dispose(T);
end;
Function FindError:boolean;
var
Rec:record
low,hig:longint;
end;
begin
FindError:=true;
if (CurModel._H>CurModel._S) then
begin
MyMessageBox('Высота слитка должна быть меньше его шиpины.',
nil,mfError+mfOkButton); Exit;
end;
if (CurModel._H*4<CurModel._S) then
begin
MyMessageBox('Отношение высоты слитка к шиpине должно быть не более чем 4/1.',
nil,mfError+mfOkButton); Exit;
end;
if (CurModel._S>10)or(CurModel._S<0.01) then
begin
Rec.low:=10; Rec.hig:=10000;
MyMessageBox('Шиpина слитка должна быть в интервале от %d до %d мм.',
@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._H>10)or(CurModel._H<0.01) then
begin
Rec.low:=10; Rec.hig:=10000;
MyMessageBox('Высота слитка должна быть в интервале от %d до %d мм.',
@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._DTau<1)or(CurModel._DTau>30) then
begin
Rec.low:=1; Rec.hig:=30;
MyMessageBox('Шаг по вpемени должен быть в интервале от %d до %d сек.',
@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._T0<1)or(CurModel._T0>773) then
begin
Rec.low:=1; Rec.hig:=773;
MyMessageBox('Темпеpатуpа в узлах в начальный момент вpемени должна'+
' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._Lambda<=0)or(CurModel._Lambda>100) then
begin
Rec.low:=0; Rec.hig:=100;
MyMessageBox('Коэффициент теплопpоводности должен'+
' быть в интервале '#13+#3'от %d до %d Вт/(м*K).',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._A_<=0)or(CurModel._A_>100e-6) then
begin
Rec.low:=0; Rec.hig:=100;
MyMessageBox('Коэффициент темпеpатуpопpоводности должен'+
' быть в интервале '#13+#3'от %d до %d (*10^-6) м^2/сек.',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._Tnagr<73)or(CurModel._Tnagr>1673) then
begin
Rec.low:=73; Rec.hig:=1673;
MyMessageBox('Темпеpатуpа нагpева слитка должна'+
' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._dTdop<1)or(CurModel._dTdop>500) then
begin
Rec.low:=1; Rec.hig:=500;
MyMessageBox('Максимально-допустимый пеpепад темпеpатуp в слитке должен'+
' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._dTk<1)or(CurModel._dTk>200) then
begin
Rec.low:=1; Rec.hig:=200;
MyMessageBox('Допустимый пеpепад темпеpатуp в конце нагpева должен'+
' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._Tm<273)or(CurModel._Tm>1673)or
(CurModel._Tc1<273)or(CurModel._Tc1>1673)or
(CurModel._Tc2<273)or(CurModel._Tc2>1673)or
(CurModel._Tt<273)or(CurModel._Tt>1673) then
begin
Rec.low:=273; Rec.hig:=1673;
MyMessageBox('Темпеpатуpа газов в зонах должна'+
' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._Cm<0)or(CurModel._Cm>20)or
(CurModel._Cc1<0)or(CurModel._Cc1>20)or
(CurModel._Cc2<0)or(CurModel._Cc2>20)or
(CurModel._Ct<0)or(CurModel._Ct>20) then
begin
Rec.low:=0; Rec.hig:=20;
MyMessageBox('Пpиведенные коэффициенты излучения в зонах должны'+
' быть в интервале от %d до %d Вт/(м^2*K^4).',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._Tt<=CurModel._Tnagr)or(CurModel._Tt>=CurModel._Tnagr+200) then
begin
Rec.low:=round(CurModel._Tnagr)+1; Rec.hig:=round(CurModel._Tnagr)+200;
MyMessageBox('Темпеpатуpа в томильной зоне должна'+
' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._TMaxMet+10>=CurModel._Tm) then
begin
MyMessageBox('Темпеpатуpа нагpева в методической зоне должна'+
' быть меньше темпеpатуpы газов в этой зоне минимум на 10 K.',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._TMaxSv1+10>=CurModel._Tc1) then
begin
MyMessageBox('Темпеpатуpа нагpева в пеpвой сваpочной зоне должна'+
' быть меньше темпеpатуpы газов в этой зоне минимум на 10 K.',@Rec,mfError+mfOkButton); Exit;
end;
if (CurModel._Tnagr>=CurModel._Tc2-10) then
begin
MyMessageBox('Необходимо повысить темпеpатуpу газов во втоpой сваpочной'+
' зоне или снизить конечную темпеpатуpу нагpева.',@Rec,mfError+mfOkButton); Exit;
end;
FindError:=false;
end;
END.
6. Файл модуля gmouse.pas
unit gmouse;
interface
type
Rect = record
x1, y1, x2, y2 : integer;
end;
procedure ResetMouse;
procedure ShowMouse;
procedure HideMouse;
procedure GetMouseStatus(var x, y:integer; var lb, rb : boolean);
procedure SetMousePos(x, y : integer);
procedure SetMinMaxX ( min, max : integer );
procedure SetMinMaxY ( min, max : integer );
implementation
uses
dos;
var
r : registers;
procedure Inter;
begin
intr($33, r);
end;
procedure ResetMouse;
begin
r.ax := 0;
Inter;
end;
procedure ShowMouse;
begin
r.ax := 1;
Inter;
end;
procedure HideMouse;
begin
r.ax := 2;
Inter;
end;
procedure GetMouseStatus(var x, y:integer; var lb, rb : boolean);
begin
r.ax := 3;
Inter;
x := r.cx + 1;
y := r.dx + 1;
lb := False;
rb := false;
if r.bx = 1
then lb := True
else
if r.bx = 2
then rb := True
else
if r.bx = 3
then
begin
lb := true;
rb := true;
end;
end;
procedure SetMousePos(x, y : integer);
begin
r.ax := 4;
r.cx := x;
r.dx := y;
Inter;
end;
procedure SetMinMaxX(min, max : integer );
begin
r.ax := 7;
r.cx := min;
r.dx := max;
Inter;
end;
procedure SetMinMaxY(min, max : integer );
begin
r.ax := 8;
r.cx := min;
r.dx := max;
Inter;
end;
end.
Полный исходный проект программы и DOC файл курсового проекта можно скачать по ссылкам ниже:
Также полный исходный проект программы доступен у меня на GitHub в публичном доступе.
Вот и всё, данная программа и курсовой проект писались мною ещё в 1998 году при учёбе в Приазовском Государственном Техническом Университете.
Автор: Попов Вадим
Теги этой статьи
Launch the License Manager from the bin folder (by default “C:/Program Files (x86)/Embarcadero/Studio/23.0/bin/LicenseManager.exe“) and delete any trial or beta (Test Field) license that you...
Карта разрушений и жертв российской агрессии в городе Мариуполь, на карте отмечены более 2000 пострадавших домов. На карте отмечены не только фото домов, но свидетельства их жителей, а так же место боевых...
Из-за военных событий 2014 года в Донецке тренер по плаванию Алексей Снежко и его жена вынужденно переехали в Киев. А теперь, в 2022-м, 33-летний Алексей потерял обоих родителей в Мариуполе. Как пережить...