Registriert seit: 7. Nov 2004
639 Beiträge
|
Re: Ablauf für Fräsmaschine programmieren
4. Okt 2008, 00:35
also ich hab jetzt nochmal kurz an meinem "code" gearbeitet. fehlt natürlich noch sehr vieles, hab einfach mal angefangen den code abzuändern.
Delphi-Quellcode:
var
Befehl_vorhanden,
Maschine_Bereit: boolean;
Schritte_X,
Schritte_Y,
Schritte_Z,
Geschwindigkeitsfaktor,
GF_Down_X,
GF_Down_Y,
GF_Down_Z: Integer;
Sende_FiFo,
Empfangs_FiFo,
G-Code_FiFo: Array;
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 =)
If Empfangs_FiFo_leer then // Wenn der Buffer leer ist...
begin
Befehl_vorhanden := false; // Wird die Variable auf false gesetzt...
RS232_Senden(Warte_auf_Befehl); // ...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
If Empfangs_FiFo_voll then // wenn der Buffer voll ist...
RS232_Senden(PC_muss_warten); //... wird dem PC mitgeteilt dass er warten muss mit der Übermittlung
Befehl_auswerten; // ...wird der Befehl ausgewertet (siehe weiter unten)
if Befehl_Vorhanden and Maschine_Bereit then // Wenn ein Befehl vorhanden ist und kein Fräsvorgang in arbeit ist...
Run_G-Code;
end;
end;
procedure RS232_Senden(Sendedaten);
begin
Sende_FiFo_mit_Sendedaten_füllen; // Was in der Zwischenzeit empfangen wurde, wird in den Buffer geladen
// Der Sende_FiFo wird wieder geleert sobald die Übertragung per Interrupt stattgefunden hat
end;
procedure RS232_Empfangen; // Wird per Interrupt ausgelöst (Sobald etwas empfangen wird)
begin
Empfangs_FiFo_mit_Empfangsdaten_füllen; // Was in der Zwischenzeit empfangen wurde, wird in den Empfangs_FiFo geladen
end;
procedure Befehl_auswerten; // Wertet den Empfangenen Befehl aus
begin
Empfangs_FiFo_auslesen; // Der Empfangsfuffer der RS232 wird ausgelesen
Empfangs_FiFo_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: G-Code_FiFo_hinzufügen(Payload); //...ein G-Code ankündigt, wird dieser in den G-Code_FiFo geschrieben
End;
end;
procedure Run_G-Code(G-Code); // Der Empfangene G-Code wird verarbeitet
begin
Befehl_auslesen; // Liest aus dem Payload heraus, ob M0, M1, G00, G01 usw.
Case G-Code.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;
G-Code_FiFo_Anweisung entfernen; // Der ausgeführte Befehl wird aus der FiFo entfernt - oder muss man das nicht machen?
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_berechnen; // Die Wartezeit zwischen den einzelnen Pins ein-/ausschalten berechnen
GF_Down_X := Geschwindigkeitsfaktor; // Variable setzten
GF_Down_Y := Geschwindigkeitsfaktor;
GF_Down_Z := Geschwindigkeitsfaktor;
timer_Intervall := Geschwindigkeit; // Den Intervall für die Geschwindigkeit
timer_aktivieren; // Der Timer wird aktiviert
end;
procedure Timer;
begin
GF_Down_X := GF_Down_X - 1; // Die Wartezeit wird immer eines weniger
GF_Down_Y := GF_Down_Y - 1;
GF_Down_Z := GF_Down_Z - 1;
if GF_Down_X = 0 then // Wenn die Wartezeit gleich Null ist...
begin
If Pin_X_Ein then // ...Wird der Takt-Pin getoggelt
Pin_X_aus
else
Pin_X_ein;
GF_Down_X := Geschwindigkeitsfaktor; // ...wird die Wartezeit wieder heraufgesetzt
Schritte_X := Schritte_X - 1; // ...wird die Anzahl zu erledigender Schritte verringert
end;
if GF_Down_Y = 0 then // Wenn die Wartezeit gleich Null ist...
begin
If Pin_Y_Ein then // ...Wird der Takt-Pin getoggelt
Pin_Y_aus
else
Pin_Y_ein;
GF_Down_Y := Geschwindigkeitsfaktor; // ...wird die Wartezeit wieder heraufgesetzt
Schritte_Y := Schritte_Y - 1; // ...wird die Anzahl zu erledigender Schritte verringert
end;
if GF_Down_Z = 0 then // Wenn die Wartezeit gleich Null ist...
begin
If Pin_Z_Ein then // ...Wird der Takt-Pin getoggelt
Pin_Z_aus
else
Pin_Z_ein;
GF_Down_Z := Geschwindigkeitsfaktor; // ...wird die Wartezeit wieder heraufgesetzt
Schritte_Z := Schritte_Z - 1; // ...wird die Anzahl zu erledigender Schritte verringert
end;
If (Schritte_X = 0) and (Schritte_Y = 0) and (Schritte_Z = 0) then //wenn alle Schritte (X, Y, Z) ausgeführt wurden...
begin
Maschine_Bereit := true; //...wird die Bereitschaft auf true gestellt damit der nächste Befehl verarbeitet werden kann
Timer_deaktivieren; // ...wird der Timer deaktiviert
end:
end;
naja, ist bestimmt nocht nicht so wie du dir das vorstellst, aber ich geh jetzt erstmal schlafen^^
mfg
Urban
EDIT: hab den code noch kurz bisschen abgeändert
|