• Теги этой статьи

Pascal. Расчёт нагрева прямоугольной заготовки металла в толкательной (методической) противоточной печи

19/07/2022
1.6 K

Программа на языке программирования Pascal была написана для курсового проекта по курсу металлургическая теплотехника на первом курсе учёбы в Приазовском Государственном Техническом Университете (ПГТУ). Руководитель проекта, доцент, кандидат технических наук Хаджинов А. С.. Проект разработал я, студент группы МА-95, Попов В. С.. Город Мариуполь 1997 год.

Толкательные противоточные печи широко применяются для нагрева прямоугольной заготовки. В этих печах лежащие на поду и соприкосающиеся друг с другом заготовки задаются и перемещаются в печи при помощи специального механизма-толкателя. Преимуществом толкательных печей является то, что проталкивание - наиболее простой и дешевый метод транспортирования металла через печь.

Тепловой режим нагрева металла является методическим т. к. температура по длине печи переменна. В зоне 1 (методической) происходит постепенный нагрев металла; в зоне 2 (первой сварочной) и 3 (второй сварочной) - нагрев металла до тех пор, пока средняя температура металла не достигнет температуры нагрева(второе условие перехода в томильную зону); в зоне 4 (томильной) осуществляется выравнивание температуры по толщине металла до тех пор, пока не достигнем заданной конечной разности температур.

Основные этапы расчётов проекта:

  1. Расчет горения топлива;
  2. Выбор и расчет размеров рабочего пространства печи;
  3. Расчет внешнего теплообмена;
  4. Расчет нагрева металла (Численный метод расчета нагрева металла, реализован программно);
  5. Выбор и оптимизация температурного режима;
  6. Определение размеров печи.

Привожу результирующий исходный код модуля программы на языке Pascal:

Program pech;

uses
    crt, graph;

Const
    N      = 20;           {число отрезков на которое разбито тело}
    _T0    = 293;          {температура в узлах в начальный момент времени}
    S_     = 1;            {коэффициент разностной апроксимации}
    dX     = 0.18 / N;     {шаг по координате dX=S/N}
    dTau   = 10;           {шаг по времени}
    _Cm    = 5.67 * 0.607; {приведенный коэф. излуч. в методической зоне}
    _Cc1   = 5.67 * 0.657; {приведенный коэф. излуч. в сварочной зоне 1}
    _Cc2   = 5.67 * 0.657; {приведенный коэф. излуч. в сварочной зоне 2}
    _Ct    = 5.67 * 0.6;   {приведенный коэф. излуч. в томильной зоне}
    _Tm    = 1473;         {средняя температура газов в методической зоне}
    _Tc1   = 1623;         {средняя температура газов в сварочной зоне 1 }
    _Tc2   = 1623;         {средняя температура газов в сварочной зоне 2 }
    _Tt    = 1513;         {средняя температура газов в томильной зоне}
    _dTk   = 45;           {заданный температурный перепад в конце нагрева}
    _Tnagr = 1473;         {заданная температура нагрева}
    _dTdop = 150;          {допустимый перепад температур в мет. зоне}
    _a1    = 1;            {коэффициент прогонки}
    lamda  = 35.8;         {коэф. теплопроводности}
    _A_    = 6.39e-6;      {коэф. температуропроводности}

var
    C1, C2: real;          {приведенные коэффициенты излучения в системе}
    Tr1, Tr2: real;
    Tuh, Tm, Tmin, Tsredn: real;
    TauM, TauC1, TauC2, TauT: real; {время нагрева в каждой зоне}
    TauN: real;
    n_, i: integer;
    T: array[0..N] of real; {массив температур}
    T0_, Tmin_: array[1..5000] of real;
    temp: string[5];
    gm, gd, j: integer;

label
   1, 2;

Procedure NAGREV;
var
    B_: array[1..N] of real; {бэтта итое}
    A_: array[1..N] of real; {альфа итое}
    A, B, F: real;
    i: integer;                 {шаг цикла}
    M2: real;
begin
    A := S_ * _A_ * dTau / sqr(dX);
    B := 2 * A + 1;
    A_[1] := _a1;
    i := 0;
    B_[1] := dX * C1 * (sqr(Tr1 / 100) * sqr(Tr1 / 100) - sqr(T[0] / 100) * sqr(T[0] / 100)) / lamda;
    repeat
        i := i + 1;
        F := T[i] + (1 - S_) * _A_ * dTau * (T[i + 1] + T[i - 1] - 2 * T[i]) / sqr(dX);
        A_[i + 1] := A / (B - A * A_[i]);
        B_[i + 1] := (A * B_[i] + F) / (B - A * A_[i]);
    until i >= N - 1;
    M2 := dX * C2 * (sqr(Tr2 / 100) * sqr(Tr2 / 100) - sqr(T[N] / 100) * sqr(T[N] / 100)) / lamda;
    T[N] := (M2 + B_[N]) / (1 - A_[N]);
    repeat
        T[i] := A_[i + 1] * T[i + 1] + B_[i + 1];
        i := i - 1;
    until i < 0;
end;

Procedure Show_Res;
var
    i: integer;
    Tau: real;
begin
    Tmin := T[0];
    for i := 0 to N do
        if T[i] < Tmin
            then Tmin := T[i];
    Tau := n_ * dTau + TauM + TauC1 + TauC2 + TauT;
    writeln('Tau = ', Tau:7:2, '  T[0] = ', T[0]:7:5, '  Tmin = ', Tmin:7:5);
end;

BEGIN
    clrscr;
    Tr1 := _Tm;
    Tr2 := _Tm;
    C1 := _Cm;
    C2 := _Cm;
    1:    for i := 0 to N do T[i] := _T0;
        n_ := 0;
        repeat
            NAGREV;
            n_ := n_ + 1;
            Tmin := T[0];
            for i := 0 to N do
                if T[i] < Tmin then Tmin := T[i];
            if Tmin >= 773 then goto 2;
        until (T[0] - Tmin) >= _dTdop;
        Tr1 := Tr1 - 10;
        Tr2 := Tr2 - 10;
        goto 1;
    2:    Tm := Tr1;
        TauM := dTau * n_;
        Tuh := sqr(Tm) / _Tc1;
        {*****************************}
        writeln('TauM = ', TauM:10:9);
        writeln('Tuh  = ', Tuh:10:9);
        writeln('Tm   = ', Tm:10:9);
        {*****************************}
        readln;
        for i := 0 to N do T[i] := _T0;
        TauM := 0;
        TauC1 := 0;
        TauC2 := 0;
        TauT := 0;
        j := 1;
        {Методическая зона}
        n_ := 0;
        Tr1 := Tm;
        Tr2 := Tm;
        C1 := _Cm;
        C2 := _Cm;
        Repeat
            NAGREV;
            T0_[j] := T[0];
            Tmin_[j] := Tmin;
            inc(j);
            inc(n_);
            Show_Res;
        Until Tmin >= 773;
        TauM := n_ * dTau;
        {Сварочная зона 1}
        n_ := 0;
        Tr1 := _Tc1;
        Tr2 := _Tc1;
        C1 := _Cc1;
        C2 := _Cc1;
        Repeat
            NAGREV;
            T0_[j] := T[0];
            Tmin_[j] := Tmin;
            inc(j);
            inc(n_);
            Show_Res;
        Until T[0] >= _Tnagr - 200;
        TauC1 := n_ * dTau;
        {Сварочная зона 2}
        n_ := 0;
        Tsredn := 0;
        Tr1 := _Tc2;
        Tr2 := _Tc2;
        C1 := _Cc2;
        C2 := _Cc2;
        Repeat
            NAGREV;
            T0_[j] := T[0];
            Tmin_[j] := Tmin;
            inc(j);
            inc(n_);
            Show_Res;
            for i := 0 to N do Tsredn := Tsredn + T[i];
            Tsredn := Tsredn / (N + 1);
        Until Tsredn >= _Tnagr;
        TauC2 := n_ * dTau;
        {Томильная зона}
        n_ := 0;
        Tr1 := _Tt;
        Tr2 := _Tt;
        C1 := _Ct;
        C2 := 0;
        Repeat
            NAGREV;
            T0_[j] := T[0];
            Tmin_[j] := Tmin;
            inc(j);
            inc(n_);
            Show_Res;
        Until (T[0] - Tmin) <= _dTk;
        TauT := n_ * dTau;
        TauN := TauM + TauC1 + TauC2 + TauT;
        writeln('**********************************');
        writeln('TauN  = ', TauN:7:2);
        writeln('TauM  = ', TauM:7:2);
        writeln('TauC1 = ', TauC1:7:2);
        writeln('TauC2 = ', TauC2:7:2);
        writeln('TauT  = ', TauT:7:2);
        writeln('Tух   = ', Tuh:7:5);
        writeln('Tm    = ', Tm:7:5);
        if abs(T[0] - _Tnagr) > 5
        then
            begin
                writeln('Расчет не удовлетворяет заданной точности, необходимо');
                writeln('изменить температуру томильной зоны.');
            end;
        readln;
        clrscr;
        initgraph(gd, gm, 'd:\tp-7\bgi');
        j := j - 1;
        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 * dTau / 1000) do
                begin
                    line(100 + round(i * 500 / (j * dTau / 1000)), 408, 100 + round(i * 500 / (j * dTau / 1000)), 412);
                    str(i * 1000:5, temp);
                    settextstyle(0, 1, 0);
                    outtextxy(104 + round(i * 500 / (j * dTau / 1000)), 420, temp);
                end;
                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(2, 0, 3);
                line(round(100 + (500 / j) * (0 / dTau)), round(410 - 400 * Tuh / 1700),
                    round(100 + (500 / j) * (TauM / dTau)), round(410 - 400 * _TC1 / 1700));
                setlinestyle(0, 0, 3);
                line(round(100 + (500 / j) * (0 / dTau)), round(410 - 400 * Tm / 1700),
                    round(100 + (500 / j) * (TauM / dTau)), round(410 - 400 * Tm / 1700));
                line(round(100 + (500 / j) * (TauM / dTau)), round(410 - 400 * Tm / 1700),
                    round(100 + (500 / j) * (TauM / dTau)), round(410 - 400 * _TC1 / 1700));
                line(round(100 + (500 / j) * (TauM / dTau)), round(410 - 400 * _TC1 / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1) / dTau)), round(410 - 400 * _TC1 / 1700));
                LINE(round(100 + (500 / j) * ((TauM + TauC1) / dTau)), round(410 - 400 * _TC1 / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1) / dTau)), round(410 - 400 * _TC2 / 1700));
                line(round(100 + (500 / j) * ((TauM + TauC1) / dTau)), round(410 - 400 * _TC2 / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / dTau)),
                    round(410 - 400 * _TC2 / 1700));
                line(round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / dTau)),
                    round(410 - 400 * _TC2 / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / dTau)), round(410 - 400 * _Tt / 1700));
                line(round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / dTau)), round(410 - 400 * _Tt / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1 + TauC2 + TauT) / dTau)),
                    round(410 - 400 * _Tt / 1700));
                setlinestyle(0, 0, 3);
                for i := 3 to j do
                begin
                    line(round(100 + 500 / j * i), round(410 - 400 * T0_[i - 1] / 1700),
                        round(100 + 500 / j * i), round(410 - 400 * T0_[i] / 1700));
                    line(round(100 + 500 / j * i), round(410 - 400 * Tmin_[i - 1] / 1700),
                        round(100 + 500 / j * i), round(410 - 400 * Tmin_[i] / 1700));
                    line(round(100 + 500 / j * i), round(410 - 400 * (T0_[i - 1] - Tmin_[i - 1]) / 1700),
                        round(100 + 500 / j * i), round(410 - 400 * (T0_[i] - Tmin_[i]) / 1700));
                end;
                readln;
                closeGraph;
            end;
END.

Пояснительная записка к курсовому проекту и код программы на языке программирования Pascal доступен для скачивания по ссылке  4x_graf.rar.

Вот и всё, данная программа писалась мною ещё в конце 90-ых годов при учёбе в Приазовском Государственном Техническом Университете.

Автор: Попов Вадим

Теги этой статьи

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-летний Алексей потерял обоих родителей в Мариуполе. Как пережить...

Компьютерный мирSector

Вся информация на страницах сайта предназначена только для личного не коммерческого использования, учёбы, повышения квалификации и не включает призывы к каким либо действиям.

Частичное или полное использование материалов сайта разрешается только при условии добавления ссылки на непосредственный адрес материала на нашем сайте.