Einzelnen Beitrag anzeigen

100nF

Registriert seit: 7. Nov 2004
639 Beiträge
 
#38

Re: Ablauf für Fräsmaschine programmieren

  Alt 3. Okt 2008, 23: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
  Mit Zitat antworten Zitat