Achs Baustein für einen quadrature Encoder Gleichstrommotor

Matteo Fuchs

Level-1
Beiträge
25
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, wir sind gerade dabei einen Baustein in SCL zu schreiben um einen Gleichstrommotor der eine Achse bewegt von dem wir die Impulse zählen anzusteuern. Wir wollen einen Soll Impulswert eingeben können und zu diesem die Achse hinbewegen und wenn die Achse dort ist stoppen. Der Baustein soll folgende Eingänge/Ausgänge haben:
I_O_Signale.png
 
Keine Ahnung, probiere es bitte selber aus. Ich würde aber mal sagen => nein.
PS:
Die zwei ELSE kannst du dir gleich sparen

#drehe_links := (#aktuelle_Pos..........
 
IF #Kalibrierung THEN
#Drehe_Links := TRUE;
IF #Endtaster_Cal2 THEN
#Drehe_Links := FALSE;
#Drehe_Rechts := TRUE;
IF #Endtaster_Cal1 THEN
#Drehe_Rechts := FALSE;
#Kalibriert := TRUE;
END_IF;
END_IF;
END_IF;

IF #Kalibriert THEN
#Kalibrierung := FALSE;
END_IF;

IF (#Aktuelle_Position_Cal1 > #Soll_Position_Cal1) AND (#Aktuelle_Position_Cal2 < #Soll_Position_Cal2) THEN
#Drehe_Rechts := TRUE;
ELSE
#Drehe_Rechts := FALSE;
END_IF;

IF (#Aktuelle_Position_Cal1 < #Soll_Position_Cal1) AND (#Aktuelle_Position_Cal2 > #Soll_Position_Cal2) THEN
#Drehe_Links := TRUE;
ELSE
#Drehe_Links := FALSE;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Funktion mal dahingestellt aber:
Aus
Code:
IF (#Aktuelle_Position_Cal1 > #Soll_Position_Cal1) AND (#Aktuelle_Position_Cal2 < #Soll_Position_Cal2) THEN
#Drehe_Rechts := TRUE;
ELSE
#Drehe_Rechts := FALSE;
END_IF;

kannst du auch folgendes machen:
Code:
#Drehe_Rechts := (#Aktuelle_Position_Cal1 > #Soll_Position_Cal1) AND (#Aktuelle_Position_Cal2 < #Soll_Position_Cal2);
 
Code:
IF #Kalibrierung THEN
#Drehe_Links := TRUE;
IF #Endtaster_Cal2 THEN
#Drehe_Links := FALSE;
#Drehe_Rechts := TRUE;
IF #Endtaster_Cal1 THEN
#Drehe_Rechts := FALSE;
#Kalibriert := TRUE;
END_IF;
END_IF;
END_IF;
Dies Konstrukt wird so nicht funktionieren da der IF Teil mit #Endtaster_Cal1 nicht mehr bearbeitet wird, sobald #Endtaster_Cal2 FALSE wird.
Das END_IF ist also falsch positioniert. Die gesamte Funktion auch hier mal dahingestellt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
IF #Kalibrierung THEN
#Drehe_Links := TRUE;
IF #Endtaster_Cal2 THEN
#Drehe_Links := FALSE;
#Drehe_Rechts := TRUE;
IF #Endtaster_Cal1 THEN
#Drehe_Rechts := FALSE;
#Kalibriert := TRUE;
END_IF;
END_IF;
END_IF;

IF #Kalibriert THEN
#Kalibrierung := FALSE;
END_IF;


#Drehe_Rechts := (#Aktuelle_Position_Cal1 > #Soll_Position_Cal1) AND (#Aktuelle_Position_Cal2 < #Soll_Position_Cal2);
#Drehe_Links := (#Aktuelle_Position_Cal1 < #Soll_Position_Cal1) AND (#Aktuelle_Position_Cal2 > #Soll_Position_Cal2);


Schaut das jetzt besser aus?
 
Mal so ein Tipp. Ich kenne deine Auflösung der Position nicht aber du wirst zum positionieren ggf. ein Fenster benötigen. Also nicht positionieren auf genau die Sollposition sondern auf Sollposition +- Toleranz.

Ansonsten kann es dir passieren, dass dein Motor in der Zielposition nicht stehenbleibt sondern hin- und herfährt.
 
Zurück
Oben