CoDeSys Porgrammieren

Kaylie

New member
Beiträge
2
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Guten Morgen zusammen,

Ich habe ein Problem.

Und zwar habe ich ein zwei-achsiges Schienensystem, X und Y-Achse.
Die Schienen sind selber gabaut und haben in bestimmten Abständen Schraubenköpfe, die als Messpunkte für die Induktivsensoren gelten. Die Sensoren werden mit hilfen von jeweils einem DC 24V Motor bewegt.
Das System ist zum Messen von Infrarotstahlung gebaut worden.

Ich haben es bis jetzt soweit programmiert bekommen, das ich einen Soll-Wert manuell für X sowie für den Y Wert eigeben kann und wenn ich dann Starte die Motoren an die Koordinaten fahren.

Nun soll die Messpunke alle aber automatisch abgefahren werdn, heißt ich drücke Start und an jeder Koordinaten bleibt er für 5sekunden stehen und fährt dann weiter.

Die Fragen:
Wie muss die Schleife aussehen das Jeder Punkt automatisch abgefahren wird?
 

MasterOhh

Well-known member
Beiträge
1.582
Punkte Reaktionen
397
Da du ja die Einzelnen Positionen schon per Hand anfahren kannst, ist der Automatikbetrieb ganz einfach. Am besten du legst die X und Y Sollwerte jeweils in einem Array (2 dimensional) ab. Zum steuern der Antriebe hast du einen FB erstellt, der die Sollwerte von dir bekommt? Der müsste jetzt noch zurückgeben das die Sollposition erreicht wurde.

Eine Schleife brauchst du nicht, das Programm wird ja schon zyklisch abgearbeitet. Zum 5sek Warten nimmst du einen Timer (Einschaltverzögerung (TON) passt da gut).

Wenn dein Automatik-Baustein jetzt ein Startsignal bekommt, übergibst du deinen Positionsreglern den ersten Sollwert z.B.
i ist dabei die Zählvariable mit der du dich durch deine Sollpositionen hangelst.

Code:
XAchse(Sollpos := PosArray[i,1]); 
YAchse(Sollpos := PosArray[i,2]);

kommt die Rückmeldung von beiden Achsen das sie fertig sind startest du den Timer

Code:
if XAchse.PosOK and YAchse.PosOK then
  WarteTimer.IN := true;
end_if
WarteTimer(PT := t#5s);

Wenn der Timer abgelaufen ist setzt du ihn zurück und fährst die nächste Position an
Code:
if WarteTimer.Q then
  WarteTimer(IN := false);
  i := i+1;
end_if

Da ist erstmal nur eine grobe Idee. Ich weiss ja nicht wie dein Programm bisher so aussieht. Man kann das ganze natürlich auch vielfälltig anders lösen.
 
OP
K

Kaylie

New member
Beiträge
2
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Das Programm ist bis jetzt in einer Schrittkette dargestellt und in den einzelen Aktionen gebe ich die Befehlen im strukturierten Text da.

Der Sollwert ist bei mir erstmal als Null deklariert. Wenn einen Punkt weiter gefahren werden soll force ich den sollwert auf z.B.: 3 und dann fährt er los.
Ob der Sollwert errreicht ist, wird halt abgefragt ob der Istwert = Sollwert ist, wenn das nicht der fall, wird halt einen punkt weitergefahren.

Einen Timer hab ich schon drin, muss ich den denn immer zurücksetzten?
 
Oben