procedure TFanucForm.NC_programm;
const
hundert: double = 100;
halbieren_asm: double = 2;
var
nZaehler : integer;
int : ^integer;
liste : TStringList;
D_Ist : double;
D_von : double;
D_bis : double;
AP : double;
ersteRate : double;
Rate : double;
H : double;
apX : double;
apMin : double;
Summe : double;
ergebnis_asm: double;
begin
int := @nZaehler;
Abbruch := false;
nZaehler := 0;
H := 0;
apX := 0;
D_Ist := 0;
Summe := 0;
try
D_von := StrToFloat(EditTextToString(MinEdit).Replace(#46, #44));
D_bis := StrToFloat(EditTextToString(MaxEdit).Replace(#46, #44));
AP := StrToFloat(EditTextToString(APEdit).Replace(#46, #44));
ersteRate := StrToFloat(EditTextToString(ersteRateEdit).Replace(#46, #44));
ersteRate := ersteRate / hundert;
Rate := StrToFloat(EditTextToString(RateEdit).Replace(#46, #44));
Rate := Rate / hundert;
apMin := StrToFloat(EditTextToString(APMinEdit).Replace(#46, #44));
except
exit;
end;
if not((D_bis > 0)
or (D_von > 0))
then
exit
else if (D_von = D_bis)
then
exit
else if not(AP > 0)
then
begin
ShowMessage('
Schnitttiefe <ap> kann nicht berechnet werden.');
exit;
end
else if not(apMin > 0)
then
begin
ShowMessage('
mind. Schnitttiefe <apMin> kann nicht berechnet werden.');
exit;
end
else if (AP < apMin)
then
begin
ShowMessage('
Schnitttiefe <ap> kleiner als mind. Schnitttiefe <apMin>.');
exit;
end
else if not(Rate > 0)
then
begin
ShowMessage('
Zustellung Rate <%> kann nicht berechnet werden.');
exit;
end
else if not(ersteRate > 0)
then
begin
ShowMessage('
1. Zustellung Rate <&> kann nicht berechnet werden.');
exit;
end;
if (D_bis > D_von)
then
bearbeitung.innen := true;
if (D_von > D_bis)
then
bearbeitung.aussen := true;
liste := TStringList.Create;
SetLength(
data1,
3);
repeat
case (bearbeitung.innen)
of
true:
begin
case (int^)
of
0:
begin
asm
INC nZaehler
JMP @START
@START:
FLD D_bis
// ST(0) = D_bis
FSUB D_von
// ST(0) = ST(0) - D_von
FDIV halbieren_asm
// ST(0) = ST(0) / 2
FSTP H
// ST(0) zurückschreiben auf Variable: H
FLD AP
FMUL ersteRate
FSTP apX
FLD apX
FMUL halbieren_asm
FADD D_von
FSTP D_Ist
FLD Summe
FADD apX
FSTP Summe
end;
{ Inc(nZaehler);
H := (D_bis - D_von) / 2;
apX := AP * (ersteRate / hundert);
D_Ist := D_von + (2 * apX);
Summe := Summe + apX; }
data1[0] := int^;
data1[1] := apX;
data1[2] := D_Ist;
liste.ADD(SetStringFormat(data1));
end;
else
begin
asm
INC nZaehler
JMP @START
@START:
FLD apX
FMUL Rate
FCOM apMin
// vergleiche, ST(0) : apMin
JG @ELSE_a
// wenn größer, springe
FLD apMin
FSTP apX
JMP @END_a
@ELSE_a:
FLD apX
FMUL Rate
FSTP apX
JMP @END_a
@END_a:
FLD Summe
FADD apX
FCOM H
JL @ELSE_b
// wenn kleiner, springe: Abfrage wird falsch ausgewertet !?!
FLD H
FSUB Summe
FSTP apX
JMP @END_b
@ELSE_b:
JMP @END_b
@END_b:
FLD apX
FMUL halbieren_asm
FADD D_Ist
FSTP D_Ist
FLD Summe
FADD apX
FSTP Summe
end;
{ if ((apX * (Rate / hundert)) < apMin)
then
begin
apX := apMin;
end
else
begin
apX := apX * (Rate / hundert);
end;
if ((Summe + apX) > H)
then
apX := H - Summe;
D_Ist := D_Ist + (2 * apX);
Summe := Summe + apX; }
data1[0] := int^;
data1[1] := apX;
data1[2] := D_Ist;
liste.ADD(SetStringFormat(data1));
end;
end;
end;
end;
case (bearbeitung.aussen)
of
true:
begin
case (int^)
of
0:
begin
INC(nZaehler);
H := (D_von - D_bis) / 2;
apX := AP * (ersteRate / hundert);
D_Ist := D_von - (2 * apX);
Summe := Summe + apX;
data1[0] := int^;
data1[1] := apX;
data1[2] := D_Ist;
liste.ADD(SetStringFormat(data1));
end;
else
begin
INC(nZaehler);
if ((apX * (Rate / hundert)) < apMin)
then
begin
apX := apMin;
end
else
begin
apX := apX * (Rate / hundert);
end;
if ((Summe + apX) > H)
then
apX := H - Summe;
D_Ist := D_Ist - (2 * apX);
Summe := Summe + apX;
data1[0] := int^;
data1[1] := apX;
data1[2] := D_Ist;
liste.ADD(SetStringFormat(data1));
end;
end;
end;
end;
until (Summe >= H);
FProgressBarMax := int^;
DataProgressBarComponent(
true,
clRed,
FProgressBarMax);
SetFormControl(true);
for nZaehler := 1
to (liste.Count)
do
begin
BerechnungProgressBar.Position := int^;
self.Caption :=
String.Format('
%s [%d %%]',
[FFormCaption, ProzentProgressbar(nZaehler, FProgressBarMax)]);
BerechnungListBox.AddItem(
liste[int^ - 1],
BerechnungListBox);
WriteZählerEdit(int^.ToString);
if (THoistThread(DataFanucThread).Terminated)
then
begin
AbbruchRoutine(Abbruch);
break;
end
else
begin
BerechnungListBox.Perform(
WM_VSCROLL,
SB_BOTTOM,
0);
// Botschaft direkt an die Fensterprozedur des Steuerelements senden
Application.ProcessMessages;
end;
end;
if not(Abbruch)
then
begin
SetFormControl(false);
DataProgressBarComponent(false);
end;
liste.Free;
SetLength(
data1,
0);
end;