keulkulator/unit1.pas
2023-10-06 20:53:16 +02:00

588 lines
16 KiB
ObjectPascal

unit Unit1;
{$mode objfpc}{$H+}
{
This file is part of Keulkulator.
Keulkulator is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Keulkulator is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Keulkulator. If not, see <http://www.gnu.org/licenses/>.
}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
ExtCtrls, ComCtrls, StdCtrls, Spin, LazHelpHTML, LCLIntf, Buttons, ECSwitch,
math, UData, Unit2, Unit3;
type
{ TMainForm }
TMainForm = class(TForm)
BtMatEdit: TButton;
CBMaterial: TComboBox;
ECSwitch1: TECSwitch;
EdFile: TEdit;
EdHflx: TEdit;
EdStrom: TEdit;
EdLeistung: TEdit;
FlSpStaerke: TFloatSpinEdit;
FlSpmm: TFloatSpinEdit;
FlSpAWG: TFloatSpinEdit;
FlSpBreite: TFloatSpinEdit;
FlSpSpannung: TFloatSpinEdit;
FlSpWeg: TFloatSpinEdit;
FlSpWiderstand: TFloatSpinEdit;
FlSpDurchmesser: TFloatSpinEdit;
GroupBox1: TGroupBox;
HTMLBrowserHelpViewer1: THTMLBrowserHelpViewer;
HTMLHelpDatabase1: THTMLHelpDatabase;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Label1: TLabel;
Label10: TLabel;
Label11: TLabel;
Label13: TLabel;
Label14: TLabel;
Label19: TLabel;
LaOhmAb: TLabel;
LaOhmHalb: TLabel;
LaOhmAuf: TLabel;
Label18: TLabel;
LaWindAb: TLabel;
LaWindHalb: TLabel;
LaWindAuf: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
LaWindungen: TLabel;
Label12: TLabel;
LaLaenge: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
MainMenu: TMainMenu;
MDatei: TMenuItem;
MBeenden: TMenuItem;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
MenuItem3: TMenuItem;
MenuItem4: TMenuItem;
MHilfe: TMenuItem;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
RaBSingle: TRadioButton;
RaBDual: TRadioButton;
RaBQuad: TRadioButton;
SaveDialog1: TSaveDialog;
Shape1: TShape;
SpBSwitch: TSpeedButton;
StatusBar1: TStatusBar;
procedure BtMatEditClick(Sender: TObject);
procedure CBMaterialChange(Sender: TObject);
procedure ECSwitch1Change(Sender: TObject);
procedure FlSpAWGChange(Sender: TObject);
procedure FlSpBreiteChange(Sender: TObject);
procedure FlSpDurchmesserChange(Sender: TObject);
procedure FlSpmmChange(Sender: TObject);
procedure FlSpSpannungChange(Sender: TObject);
procedure FlSpStaerkeChange(Sender: TObject);
procedure FlSpWegChange(Sender: TObject);
procedure FlSpWiderstandChange(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure MBeendenClick(Sender: TObject);
procedure MenuItem1Click(Sender: TObject);
procedure MenuItem2Click(Sender: TObject);
procedure MenuItem3Click(Sender: TObject);
procedure MenuItem4Click(Sender: TObject);
procedure RaBDualChange(Sender: TObject);
procedure RaBQuadChange(Sender: TObject);
procedure RaBSingleChange(Sender: TObject);
procedure CalculateWraps;
procedure SpBSwitchClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
MainForm: TMainForm;
Durchmesser, Drahtstaerke, FBreite, FStaerke, Wunschohm, Ohmm, Laenge,
Wicklungszahl, Weg, Coils, vohm, vhohm, vpohm, Hflx,
urip_u, urip_r, urip_i, urip_p : Float;
vwraps, vhwraps, vpwraps : String;
Flachdraht : Boolean;
implementation
{$R *.lfm}
{ TMainForm }
function AWGTomm(AWG : Integer) : Float; // Umwandlung AWG (Gauge) in Millimeter
begin
AWGTomm := 0.127 * (92 ** ((36 - AWG)/39));
end;
function mmToAWG(mm : Float) : Integer; // Umwandlung Millimeter in AWG (Gauge)
var AW : Float;
begin
AW := -39 * logn(92, (mm / 0.127)) + 36;
mmToAWG := round(AW);
end;
function ohmpermeter(rho, d : Float) : Float; // Errechnen Ohm/m
begin
ohmpermeter := rho * (1 / (PI * (power(d,2) / 4)));
end;
function ohmpermeter_flat(rho, breite, staerke : Float) : Float; // Errechnen Ohm/m für Flachdraht
begin
ohmpermeter_flat := rho * (1 / (breite * staerke));
end;
procedure TMainForm.CalculateWraps; // Wicklungen berechnen
var
Radius, Umfang, Wohm, pvh, pvg : Float;
dz : Integer;
begin
Wohm := Wunschohm * Coils;
Laenge := Wohm * 1000 / Ohmm;
Radius := Durchmesser / 2;
Radius := Radius + Drahtstaerke;
Umfang := 2 * pi * Radius;
Wicklungszahl := (Laenge - Weg) / Umfang;
dz := trunc(Wicklungszahl);
vwraps := IntToStr(dz) + '.0'; // ganze Wicklung
vhwraps := IntToStr(dz) + '.5'; // + halbe Wicklung
vpwraps := IntToStr(dz+1) + '.0'; // ganze Wicklung + 1
vohm := (Umfang * dz + Weg * 2) * Ohmm / 1000;
pvh := (Umfang / 2) * Ohmm / 1000;
vhohm := vohm + pvh;
pvg := Umfang * Ohmm / 1000;
vpohm := vohm + pvh + pvg;
urip_r := (Umfang * Wicklungszahl + Weg * 2) * Ohmm / 1000;
urip_r := urip_r / Coils;
urip_i := urip_u / urip_r;
urip_p := urip_u * urip_i;
LaLaenge.Caption := FloatToStrF(Laenge,ffFixed,2,2);
LaWindungen.Caption := FloatToStrF(Wicklungszahl,ffFixed,2,2);
LaWindAb.Caption := vwraps;
LaWindHalb.Caption := vhwraps;
LaWindAuf.Caption := vpwraps;
LaOhmAb.Caption := FloatToStrF(vohm,ffFixed,2,2) + ' Ω';
LaOhmHalb.Caption := FloatToStrF(vhohm,ffFixed,2,2) + ' Ω';
LaOhmAuf.Caption := FloatToStrF(vpohm,ffFixed,2,2) + ' Ω';
EdStrom.Caption := FloatToStrF(urip_i,ffFixed,2,2);
EdLeistung.Caption := FloatToStrF(urip_p,ffFixed,2,2);
if urip_i >= 10.0 then
begin
Shape1.Pen.Color := clRed;
Shape1.Brush.Color := clRed
end
else
Shape1.Pen.Color := clGreen;
Hflx := (urip_p*1000)/(2*PI*(Drahtstaerke/2)*Laenge);
EdHflx.Caption := FloatToStrF(Hflx,ffFixed,4,0);
if Hflx < 775 then
begin
Shape1.Pen.Color := RGBToColor(234, 190, 14);
Shape1.Brush.Color := RGBToColor(234, 190, 14)
end;
if Hflx < 550 then
begin
Shape1.Pen.Color := clLime;
Shape1.Brush.Color := clLime
end;
if Hflx < 325 then
begin
Shape1.Pen.Color := clAqua;
Shape1.Brush.Color := clAqua
end;
if Hflx >= 775 then
begin
Shape1.Pen.Color := clRed;
Shape1.Brush.Color := clRed
end;
end;
procedure TMainForm.SpBSwitchClick(Sender: TObject); // Breite und Stärke tauschen
var ValTmp : Double;
begin
ValTmp := FlSpBreite.Value;
FlSpBreite.Value := FlSpStaerke.Value;
FlSpStaerke.Value := ValTmp;
CalculateWraps;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
InitData; // Werte initialisieren
CBMaterial.Items := materialien;
Durchmesser := 3.0;
Wunschohm := 0.5;
if Flachdraht then
Ohmm := ohmpermeter_flat(spezwid[0], 0.25, 0.12)
else
Ohmm := ohmpermeter(spezwid[0], 0.4);
Drahtstaerke := 0.4;
Weg := 1.0;
Coils := 1.0;
urip_u := 3.6;
urip_i := 7.23;
urip_p := 26.76;
if urip_i >= 10.0 then
EdStrom.Font.Color := clRed
else
EdStrom.Font.Color := clGreen;
Flachdraht := false
end;
procedure TMainForm.MBeendenClick(Sender: TObject);
begin
application.terminate;
end;
procedure TMainForm.MenuItem1Click(Sender: TObject);
var
CoilSetup : TStringList;
filename : string;
begin
CoilSetup := TStringList.Create;
CoilSetup.Add(CBMaterial.Items[CBMaterial.ItemIndex]);
CoilSetup.Add(FloatToStrF(FlSpmm.Value,ffFixed,2,2));
CoilSetup.Add(FloatToStrF(FlSpWiderstand.Value,ffFixed,2,2));
CoilSetup.Add(FloatToStrF(FlSpDurchmesser.Value,ffFixed,2,2));
CoilSetup.Add(FloatToStrF(FlSpWeg.Value,ffFixed,2,2));
CoilSetup.Add(FloatToStrF(Coils,ffFixed,1,1));
CoilSetup.Add(FloatToStrF(FlSpBreite.Value,ffFixed,2,2));
CoilSetup.Add(FloatToStrF(FlSpStaerke.Value,ffFixed,2,2));
if Flachdraht then
CoilSetup.Add('f')
else
CoilSetup.Add('r');
if SaveDialog1.Execute then
begin
if FileExists(SaveDialog1.FileName) then
if MessageDlg('Datei überschreiben', 'Die Datei ' + ExtractFileName(SaveDialog1.FileName) + ' existiert bereits! Datei überschreiben?',
mtConfirmation, [mbYes, mbNo],0) = mrYes then
begin
filename := SaveDialog1.Filename;
CoilSetup.SaveToFile(filename);
EdFile.Text := ExtractFileName(SaveDialog1.FileName)
end;
if not FileExists(SaveDialog1.FileName) then
begin
filename := SaveDialog1.Filename;
CoilSetup.SaveToFile(filename);
EdFile.Text := ExtractFileName(SaveDialog1.FileName)
end;
end;
CoilSetup.Free;
end;
procedure TMainForm.MenuItem2Click(Sender: TObject);
var
CoilSetup : TStringList;
filename : string;
Mater, mil, Widerst, Durchm, We, Cls, Bre, Stae : string;
i : Integer;
begin
CoilSetup := TStringList.Create;
if OpenDialog1.Execute then
begin
filename := OpenDialog1.Filename;
CoilSetup.LoadFromFile(filename);
Mater := CoilSetup[0];
mil := CoilSetup[1];
Widerst := CoilSetup[2];
Durchm := CoilSetup[3];
We := CoilSetup[4];
Cls := CoilSetup[5];
if CoilSetup.Count < 7 then
begin
Bre := '0.25';
Stae := '0.12';
ECSwitch1.Checked := false;
Flachdraht := false;
Label3.Caption:='mm';
Label4.Caption:='AWG';
FlSpmm.Visible:=true;
FlSpAWG.Visible:=true;
FlSpBreite.Visible:=false;
FlSpStaerke.Visible:=false;
Drahtstaerke := FlSpmm.Value;
Ohmm := ohmpermeter(spezwid[CBMaterial.ItemIndex], Drahtstaerke);
ShowMessage('Alte Sicherungsdatei!');
end
else
begin
Bre := CoilSetup[6];
Stae := CoilSetup[7];
if CoilSetup[8] = 'f' then
begin
ECSwitch1.Checked := true;
Flachdraht := true;
Label3.Caption:='Breite';
Label4.Caption:='Stärke';
FlSpmm.Visible:=false;
FlSpAWG.Visible:=false;
FlSpBreite.Visible:=true;
FlSpStaerke.Visible:=true;
FBreite := FlSpBreite.Value;
FStaerke := FlSpStaerke.Value;
Ohmm := ohmpermeter_flat(spezwid[CBMaterial.ItemIndex], FBreite, FStaerke);
end
else
begin
ECSwitch1.Checked := false;
Flachdraht := false;
Label3.Caption:='mm';
Label4.Caption:='AWG';
FlSpmm.Visible:=true;
FlSpAWG.Visible:=true;
FlSpBreite.Visible:=false;
FlSpStaerke.Visible:=false;
Drahtstaerke := FlSpmm.Value;
Ohmm := ohmpermeter(spezwid[CBMaterial.ItemIndex], Drahtstaerke);
end;
end;
for i := 0 to materialien.Count -1 do
if Mater = materialien[i] then
begin
CBMaterial.Text := materialien[i];
CBMaterial.ItemIndex := i;
end;
FlSpmm.value := MyStrToFloat(mil);
FlSpAWG.Value := mmToAWG(FlSpmm.Value);
FlSpBreite.Value := MyStrToFloat(bre);
FlSpStaerke.Value := MyStrToFloat(stae);
Drahtstaerke := FlSpmm.Value;
FBreite := FlSpBreite.Value;
FStaerke := FlSpStaerke.Value;
if Flachdraht then
Ohmm := ohmpermeter_flat(spezwid[CBMaterial.ItemIndex], FBreite, FStaerke)
else
Ohmm := ohmpermeter(spezwid[CBMaterial.ItemIndex], Drahtstaerke);
FlSpWiderstand.Value := MyStrToFloat(Widerst);
Wunschohm := FlSpWiderstand.Value;
FlSpDurchmesser.Value := MyStrToFloat(Durchm);
Durchmesser := FlSpDurchmesser.Value;
FlSpWeg.Value := MyStrToFloat(We);
Weg := FlSpWeg.Value;
case trunc(MyStrToFloat(Cls)) of
1: RaBSingle.Checked := true;
2: RaBDual.Checked := true;
4: RaBQuad.Checked := true;
end;
if RaBSingle.Checked then Coils := 1.0;
if RaBDual.Checked then Coils := 2.0;
if RaBQuad.Checked then Coils := 4.0;
CalculateWraps;
EdFile.Text := ExtractFileName(OpenDialog1.FileName)
end;
CoilSetup.Free;
end;
procedure TMainForm.MenuItem3Click(Sender: TObject);
begin
FUeber.ShowModal;
end;
procedure TMainForm.MenuItem4Click(Sender: TObject);
begin
OpenURL('docs/help.html');
end;
procedure TMainForm.RaBDualChange(Sender: TObject);
begin
if RaBSingle.Checked then Coils := 1.0;
if RaBDual.Checked then Coils := 2.0;
if RaBQuad.Checked then Coils := 4.0;
CalculateWraps;
end;
procedure TMainForm.RaBQuadChange(Sender: TObject);
begin
if RaBSingle.Checked then Coils := 1.0;
if RaBDual.Checked then Coils := 2.0;
if RaBQuad.Checked then Coils := 4.0;
CalculateWraps;
end;
procedure TMainForm.RaBSingleChange(Sender: TObject);
begin
if RaBSingle.Checked then Coils := 1.0;
if RaBDual.Checked then Coils := 2.0;
if RaBQuad.Checked then Coils := 4.0;
CalculateWraps;
end;
procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
application.terminate;
end;
procedure TMainForm.FlSpAWGChange(Sender: TObject);
begin
FlSpmm.Value := AWGTomm(trunc(FlSpAWG.Value));
Drahtstaerke := FlSpmm.Value;
Ohmm := ohmpermeter(spezwid[CBMaterial.ItemIndex], Drahtstaerke);
CalculateWraps;
end;
procedure TMainForm.FlSpBreiteChange(Sender: TObject);
begin
FBreite := FlSpBreite.Value;
FStaerke := FlSpStaerke.Value;
Ohmm := ohmpermeter_flat(spezwid[CBMaterial.ItemIndex], FBreite, FStaerke);
CalculateWraps;
end;
procedure TMainForm.FlSpDurchmesserChange(Sender: TObject);
begin
Durchmesser := FlSpDurchmesser.Value;
CalculateWraps;
end;
procedure TMainForm.FlSpmmChange(Sender: TObject);
begin
FlSpAWG.Value := mmToAWG(FlSpmm.Value);
Drahtstaerke := FlSpmm.Value;
Ohmm := ohmpermeter(spezwid[CBMaterial.ItemIndex], Drahtstaerke);
CalculateWraps;
end;
procedure TMainForm.FlSpSpannungChange(Sender: TObject);
begin
urip_u := FlSpSpannung.Value;
CalculateWraps;
EdStrom.Caption := FloatToStrF(urip_i,ffFixed,2,2);
EdLeistung.Caption := FloatToStrF(urip_p,ffFixed,2,2);
if urip_i >= 10.0 then
Label13.Font.Color := clRed
else
Label13.Font.Color := clGreen
end;
procedure TMainForm.FlSpStaerkeChange(Sender: TObject);
begin
FBreite := FlSpBreite.Value;
FStaerke := FlSpStaerke.Value;
Ohmm := ohmpermeter_flat(spezwid[CBMaterial.ItemIndex], FBreite, FStaerke);
CalculateWraps;
end;
procedure TMainForm.FlSpWegChange(Sender: TObject);
begin
Weg := FlSpWeg.Value;
CalculateWraps;
end;
procedure TMainForm.FlSpWiderstandChange(Sender: TObject);
begin
Wunschohm := FlSpWiderstand.Value;
CalculateWraps;
end;
procedure TMainForm.CBMaterialChange(Sender: TObject);
begin
FBreite := FlSpBreite.Value;
FStaerke := FlSpStaerke.Value;
if Flachdraht then
Ohmm := ohmpermeter_flat(spezwid[CBMaterial.ItemIndex], FBreite, FStaerke)
else
Ohmm := ohmpermeter(spezwid[CBMaterial.ItemIndex], Drahtstaerke);
CalculateWraps;
end;
procedure TMainForm.ECSwitch1Change(Sender: TObject);
begin
if ECSwitch1.Checked then
begin
Flachdraht := true;
Label3.Caption:='Breite';
Label4.Caption:='Stärke';
FlSpmm.Visible:=false;
FlSpAWG.Visible:=false;
FlSpBreite.Visible:=true;
FlSpStaerke.Visible:=true;
FBreite := FlSpBreite.Value;
FStaerke := FlSpStaerke.Value;
Ohmm := ohmpermeter_flat(spezwid[CBMaterial.ItemIndex], FBreite, FStaerke);
SpBSwitch.Visible := true;
end
else
begin
Flachdraht := false;
Label3.Caption:='mm';
Label4.Caption:='AWG';
FlSpmm.Visible:=true;
FlSpAWG.Visible:=true;
FlSpBreite.Visible:=false;
FlSpStaerke.Visible:=false;
Drahtstaerke := FlSpmm.Value;
Ohmm := ohmpermeter(spezwid[CBMaterial.ItemIndex], Drahtstaerke);
SpBSwitch.Visible := false;
end;
CalculateWraps;
end;
procedure TMainForm.BtMatEditClick(Sender: TObject);
begin
MatEditor.ShowModal;
CBMaterial.Items := materialien;
CBMaterial.ItemIndex := 0;
Durchmesser := 3.0;
Wunschohm := 0.5;
if Flachdraht then
Ohmm := ohmpermeter_flat(spezwid[0], 0.25, 0.12)
else
Ohmm := ohmpermeter(spezwid[0], 0.4);
Drahtstaerke := 0.4;
FBreite := 0.25;
FStaerke := 0.12;
Weg := 1.0;
Coils := 1.0;
urip_u := 3.6;
urip_i := 7.23;
urip_p := 26.76;
if urip_i >= 10.0 then
EdStrom.Font.Color := clRed
else
EdStrom.Font.Color := clGreen;
CalculateWraps;
end;
end.