![]() |
assembler Sprungbefehle
Hi Guy's
wer kann helfen, bei "JL @ELSE_b" wird falsch ausgwertet, warum ? thanks.
Delphi-Quellcode:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz