Registriert seit: 7. Nov 2004
639 Beiträge
|
Re: Ablauf für Fräsmaschine programmieren
1. Okt 2008, 19:10
okay, ich hab mal was zusammengekritzelt...
Delphi-Quellcode:
var
Befehl_vorhanden,
Maschine_Bereit: boolean;
Schritte_X,
Schritte_Y,
Schritte_Z,
Geschwindigkeitsfaktor_X,
Geschwindigkeitsfaktor_Y,
Geschwindigkeitsfaktor_Z,
GF_Down_X,
GF_Down_Y,
GF_Down_Z: Integer;
procedure main; // die Hauptprozedur des Programmes
begin
Alles_Initialisieren; // z.B. die Serielle Schnittstelle initialisieren, Pins auf Ausgang schalten usw.
begin Endlosschleife // Läuft ewigs durch, hört nie auf =)
RS232_Senden_Empfangen; // Siehe weiter unten
if Befehl_Vorhanden and Maschine_Bereit then // Wenn ein Befehl vorhanden ist und kein Fräsvorgang in arbeit ist...
Befehl_auswerten; // ...wird der Befehl ausgewertet (siehe weiter unten)
end;
end;
procedure RS232_Senden_Empfangen;
begin
Buffer_mit_Empfangsdaten_füllen; // Was in der Zwischenzeit empfangen wurde, wird in den Buffer geladen
If Buffer_voll then // wenn der Buffer voll ist...
Sende_Wartebefehl_an_PC; //... wird dem PC mitgeteilt dass er warten muss mit der Übermittlung
If Buffer_leer then // Wenn der Buffer leer ist...
begin
Befehl_vorhanden := false; // Wird die Variable auf false gesetzt...
Sende_Bereit_an_PC; // ...und dem PC mitgeiteilt dass er wieder Daten senden soll
end
else
Befehl_vorhanden := true; // Wenn der Buffer nicht leer ist, wird die Variable auf true gesetzt
end;
procedure Befehl_auswerten; // Wertet den Empfangenen Befehl aus
begin
Buffer_auslesen; // Der Empfangsfuffer der RS232 wird ausgelesen
Buffer_splitten(Startbyte, Message_Size, Command_Byte, Payload, Command_Byte, Checksumme, Stopbyte); // Das Telegramm wird in die einzelnen bestandteile zerlegt
// Startbyte usw überprüfen...
Case Command_Byte of // Wenn der Befehl...
Kalibrieren: Prozedur_Kalibrieren(Payload); // ...eine Kalibrierung ankündigt, wird diese ausgeführt
G-Code: Run_G-Code(Payload); //...ein G-Code ankündigt, wird dieser weiterverarbeitet
End;
end;
procedure Run_G-Code(Payload: G-Code); // Der Empfangene G-Code wird verarbeitet
begin
Befehl_auslesen; // Liest aus dem Payload heraus, ob M0, M1, G00, G01 usw.
Case Payload.Befehl of // Enthält "M0", "G00" usw.
M0: ... ;
M1: ... ;
...
G00: Fahre_Zu_Position(Payload.X, Payload.Y, Payload.Z, schnell); // Die Fräse muss schnell an die angekündigte Position fahren
G01: Fahre_Zu_Position(Payload.X, Payload.Y, Payload.Z, schnell); // Die Fräse muss an die angekündigte Position fahren
...
end;
end;
procedure Fahre_Zu_Position(X, Y, Z, Geschwindigkeit); // Die Position X, Y, Z wird mit der entsprechenden Geschwindigkeit angefahren
begin
Maschine_Bereit := false; // Damit Keine zweite Befehlsauswertung stattfinden kann
Schritte_X := X - Istposition_X; // Die Differenz zwischen Soll- und Istposition ermitteln
Schritte_Y := Y - Istposition_Y;
Schritte_Z := Z - Istposition_Z;
Geschwindigkeitsfaktor_X_berechnen; // Die Wartezeit zwischen den einzelnen Pins ein-/ausschalten berechnen
Geschwindigkeitsfaktor_Y_berechnen;
Geschwindigkeitsfaktor_Z_berechnen;
GF_Down_X := Geschwindigkeitsfaktor_X; // Variable setzten
GF_Down_Y := Geschwindigkeitsfaktor_Y;
GF_Down_Z := Geschwindigkeitsfaktor_Z;
timer_X_Intervall := Geschwindigkeit; // Den Intervall für die Geschwindigkeit
timer_Y_Intervall := Geschwindigkeit;
timer_Z_Intervall := Geschwindigkeit;
timer_X_aktivieren; // Die Timer werden aktiviert
timer_Y_aktivieren;
timer_Z_aktivieren;
end;
procedure Timer_x; // 3 Mal das "selbe" für X, Y, Z)
begin
GF_Down_X := GF_Down_X - 1; // Die Wartezeit wird immer eines weniger
if GF_Down_X = 0 then // Wenn die Wartezeit gleich Null ist...
begin
If Pin_Ein then // ...Wird der Takt-Pin getoggelt
Pin_aus
else
Pin_ein;
GF_Down_X := Geschwindigkeitsfaktor_X; // ...wird die Wartezeit wieder heraufgesetzt
Schritte_X := Schritte_X - 1; // ...wird die Anzahl zu erledigender Schritte verringert
If Schritte_X = 0 then // Wenn alle Schritte ausgeführt wurden...
begin
Timer_X_deaktivieren; // ...wird der Timer_X deaktiviert
If (Schritte_Y = 0) and (Schritte_Z = 0) then //...und wenn alle Schritte (X, Y, Z) ausgeführt wurden...
Maschine_Bereit := true; //...wird die Bereitschaft auf true gestellt damit der nächste Befehl verarbeitet werden kann
end;
end;
end;
hast du dir das in ungefähr so vorgestellt?
Soll natürlich nur den Ablauf darstellen, ich programmier den µC natürlich nicht in Delphi^^
mfg
Urban
|