Расчет коэффициента мощности выпрямителя в зависимости от реактивного сопротивления и эффективного значения электродвижующей силы
Рисунок 4 — Падающее меню программы Рисунок 5 — Контекстное меню программы Для того, чтобы ввести данные, необходимо нажать Файл — Открыть. Для того, чтобы сохранить файл, необходимо нажать Файл — Сохранить. Для того, чтобы рассчитать задачу, необходимо нажать Работа — Расчет. Меню Помощь содержит такие компоненты как Справка и О программе, при помощи которых можно, соответственно, вызвать… Читать ещё >
Расчет коэффициента мощности выпрямителя в зависимости от реактивного сопротивления и эффективного значения электродвижующей силы (реферат, курсовая, диплом, контрольная)
СОДЕРЖАНИЕ РЕФЕРАТ ВВЕДЕНИЕ АЛГОРИТМИЗАЦИЯ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ МАТЕМАТИЧЕСКОЕ РЕШЕНИЕ ЗАДАЧИ РАСКРЫТИЕ ТЕМЫ КУРСОВОЙ РАБОТЫ Разработка интерфейса пользователя Создание программного кода СОЗДАНИЕ АНИМАЦИИ РАЗРАБОТКА СПРАВОЧНОЙ СИСТЕМЫ РАСЧЁТ КОНТРОЛЬНОГО ПРИМЕРА ЗАКЛЮЧЕНИЕ СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ИНФОРМАЦИИ ПРИЛОЖЕНИЯ Приложение 1
Приложение 2
РЕФЕРАТ
Для решения поставленной задачи будет использоваться среда разработки приложений Delphi 7. При помощи Delphi 7 будет создана программа коэффициента мощности выпрямителя в зависимости от реактивного сопротивления и эффективного значения электродвижущей силы Для отображения алгоритма решения, создаём блок-схему.
Целью данной работы является расчет коэффициента мощности выпрямителя (Вт) в зависимости от реактивного сопротивления Ч (Ом) и эффективного значения электродвижующей силы Е (В).
Для этой цели составлена программа на языке программирования «Delphi». С помощью данной программы произведены необходимые вычисления и получены результаты, как в виде таблицы, так и в виде графиков зависимостей. Так же для улучшения визуального восприятия и облегчения работы с программой составлены дополнительные модули «Анимация» и «О программе». Кроме этого в выше указанных модулях будет содержаться дополнительная информация о разработчике программы.
Целью данной курсовой работы является закрепление и применение на практике полученных навыков программирования во время изучения дисциплины «Информатика».
Разработанная мною программа имеет примитивный интерфейс. Данной программой может пользоваться не только подготовленный пользователь, но и пользователь, который слабо знает данную сторону вопроса и методы её реализации.
АЛГОРИТМИЗАЦИЯ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ Ниже приведена блок-схема, описывающая алгоритм, по которому будет выполняться программа.
Рисунок 1 — Блок-схема алгоритма решения математической модели
МАТЕМАТИЧЕСКОЕ РЕШЕНИЕ ЗАДАЧИ Рассчитать коэффициент мощности выпрямителя (Вт) в зависимости от реактивного сопротивления Ч (Ом) и эффективного значения электродвижующей силы Е (В).
Коэффициент мощности выпрямителя (Вт) в зависимости от реактивного сопротивления Ч (Ом) и эффективного значения электродвижующей силы Е (В) рассчитывается по формуле:
где k — отношение эффективного тока вторичной обмотки трансформатора к среднему значению выпрямленному току;
о — коэффициент, учитывающий влияние омического падения напряжения в цепи переменного тока на среднее выпрямленное напряжение;
— величина выпрямленного тока (А);
— отношение коэффициента трансформации на данной ступени регулирования к наименьшему коэффициенту трансформации, при котором получается номинальная электродвижующая сила холостого хода вторичной обмотки трансформатора.
На рисунке 1 представлена схема трёхфазного выпрямителя и осциллограммы напряжения в различных точках выпрямителя Рисунок 2 — схема трёхфазного выпрямителя и осциллограммы напряжения в различных точках выпрямителя На рисунке обозначено:
— напряжения на вторичных обмотках трехфазного трансформатора.
напряжение на нагрузке получаемое с соответствующего вентиля.
— Суммарное напряжение на нагрузке.
Выпрямитель представляет собой однополупериодный выпрямитель для каждой из трех фазных вторичных обмоток. Все три вентиля имеют общую нагрузку.
Если рассмотреть осциллограммы напряжения на нагрузке при отключенном конденсаторе для каждой из трех фаз, то можно заметить, что напряжение на нагрузке имеет такой же уровень пульсаций как и в схеме однополупериодного выпрямления. Сдвиг фаз (т.е. сдвиг по времени) напряжений выпрямителей между собой в результате даст в 3 раза меньший уровень пульсаций, чем в однофазной однополупериодной схеме выпрямления. Трёхфазные мощные выпрямители используются в электровозах, городском электротранспорте.
РАСКРЫТИЕ ТЕМЫ КУРСОВОЙ РАБОТЫ
Я начал разработку программы с разработки интерфейса.
Разработка интерфейса пользователя
При запуске программы появляется главное окно, представленное на рисунке 2.
Рисунок 3 — Стартовое окно программы Исходные данные для удобства ввода разбиты на три логических блока: Реактивное сопротивление, Эффективное значение электродвижущей силы и Другие параметры. Для проведения расчетов необходимо нажать кнопку Расчет.
Если требуется выполнить дополнительные вычисления, то можно воспользоваться калькулятором, который вызывается нажатием кнопки Калькулятор.
Для удобства работы программа содержит главное (рисунок 2) и контекстное меню (рисунок 4).
Рисунок 4 — Падающее меню программы Рисунок 5 — Контекстное меню программы Для того, чтобы ввести данные, необходимо нажать Файл — Открыть. Для того, чтобы сохранить файл, необходимо нажать Файл — Сохранить. Для того, чтобы рассчитать задачу, необходимо нажать Работа — Расчет. Меню Помощь содержит такие компоненты как Справка и О программе, при помощи которых можно, соответственно, вызвать справочную систему и просмотреть информацию о программе.
При нажатии Помощь — О программе загружается новая форма (рисунок 4), на которой представлена информация о программе и анимация.
Рисунок 6 — Окно представления информации о программе Для облегчения понимания работы с программой содержится статусная строка, в которую выводится справочная информация о любом объекте программы, к которому подводится курсор.
После выполнения расчетов результаты отображаются на новой форме в виде таблицы (рисунок 6).
Рисунок 7 — Результаты расчета На данной форме имеются ряд кнопок, позволяющих провести постобработку полученных результатов. Можно сохранить результаты в MS Excel, MS Word. Есть возможность построить графические зависимости, вывести результирующую таблицу на печатающее устройство, вызвать справочную информацию и вернуться назад к вводу исходных данных.
При нажатии на кнопку Графики загружается новая форма (рисунок 7), на которой представлены графические зависимости коэффициента мощности выпрямителя от реактивного сопротивления и эффективного значения электродвижущей силы. Также предусмотрена возможность построения трехмерного графика.
Рисунок 8 — Окно представления графических зависимостей Для всех графиков имеется компонент TeeCommander (рисунок 7), имеющий следующие элементы для работы с графиками:
Normal, Rotate, Move, Zoom, Depth, 3D, Edit, Print, Copy, Save.
Рисунок 9 — Компонент TeeCommander
Строка состояния создаётся на основе компонента TStatusBar, расположенного на вкладке Win32. Данный компонент отображает «горячие» подсказки и выводит дополнительную информацию. Строка состояния обычно делится на несколько панелей.
В самом простом варианте строка состояния работает, как одна большая панель. При этом свойство SimplePanel получают значение True, а выводимый текст записывается в свойство SimpleText.
Для отображения подсказок существует два способа:
1. В инспекторе объектов для свойства AutoHint присвоить значение True;
2. В разделе описания процедур добавляем:
procedure ShowHint (Sender: TObject);
После этого вручную прописываем две процедуры (см. Приложение1).
Строка состояния значительно облегчает работу с программой и её освоение.
СОЗДАНИЕ ПРОГРАММНОГО КОДА Далее рассмотрим написание текста программы, необходимого для расчёта.
Первоначально в программу необходимо ввести данные, для этого воспользуемся расположенными на форме компонентами LabeledEdit.
В тексте программы (на кнопке РАСЧЁТ) присваиваем переменным значения из компонентов LabeledEdit, но первоначально описываем каждую переменную глобально в разделе var:
var
FMain: TFMain;
MsSteps, MvSteps: Integer;
k0, Xmin, Xmax, dX, Emin, Emax, dE, _k, _Id, _Em: Real;
Xmin := StrToFloat (LabeledEdit1.Text);
CurLE := LabeledEdit2;
Xmax := StrToFloat (LabeledEdit2.Text);
CurLE := LabeledEdit4;
Emin := StrToFloat (LabeledEdit4.Text);
CurLE := LabeledEdit5;
Emax := StrToFloat (LabeledEdit5.Text);
CurLE := LabeledEdit7;
_k := StrToFloat (LabeledEdit7.Text);
CurLE := LabeledEdit8;
_Em := StrToFloat (LabeledEdit8.Text);
CurLE := LabeledEdit9;
_Id := StrToFloat (LabeledEdit9.Text);
CurLE := LabeledEdit10;
k0 := StrToFloat (LabeledEdit10.Text);
CurLE := LabeledEdit3;
MsSteps := StrToInt (LabeledEdit3.Text);
dX := (Xmax — Xmin) / (MsSteps — 1);
CurLE := LabeledEdit6;
MvSteps := StrToInt (LabeledEdit6.Text);
dE := (Emax — Emin) / (MvSteps — 1);
где Также программа должна проверять правильность вводимых значений, для этого нужно задать условия, при выполнении которых будет выдаваться ошибка:
if (Xmin < 0.3) or (Xmax < 0.3) then
begin
MessageDlg ('Значение реактивного сопротивления должно быть не менее 0,3 Ом',
mtWarning, [mbOK], 0);
Result := False;
end;
Такой программный код необходимо записать для каждой переменной, задавая соответствующие условия.
Так как все пользовательские подпрограммы нужно оформлять как динамически подключаемые библиотеки, сперва создаем динамическую библиотеку. Для этого необходимо в программе Delphi 7 в падающем меню File (файл) выбрать пункт New (новый), затем Others (другие) и в появившемся окне выбрать элемент DLL Wizard. В открывшемся окне редактора кода создаём два новых типа: mass1 и mass2(одномерный и двумерный массивы соответственно), эти же типы создаём и в самой программе, а затем создаём новую процедуру raschet1, указывая в скобках переменные, которые передаются в процедуру, а в разделе var те переменные, которые необходимо вывести из процедуры. В разделе var процедуры raschet1 указываем переменные, которые будут использоваться только внутри процедуры, после этого записываем текст программы, который соответствует блок-схеме:
function Formula (k0,X, E, k, Id, Em: Real): Real; stdcall;
begin
Result := ((2*sqrt (2))/(3.14*k))-((2*Em*Id*X*k0)/(3.14*E*k))
end;
//k — отношение эффективного тока вторичной обмотки трансформатора к среднему выпрямленному току
//Em — коэффициент, учитывающий влияние омического падения напряжения в цепи переменного тока на среднее выпрямленное напряжение
//Id — величина выпрямленного тока
//X — реактивное сопротивление
//k0 — отношение коэффициента трансформации на данной ступени регулирования к наименьшему коэффициенту трансформации, при котором получается номинальная электродвижущая сила хода вторичной обмотки трансформатора
//E — эффективное значение электродвижущей силы
exports Formula index 1;
Для того, чтобы было возможно обратиться к данной процедуре в её конце записана строка exports Formula index 1. После написания процедуры нужно скомпилировать проект (Ctrl+F9), а затем сохранить в отдельную папку.
Для того чтобы можно было обратиться к созданной процедуре нужно в тексте программы написать следующее:
function Formula (k0, X, E, _k, i, _Em: Real): Real; stdcall;
external 'DllFormulaDLL.dll' index 1
Причём необходимо указывать полный путь к dll библиотеке.
После подключения библиотеки можем использовать её в программе: на кнопке расчёт, после введения данных, обращаемся к данной библиотеке.
Для вызова калькулятора на кнопке КАЛЬКУЛЯТОР вводим следующий элемент программного кода:
winexec ('calc.exe', sw_restore);
Поскольку программа должна запоминать последние введённые данные, на кнопке ВЫХОД вводим следующий элемент программного кода, который будет отвечать за то, чтобы все значения из компонентов LabeledEdit были сохранены в текстовом файле, однако перед этим для каждой переменной нужно ввести программный код для проверки правильности введённых данных (так же как и на кнопке РАСЧЁТ):
AssignFile (TempFile, FileName);
Rewrite (TempFile);
try
Writeln (TempFile, LabeledEdit1. Text);
Writeln (TempFile, LabeledEdit2. Text);
Writeln (TempFile, LabeledEdit3. Text);
Writeln (TempFile, LabeledEdit4. Text);
Writeln (TempFile, LabeledEdit5. Text);
Writeln (TempFile, LabeledEdit6. Text);
Writeln (TempFile, LabeledEdit7. Text);
Writeln (TempFile, LabeledEdit8. Text);
Writeln (TempFile, LabeledEdit9. Text);
Writeln (TempFile, LabeledEdit10. Text);
finally
CloseFile (TempFile);
СОЗДАНИЕ АНИМАЦИИ Данная анимация расположена в окне «О программе».
Рисунок 10 — Окно представления информации о программе Для создания анимации было использовано два основных компонента это TImage (вкладка Additional) и TTimer (вкладка System), которые в основном применяются для создания каких-либо графических изображений в Delphi.
Компонент TImage активно используется во многих программах, причём не только для отображения статических картинок, но и для создания анимационных эффектов.
Компонент TTimer применяется в основном для создания темпа смены кадров. Следует учесть, что интервал свойства Interval задаётся в миллисекундах.
Формирование анимации заключается в последовательной прорисовке кадров, сначала рисуется первый кадр, а затем идёт смещение с очисткой предыдущего положения рисунка.
Для создания анимации были использованы некоторые свойства и методы класса TCanvas. Ниже приведены некоторые методы класса TCanvas и их предназначение:
procedure Draw — вывод графического изображения в заданной точке холста;
procedure Polygon — рисуется сложная фигура, состоящая из отрезков, последовательно соединяющих точки, представленные ввиде динамического массива элементов TPoint. Последняя точка соединяется с первой. Внутренняя часть фигуры заполняется в соответствии со значением свойства Brush;
procedure Rectangle — рисуется прямоугольник. Его внутренняя область заполняется в соответствии со значением свойства Brush;
procedure Ellipse — рисуется эллипс.
Текст анимации смотри в Приложении1 Unit4.
РАЗРАБОТКА СПРАВОЧНОЙ СИСТЕМЫ
программа выпрямитель мощность графический Создание справки производилось при помощи приложения Help & Manual 6. Поэтому необходимо, чтобы на компьютере было предварительно установлено приложение Help & Manual 6.
Рисунок 11 — Help & Manual 6
Следует привести порядок действий, которые необходимо выполнить для создания справки.
При помощи приложения Help & Manual 6 создаём файл справки .chm.В открывшемся окне программы создаём новый проект, при этом указываем место его сохранения. В появившемся проекте в Обозревателе проекта создаём нужные нам разделы:
1.
Введение
;
2. Описание интерфейса;
2.1Форма Расчёт реактивной проводимости трансформатора:
2.1.1. Описание формы Расчёт реактивной проводимости трансформатора;
2.1.2. Ввод данных;
2.1.3. Вызов калькулятора;
2.1.4. Восстановление данных по умолчанию;
2.2. Форма Результат расчёта:
2.2.1. Описание формы Результат расчёта;
2.2.2. Сохранение результатов расчёта;
2.3. Форма Графики:
2.3.1. Описание формы Графики;
2.3.2. Сохранение графиков;
2.3.3. Печать графиков;
2.4. Форма О программе:
2.4.1. Описание формы О программе;
Рисунок 12 — Внешний вид окна справки Для каждого раздела на вкладке Опции раздела указываем в строке Контекст справки номер данного раздела.
Для того, что бы скомпилировать проект справки, нужно нажать Ctrl+F9, затем в открывшемся окне выбрать вкладку WinHelp, указать путь сохранения (желательно папку с программой) и нажать OK.
В самой программе для того, чтобы открыть справку, нужно сделать следующее: щёлкнув один раз по форме, в Object Incpector’е в строке HelpFile записать имя скомпилированного проекта, а в строке HelpContext указать номер раздела справки, который необходимо открыть. Теперь в ходе работы программы при нажатии на кнопку F1 будет открыт необходимый раздел справки.
Для того чтобы в ходе работы программы при нажатии на кнопку Справка появлялся нужный раздел справки, надо на кнопку записать следующий фрагмент программного кода (цифра обозначает номер раздела справки): ShellExecute (handle, nil, PChar (ExtractFilePath (ParamStr (0))+ 'spravka.chm'), nil, nil, SW_SHOW); // Вызов справки Эти действия необходимо проделать для всех форм программы, только следует изменять номер раздела справки.
РАСЧЁТ КОНТРОЛЬНОГО ПРИМЕРА
При помощи программы рассчитаем коэффициент мощности выпрямителя. По графикам определим как влияет каждый из параметров на коэффициент мощности выпрямителя.
X1=0.6 Ом — минимальное значение реактивного сопротивления;
X2=1.5 A — максимальное значение реактивного сопротивления;
n=15 — число расчетных точек;
E1=0.15 В — минимальное значение электродвижущей силы;
E2=2.6 В — максимальное значение электродвижущей силы
m=14 — число расчетных точек;
k=0.2 — отношение эффективного тока к среднему выпрямленному току.
E=0.24 — коэффициент, учитывающий влияние омического падения напряжения в цепи переменного тока на среднее выпрямленное напряжение;
Id =0.75 — величина выпрямленного тока
k0=0.33 — отношение коэффициента трансформации на данной ступени регулирования к наименьшему коэффициенту трансформации, при котором получается номинальная электродвижующая сила холостого хода вторичной обмотки трансформатора.
Рисунок 13 — Вид главной формы На рисунке 12 показан результат расчёта.
Рисунок 14 — Результат расчёта Рисунок 15 — Зависимость от реактивного сопротивления Рисунок 16 — Зависимость от эффективного значения электродвижущей силы Рисунок 17 — Трёхмерная зависимость
ЗАКЛЮЧЕНИЕ
В результате проделанной мной работы создана программа для расчёта коэффициента мощности выпрямителя. Как приложение к программе создана справочная система для лучшего освоения программы.
При помощи этой программы можно анализировать от каких параметров, и в какой степени зависит искомая величина. При помощи программы произведён расчёт контрольного примера, в котором использованы конкретные данные трансформатора.
ПРИЛОЖЕНИЯ
Приложение 1
Таблица П.1-Сводные данные по расчётным параметрам
Переменная | Обозначение в формуле | Диапазон изменения | Примечания | |
Реактивное сопротивление | X | 0,6…1,5 | Варьируемая величина | |
Эффективное значение ЭДС | Е | 0,15…2,6 | Варьируемая величина | |
отношение эффективного тока вторичной обмотки трансформатора к среднему значению выпрямленному току | k | 0,2 | Постоянная величина | |
коэффициент, учитывающий влияние омического падения напряжения в цепи переменного тока на среднее выпрямленное напряжение | о | 0,24 | Постоянная величина | |
величина выпрямленного тока | 0,75 | Постоянная величина | ||
отношение коэффициента трансформации на данной ступени регулирования к наименьшему коэффициенту трансформации, при котором получается номинальная электродвижующая сила холостого хода вторичной обмотки трансформатора. | 0,33 | Постоянная величина | ||
Приложение 2
Приложение 2 содержит полный текст программы.
ФОРМА 1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, ComCtrls, XPMan, StdCtrls, Buttons, Unit2, shellapi ;
type
TFMain = class (TForm)
StatusBar: TStatusBar;
MainMenu: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
XPManifest1: TXPManifest;
PopupMenu: TPopupMenu;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N15: TMenuItem;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
GroupBox4: TGroupBox;
bbCalc: TBitBtn;
bbCalculator: TBitBtn;
bbHelp: TBitBtn;
bbExit: TBitBtn;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
LabeledEdit4: TLabeledEdit;
LabeledEdit5: TLabeledEdit;
LabeledEdit6: TLabeledEdit;
LabeledEdit7: TLabeledEdit;
LabeledEdit8: TLabeledEdit;
UpDown1: TUpDown;
UpDown2: TUpDown;
OpenDlg: TOpenDialog;
SaveDlg: TSaveDialog;
LabeledEdit9: TLabeledEdit;
LabeledEdit10: TLabeledEdit;
procedure FormCreate (Sender: TObject);
procedure ShowHint (Sender: TObject);
procedure Exit (Sender: TObject);
procedure ExecCalc (Sender: TObject);
procedure Calculate (Sender: TObject);
procedure leFloatKeyPress (Sender: TObject; var Key: Char);
procedure leIntKeyPress (Sender: TObject; var Key: Char);
procedure leIntKeyUp (Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ShowAboutProgram (Sender: TObject);
procedure N4Click (Sender: TObject);
procedure N5Click (Sender: TObject);
procedure FormCloseQuery (Sender: TObject; var CanClose: Boolean);
procedure LoadDataFile (FileName: TFileName);
procedure SaveDataFile (FileName: TFileName);
procedure bbHelpClick (Sender: TObject);
procedure N10Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FMain: TFMain;
MsSteps, MvSteps: Integer;
k0, Xmin, Xmax, dX, Emin, Emax, dE, _k, _Id, _Em: Real;
implementation
uses Unit3, Unit4;
function Formula (k0, X, E, _k, i, _Em: Real): Real; stdcall;
external 'DllFormulaDLL.dll' index 1
{$R *.dfm}
procedure TFMain. LoadDataFile (FileName: TFileName);
var
TempStr: string;
TempFile: TextFile;
begin
if FileExists (FileName) then
begin
AssignFile (TempFile, FileName);
Reset (TempFile);
try
Readln (TempFile, TempStr);
LabeledEdit1.Text := TempStr;
Readln (TempFile, TempStr);
LabeledEdit2.Text := TempStr;
Readln (TempFile, TempStr);
UpDown1.Position := StrToInt (TempStr);
Readln (TempFile, TempStr);
LabeledEdit4.Text := TempStr;
Readln (TempFile, TempStr);
LabeledEdit5.Text := TempStr;
Readln (TempFile, TempStr);
UpDown2.Position := StrToInt (TempStr);
Readln (TempFile, TempStr);
LabeledEdit7.Text := TempStr;
Readln (TempFile, TempStr);
LabeledEdit8.Text := TempStr;
Readln (TempFile, TempStr);
LabeledEdit9.Text := TempStr;
Readln (TempFile, TempStr);
LabeledEdit10.Text := TempStr;
finally
CloseFile (TempFile);
end;
end;
end;
procedure TFMain. SaveDataFile (FileName: TFileName);
var
TempFile: TextFile;
begin
AssignFile (TempFile, FileName);
Rewrite (TempFile);
try
Writeln (TempFile, LabeledEdit1. Text);
Writeln (TempFile, LabeledEdit2. Text);
Writeln (TempFile, LabeledEdit3. Text);
Writeln (TempFile, LabeledEdit4. Text);
Writeln (TempFile, LabeledEdit5. Text);
Writeln (TempFile, LabeledEdit6. Text);
Writeln (TempFile, LabeledEdit7. Text);
Writeln (TempFile, LabeledEdit8. Text);
Writeln (TempFile, LabeledEdit9. Text);
Writeln (TempFile, LabeledEdit10. Text);
finally
CloseFile (TempFile);
end;
end;
procedure TFMain. ShowHint (Sender: TObject);
begin
StatusBar.SimpleText := Application. Hint
end;
procedure TFMain. Exit (Sender: TObject);
begin
SaveDataFile ('Data.txt');
Close
end;
procedure TFMain. ExecCalc (Sender: TObject);
begin
WinExec ('Calc.exe', SW_NORMAL)
end;
function GetData: Boolean;
var
CurLE: TLabeledEdit;
begin
with FMain do
begin
Result := True;
CurLE := LabeledEdit1;
try
Xmin := StrToFloat (LabeledEdit1.Text);
CurLE := LabeledEdit2;
Xmax := StrToFloat (LabeledEdit2.Text);
CurLE := LabeledEdit4;
Emin := StrToFloat (LabeledEdit4.Text);
CurLE := LabeledEdit5;
Emax := StrToFloat (LabeledEdit5.Text);
CurLE := LabeledEdit7;
_k := StrToFloat (LabeledEdit7.Text);
CurLE := LabeledEdit8;
_Em := StrToFloat (LabeledEdit8.Text);
CurLE := LabeledEdit9;
_Id := StrToFloat (LabeledEdit9.Text);
CurLE := LabeledEdit10;
k0 := StrToFloat (LabeledEdit10.Text);
CurLE := LabeledEdit3;
MsSteps := StrToInt (LabeledEdit3.Text);
dX := (Xmax — Xmin) / (MsSteps — 1);
CurLE := LabeledEdit6;
MvSteps := StrToInt (LabeledEdit6.Text);
dE := (Emax — Emin) / (MvSteps — 1);
if (Xmin < 0.3) or (Xmax < 0.3) then
begin
MessageDlg ('Значение реактивного сопротивления должно быть не менее 0,3 Ом',
mtWarning, [mbOK], 0);
Result := False;
end;
if (Xmax > 2) or (Xmin > 2) then
begin
MessageDlg ('Значение реактивного сопротивления должно быть не более 2 Ом',
mtWarning, [mbOK], 0);
Result := False;
end;
if (Emin < 0.1) or (Emax < 0.1) then
begin
MessageDlg ('Эффективное значение электродвижущей силы должно быть не менее 0,1 В',
mtWarning, [mbOK], 0);
Result := False;
end;
if (Emax > 3) or (Emin > 3) then
begin
MessageDlg ('Эффективное значение электродвижущей силы должно быть не более 3 В',
mtWarning, [mbOK], 0);
Result := False;
end;
if (_k > 0.5) or (_k < 0.1) then
begin
MessageDlg ('Значение отношения эффективного тока вторичной обмотки'+
' к среднему выпрямленному току должно находиться в ' +
'пределах от 0,1 до 0,5 ', mtWarning, [mbOK], 0);
Result := False;
end;
if (_Em < 0.1) or (_Em > 0.5) then
begin
MessageDlg ('Значение коэффициента, учитывающего влияние омического'+
' падения напряжения в цепи переменного тока на среднее выпрямленное напряжение ' +
'должно находиться в пределах от 0,1 до 0,5', mtWarning, [mbOK], 0);
end;
if (_Id < 0.5) or (_Id > 1) then
begin
MessageDlg ('Величина выпрямленного тока должна находиться'+
' в пределах от 0,5 до 1 А', mtWarning, [mbOK], 0);
Result := False;
end;
if (k0 < 0.1) or (k0 > 0.5) then
begin
MessageDlg ('Отношение коэффициента трансформации на данной ступени'+
' регулирования к наименьшему коэффициенту трансформации должен находиться'+
' в пределах от 0,1 до 0,5', mtWarning, [mbOK], 0);
Result := False;
end;
if (Xmin >= Xmax) or (Xmin >= Xmax) then
begin
MessageDlg ('Минимальное значение должно быть меньше максимального',
mtWarning, [mbOK], 0);
Result := False;
end;
except
on EConvertError do
begin
MessageDlg ('Некорректно введены данные!', mtWarning, [mbOK], 0);
CurLE.SetFocus;
Result := False;
end;
on EZeroDivide do
begin
MessageDlg ('Количество шагов должно быть > 1!', mtWarning, [mbOK], 0);
CurLE.SetFocus;
Result := False;
end;
end;
end;
end;
procedure TFMain. Calculate (Sender: TObject);
var
i, j: Integer;
begin
if GetData then
begin
FCalc.sgRes.ColCount := MsSteps + 1;
FCalc.sgRes.RowCount := MvSteps + 1;
FCharts.Series1.Clear;
FCharts.Series2.Clear;
FCharts.Series3.Clear;
FCharts.Series4.Clear;
FCharts.LineSeries1.Clear;
FCharts.LineSeries2.Clear;
FCharts.LineSeries3.Clear;
for i := 0 to MsSteps — 1 do
for j := 0 to MvSteps — 1 do
FCalc.sgRes.Cells[i + 1, j + 1] := Format ('%0.2f',
[Formula (k0, Xmin + dX * i, Emin + dE * j, _k, _Id, _Em)]);
for i := 1 to MsSteps do
for j := 1 to MvSteps do
FCharts.Series4.AddXYZ (j, StrToFloat (FCalc.sgRes.Cells[i, j]), i);
//x
for i := 1 to MsSteps do
begin
FCalc.sgRes.Cells[i, 0] := Format ('%.0f Ом', [Xmin + dX * (i — 1)]);
FCalc.AutoSizeGridColumn (FCalc.sgRes, i);
end;
//x
for i := 1 to MvSteps do
FCalc.sgRes.Cells[0, i] := Format ('%.0f В', [Emin + dE * (i — 1)]);
FCalc.AutoSizeGridColumn (FCalc.sgRes, 0);
for i := 0 to MsSteps — 1 do
begin
FCharts.Series1.AddXY ((Xmin + dX * i) / 1000,
Formula (k0, Xmin + dX * i, Emin, _k, _Id, _Em) / 1000);
FCharts.Series2.AddXY ((Xmin + dX * i) / 1000,
Formula (k0, Xmin + dX * i, (Emin + Emax) / 2, _k, _Id, _Em) /
1000);
FCharts.Series3.AddXY ((Xmin + dX * i) / 1000,
Formula (k0, Xmin + dX * i, Emax, _k, _Id, _Em) / 1000);
end;
for i := 0 to MvSteps — 1 do
begin
FCharts.LineSeries1.AddXY ((Emin + dE * i) / 1000,
Formula (k0, Xmin, Emin + dE * i, _k, _Id, _Em) / 1000);
FCharts.LineSeries2.AddXY ((Emin + dE * i) / 1000,
Formula (k0, (Xmin + Xmax) / 2, Emin + dE * i, _k, _Id, _Em) /
1000);
FCharts.LineSeries3.AddXY ((Emin + dE * i) / 1000,
Formula (k0, Xmax, Emin + dE * i, _k, _Id, _Em) / 1000);
end;
FCalc.ShowModal;
end;
end;
procedure TFMain. FormCreate (Sender: TObject);
begin
LoadDataFile ('Data.txt');
Application.OnHint := ShowHint
end;
procedure TFMain. leFloatKeyPress (Sender: TObject; var Key: Char);
begin
case Key of
'0'.'9', #8:;
'.', ',': Key := DecimalSeparator
else
Key := #0;
end;
end;
procedure TFMain. leIntKeyPress (Sender: TObject; var Key: Char);
begin
case Key of
'0'.'9', #8:;
Else
Key := #0;
end;
end;
procedure TFMain. leIntKeyUp (Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (TLabeledEdit (Sender).Text = '') or
(StrToInt (TLabeledEdit (Sender).Text) <= 1) then
TLabeledEdit (Sender).Text := '2';
end;
procedure TFMain. ShowAboutProgram (Sender: TObject);
begin
FAbout.ShowModal;
end;
procedure TFMain. N4Click (Sender: TObject);
begin
OpenDlg.InitialDir := ExtractFilePath (Application.ExeName);
if OpenDlg. Execute then
LoadDataFile (OpenDlg.FileName);
end;
procedure TFMain. N5Click (Sender: TObject);
begin
SaveDlg.InitialDir := ExtractFilePath (Application.ExeName);
if SaveDlg. Execute then
begin
if Pos ('.txt', SaveDlg. FileName) = 0 then
SaveDlg.FileName := SaveDlg. FileName + '.txt';
SaveDataFile (SaveDlg.FileName);
end;
end;
procedure TFMain. FormCloseQuery (Sender: TObject; var CanClose: Boolean);
begin
case MessageDlg ('Вы действительно хотите выйти из программы?', mtConfirmation,
mbOKCancel, 0) of
mrOK: CanClose :=True;
mrCancel: CanClose := False;
end;
end;
procedure TFMain. bbHelpClick (Sender: TObject);
begin
ShellExecute (handle, nil, PChar (ExtractFilePath (ParamStr (0))+ 'spravka.chm'), nil, nil, SW_SHOW); // Вызов справки
end;
procedure TFMain. N10Click (Sender: TObject);
begin
ShellExecute (handle, nil, PChar (ExtractFilePath (ParamStr (0))+ 'spravka.chm'), nil, nil, SW_SHOW); // Вызов справки
end;
end.
ФОРМА 2
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Buttons, ComCtrls, ComObj, Printers, shellapi;
type
TFCalc = class (TForm)
Label1: TLabel;
sgRes: TStringGrid;
GroupBox1: TGroupBox;
bbExcel: TBitBtn;
bbWord: TBitBtn;
bbHTML: TBitBtn;
bbChart: TBitBtn;
bbHelp: TBitBtn;
bbPrint: TBitBtn;
bbExit: TBitBtn;
StatusBar1: TStatusBar;
SaveDlg: TSaveDialog;
PrintDialog1: TPrintDialog;
procedure FormCreate (Sender: TObject);
procedure bbExitClick (Sender: TObject);
procedure bbChartClick (Sender: TObject);
procedure bbHTMLClick (Sender: TObject);
procedure bbWordClick (Sender: TObject);
procedure bbExcelClick (Sender: TObject);
procedure bbPrintClick (Sender: TObject);
procedure AutoSizeGridColumn (Grid: TStringGrid; Column: Integer);
procedure bbHelpClick (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FCalc: TFCalc;
implementation
uses Unit3;
{$R *.dfm}
procedure TFCalc. AutoSizeGridColumn (Grid: TStringGrid; Column: Integer);
var
i, Temp, Max: Integer;
begin
Max := 0;
for i := 0 to Grid. RowCount do
begin
Temp := Grid.Canvas.TextWidth (Grid.Cells[Column, i]);
if Temp > Max then
Max := Temp;
end;
Grid.ColWidths[Column] := Max + 3 + Grid. GridLineWidth;
end;
procedure TFCalc. FormCreate (Sender: TObject);
begin
bbExcel.Caption := 'Сохранить в'#13'MS Excel';
bbWord.Caption := 'Сохранить в'#13'MS Word';
bbHTML.Caption := 'Сохранить'#13'в HTML';
bbPrint.Caption := 'Распечатать'#13'таблицу';
bbChart.Caption := 'Графики';
bbHelp.Caption := 'Справка';
bbExit.Caption := 'Закрыть'#13'окно'
end;
procedure TFCalc. bbExitClick (Sender: TObject);
begin
Close
end;
procedure TFCalc. bbChartClick (Sender: TObject);
begin
FCharts.ShowModal;
end;
procedure TFCalc. bbHTMLClick (Sender: TObject);
var
HTMLFile: TextFile;
i, j: Integer;
begin
SaveDlg.DefaultExt := 'html';
SaveDlg.Filter := 'HTML-файл (*.html)|*.html';
SaveDlg.FileName := 'Результаты расчетов';
if SaveDlg. Execute then
begin
AssignFile (HTMLFile, SaveDlg. FileName);
Rewrite (HTMLFile);
Writeln (HTMLFile, '');
Writeln (HTMLFile, '
');Writeln (HTMLFile, '
');Writeln (HTMLFile, '');
Writeln (HTMLFile, '');
Writeln (HTMLFile, '
');Writeln (HTMLFile, '
'
');Writeln (HTMLFile, '
');for i := 0 to sgRes. RowCount do
begin
Writeln (HTMLFile, '
');for j := 0 to sgRes. ColCount do
if (j = 0) or (i = 0) then
Writeln (HTMLFile, '
' + sgRes.Cells[j, i] + '') else Writeln (HTMLFile, ' | ' + sgRes. Cells[j, i]); end; Writeln (HTMLFile, ' |
Writeln (HTMLFile, '
');Writeln (HTMLFile, '
');CloseFile (HTMLFile);
end;
end;
procedure TFCalc. bbWordClick (Sender: TObject);
var
WordApp, NewDoc, WordTable: OLEVariant;
iRows, iCols, iGridRows, jGridCols: Integer;
begin
SaveDlg.DefaultExt := 'doc';
SaveDlg.Filter := 'Документ MS Word (*.doc)|*.doc';
SaveDlg.FileName := 'Результаты расчетов';
if not SaveDlg. Execute then
Exit;
try
WordApp := CreateOleObject ('Word.Application');
except
Exit
end;
NewDoc := WordApp.Documents.Add;
iCols := sgRes. ColCount;
iRows := sgRes. RowCount;
WordTable := NewDoc.Tables.Add (WordApp.Selection.Range, iRows, iCols);
WordTable.Range.Font.Size := 8;
for iGridRows := 1 to iRows do
for jGridCols := 1 to iCols do
WordTable.Cell (iGridRows, jGridCols).Range.Text :=
sgRes.Cells[jGridCols — 1, iGridRows — 1];
WordApp.ActiveDocument.SaveAs (SaveDlg.FileName);
WordApp.Quit;
WordApp := Unassigned;
NewDoc := Unassigned;
WordTable := Unassigned;
end;
procedure TFCalc. bbExcelClick (Sender: TObject);
var
XLApp, Sheet, Column: Variant;
i, j, m, n: Integer;
begin
SaveDlg.DefaultExt := 'xls';
SaveDlg.Filter := 'Документ MS Excel (*.xls)|*.xls';
SaveDlg.FileName := 'Результаты расчетов';
if not SaveDlg. Execute then
Exit;
try
XLApp := CreateOleObject ('Excel.Application');
except
Exit
end;
XLApp.WorkBooks.Add (-4167);
XLApp.WorkBooks[1]. WorkSheets[1].Name := 'Результаты расчетов';
Column := XLApp. WorkBooks[1]. WorkSheets['Результаты расчетов']. Columns;
n := sgRes. ColCount;
m := sgRes. RowCount;
for i := 1 to m + 1 do
Column := XLApp. WorkBooks[1]. WorkSheets['Результаты расчетов']. Rows;
Column.Columns[1].Font.Bold := True;
Column.Rows[1]. Font. Bold := True;
Column.Rows[1]. Font. Italic := True;
Column.Rows[2]. Font. Bold := True;
Sheet := XLApp. WorkBooks[1]. WorkSheets['Результаты расчетов'];
FCalc.Enabled := False;
for i := 0 to n do
for j := 0 to m do
Sheet.Cells[j + 2, i + 1] := '''' + sgRes. Cells[i, j];
FCalc.Enabled := True;
Sheet.Cells[1, 2] := Label1. Caption;
XLApp.ActiveWorkBook.SaveAs (SaveDlg.FileName);
XLApp.Quit
end;
procedure TFCalc. bbPrintClick (Sender: TObject);
var
X1, X2: Integer;
Y1, Y2: Integer;
TmpI: Integer;
F: Integer;
TR: TRect;
OldOrientation: TPrinterOrientation;
begin
OldOrientation := Printer. Orientation;
Printer.Orientation := poLandScape;
if PrintDialog1. Execute then
begin
Printer.Title := Label1. Caption;
Printer.BeginDoc;
Printer.Canvas.Pen.Color := 0;
Printer.Canvas.Font.Name := 'Times New Roman';
Printer.Canvas.Font.Size := 12;
Printer.Canvas.Font.Style := [fsBold, fsUnderline];
Printer.Canvas.TextOut (0, 100, Printer. Title);
for F := 1 to sgRes. ColCount — 1 do
begin
X1 := 0;
for TmpI := 1 to (F — 1) do
X1 := X1 + 5 * (sgRes.ColWidths[TmpI]);
Y1 := 300;
X2 := 0;
for TmpI := 1 to F do
X2 := X2 + 5 * (sgRes.ColWidths[TmpI]);
Y2 := 450;
TR := Rect (X1, Y1, X2 — 30, Y2);
Printer.Canvas.Font.Style := [fsBold];
Printer.Canvas.Font.Size := 7;
Printer.Canvas.TextRect (TR, X1 + 50, 350, sgRes. Cells[F, 0]);
Printer.Canvas.Font.Style := [];
for TmpI := 1 to sgRes. RowCount — 1 do
begin
Y1 := 150 * TmpI + 300;
Y2 := 150 * (TmpI + 1) + 300;
TR := Rect (X1, Y1, X2 — 30, Y2);
Printer.Canvas.TextRect (TR, X1 + 50, Y1 + 50, sgRes. Cells[F, TmpI]);
end;
end;
Printer.EndDoc;
end;
Printer.Orientation := OldOrientation;
end;
procedure TFCalc. bbHelpClick (Sender: TObject);
begin
ShellExecute (handle, nil, PChar (ExtractFilePath (ParamStr (0))+ 'spravka.chm'), nil, nil, SW_SHOW); // Вызов справки
end;
end.
ФОРМА 3
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart,
TeeSurfa, Printers;
type
TFCharts = class (TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
Chart1: TChart;
Series1: TLineSeries;
Series2: TLineSeries;
Series3: TLineSeries;
Chart2: TChart;
LineSeries1: TLineSeries;
LineSeries2: TLineSeries;
LineSeries3: TLineSeries;
Chart3: TChart;
Series4: TSurfaceSeries;
Button1: TButton;
Button2: TButton;
Button3: TButton;
PrintDlg: TPrintDialog;
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
procedure Button3Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FCharts: TFCharts;
implementation
uses Unit2, Unit1, shellapi;
{$R *.dfm}
procedure TFCharts. Button1Click (Sender: TObject);
begin
Close
end;
procedure TFCharts. Button2Click (Sender: TObject);
begin
ShellExecute (handle, nil, PChar (ExtractFilePath (ParamStr (0))+ 'spravka.chm'), nil, nil, SW_SHOW); // Вызов справки
end;
procedure TFCharts. Button3Click (Sender: TObject);
var
pHeight, pWidth: Longint;
OldOrientation: TPrinterOrientation;
TempChart: TChart;
begin
if PrintDlg. Execute then
begin
case PageControl1. TabIndex of
0: TempChart := Chart1;
1: TempChart := Chart2;
2: TempChart := Chart3;
end;
Screen.Cursor := crHourGlass;
OldOrientation := Printer. Orientation;
Printer.Orientation := poLandScape;
try
Printer.BeginDoc;
try
pHeight := Printer. PageHeight;
pWidth := Printer. PageWidth;
TempChart.PrintPartial (Rect (pWidth div 15, pHeight div 10,
pWidth — (pWidth div 20), pHeight — (pHeight div 20)));
Printer.EndDoc;
except
on Exception do
begin
Printer.Abort;
Printer.EndDoc;
raise;
end
end;
finally
Printer.Orientation := OldOrientation;
Screen.Cursor := crDefault
end
end;
end;
end.
ФОРМА 4
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons, Shellapi;
type
TFAbout = class (TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Label1: TLabel;
GroupBox4: TGroupBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Timer1: TTimer;
Image1: TImage;
procedure tAnimationTimer (Sender: TObject);
procedure FormDestroy (Sender: TObject);
procedure FormShow (Sender: TObject);
procedure BitBtn2Click (Sender: TObject);
procedure BitBtn3Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FAbout: TFAbout;
y:integer;
implementation
{$R *.dfm}
procedure TFAbout. tAnimationTimer (Sender: TObject);
var
x: integer;
begin
Image1.Canvas.Pen.Color := clWhite;
Image1.Canvas.Rectangle (0,0,Image1. Width, Image1. Height);
Image1.Canvas.Pen.Color := clBlack;
Image1.Canvas.MoveTo (0, trunc (30*sin (y))+40);
for x := 0 to Image1. ClientWidth do // От левого края до конца формы
begin
Image1.Canvas.LineTo (x, trunc (30*sin (x/10+y))+40); // Собственно, рисуем график
end;
y:=y+1;
end;
procedure TFAbout. FormDestroy (Sender: TObject);
begin
Timer1.Enabled := False;
end;
procedure TFAbout. FormShow (Sender: TObject);
begin
Timer1.Enabled := True;
end;
procedure TFAbout. BitBtn2Click (Sender: TObject);
begin
ShellExecute (handle, nil, PChar (ExtractFilePath (ParamStr (0))+ 'spravka.chm'), nil, nil, SW_SHOW); // Вызов справки
end;
procedure TFAbout. BitBtn3Click (Sender: TObject);
var
x: integer;
begin
Image1.Canvas.Pen.Color := clBlack; // Рисуем голубым цветом
Image1.Canvas.MoveTo (0, 100); // Устанавливаем точку начала рисования
for x := 0 to Image1. ClientWidth do // От левого края до конца формы
begin
Image1.Canvas.LineTo (x, trunc (30*sin (x/10))+40); // Собственно, рисуем график
end;
end;
end.
DLL
library FormulaDLL;
{$R *.res}
function Formula (k0,X, E, k, Id, Em: Real): Real; stdcall;
begin
Result := ((2*sqrt (2))/(3.14*k))-((2*Em*Id*X*k0)/(3.14*E*k))
end;
//k — отношение эффективного тока вторичной обмотки трансформатора к среднему выпрямленному току
//Em — коэффициент, учитывающий влияние омического падения напряжения в цепи переменного тока на среднее выпрямленное напряжение
//Id — величина выпрямленного тока
//X — (завис) реактивное сопротивление
//k0 -отношение коэффициента трансформации на данной ступени регулирования к наименьшему коэффициенту трансформации, при котором получается номинальная электродвижущая сила хода вторичной обмотки трансформатора
//E — (завис) эффективное значение электродвижущей силы
exports Formula index 1;
begin
end.