Programmierung Kreis mit Codesys in FUP

Chris__

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Wie das Thema schon sagt, versuche ich in der Funktionsbausteinsprache einen Kreis zu programmieren, was mir einfach nicht gelingen will.
Kann mir vllt jemand mal ein Beispielprogramm schicken? Es muss einfach ein simpler Kreis gezeichnet werden, wo zu Beginn (vor Programmstart) der Radius per Hand vorgegeben wird.
Mein Problem ist, dass ich die beiden Motoren einfach nicht aufeinander abgestimmt bekomme.
 
Hallo,

die Kreisfunktion lautet ja:
Kreis mit dem Mittelpunkt (x[SUB]m[/SUB]|y[SUB]m[/SUB])
(x - x[SUB]m[/SUB])² + (y - y[SUB]m[/SUB])² = r

Kreis mit dem Mittelpunkt (0|0)
x² + y² = r

Wenn ich davon ausgehe das die beiden Motoren jeweils für x und y Koordinate sind und du Inkrementalrückmeldung über die Position hast, musst du nun nur noch diese Funktion in einen Algorithmus implementieren.

Bewegungsmuster für Motor x - Achse in Abhängigkeit zum Motor y - Achse wäre dann (Ausgehend vom Kreis in (0|0)):
x = Wurzel(r - y²)

Nun lässt du den y - Motor fahren. Der x - Motor wird über die obere Formel an diesen Motor gekoppelt.

Ich hoffe das hilft dir schon deiner Lösung näher zu kommen.

Gruß Stefan
 
Hi,

ich habe vergessen zu erwähnen, dass ich keine Wegaufnehmer etc habe. Die Motoren können lediglich über einen Impuls "TRUE" angesteuert werden. Sollen diese die Drehrichtung wechseln, so muss zusätzlich der Eingang "DIR" bestromt werden.

Ich werde mir den Bresenham-Algorithmus mal anschauen. Denke für mein Problem ist das die einzige Möglichkeit.

Vielen Dank :)
 
Hallo, ich bräuchte nochmal eure Hilfe.
Und zwar habe ich versucht, den Bresenham-Algorithmus für den Strukturierten Text zu übersetzen, allerdings habe ich mit den Arrays Probleme und mit der Spiegelung des Achtelkreises... Könntet ihr mal über den Code drüber schauen und mir die Fehler nennen? Wäre dafür sehr dankbar...




VAR
Radius: REAL;
d: LREAL;
x_kreis: REAL;
y_kreis: REAL;
err: REAL;
sm: ARRAY [-1..456,-1..456] OF INT;
sm_end: INT;
dy: REAL;
dx: LREAL;
i: INT;
length: INT;
temp_sm: ARRAY [-1..456,-1..456] OF INT;
END_VAR



(* Kreisdaten *)
Radius := 50; (* Kreisradius *)
d := 0.63; (* Schrittweite 0,63mm / Puls *)


(* Kreispunkte berechnen *)


(* 1. Oktant mit Bresenham - Algorithmus (wikipedia) *)
x_kreis := Radius;
y_kreis := 0;
err := Radius;


WHILE y_kreis < x_kreis DO
dy := 2*y_kreis+d;
y_kreis := y_kreis+d;
err := err-dy;
IF err<=0 THEN
(* dx und dy Schritt *)
dx := d-2*x_kreis;
x_kreis := x_kreis-d;
err := err-dx;
sm_end := sm[-1,1];
ELSE
(* nur dy schritt *)
sm_end := sm[0,1];
END_IF
END_WHILE


(* (* add 2. Oktant durch Spiegel an 45° Achse *)
temp_sm := sm;
temp_sm := fliplr(temp_sm);
temp_sm=flipud(temp_sm);
temp_sm=temp_sm*-1;


sm=[sm;temp_sm];


(* add 3. und 4. Oktant durch spiegeln um y Achse *)
temp_sm=sm;
temp_sm=flipud(temp_sm);
temp_sm:),2)=temp_sm:),2)*-1;


sm=[sm;temp_sm];


(* add 5. bis 8. Oktant durch speiegeln um x Achse *)
temp_sm=sm;
temp_sm=flipud(temp_sm);
temp_sm:),1)=temp_sm:),1)*-1;


sm=[sm;temp_sm]; *)


(* Schrittmotorbewegungen *)


x_kreis := Radius;
y_kreis := 0;
FOR i := 1 TO SIZEOF(sm[456,456]) DO
x_kreis := x_kreis+d*sm[i,1];
y_kreis := y_kreis+d*sm[i,2];

IF sm

END_FOR
 
Zurück
Oben