-> Hier kostenlos registrieren
Hallo Zusammen,
ich benutze einen Lenze 3200 Motion mit einem Lenze 8400. Das alles ist aber für das folgende Problem 2. oder eher 3. rangig. Programmiert wird im Lenze PLC 3.8, der aber identisch mit Codesys 3.5 ist.
Ich erhalte von einem Inverter einen 32bit Motor-Positionswert. Eine Motorumdrehung sind 65536 Inkremente. Alles was folgender Code macht ist folgendes:
Umdrehungen können eingegeben werden. Diese werden in Inkremente umgerechnet. Daraus wird ein Soll-Positionswert errechnet (aktueller Motorpositionswert + Umdrehungen in Inkrementen).
Dann wird der Motor beschleunigt. Je näher der Motor am Sollwert ist, desto langsamer wird er um besser ausregeln zu können (x*x/2= Geschwindigkeit in Prozenten, x sind die verbleibenden Umdrehungen).
Das Funktioniert auch super. Wenn x*x/2 größer 95 ist setzte ich die Geschwindigkeit per Hand auf 95. (Alles auch negativ, da ich auch Rückwärts fahren möchte).
Was jetzt aber passiert ist folgendes: Fahre ich mehr als 15 Umdrehungen wird in meine Geschwindigkeit plötzlich der Wert x*x/2 geschrieben, wodurch werte viel Größer 100 entstehen. Mein Motor schaltet dann glücklicherweise automatisch ab.
Die folgende Codestelle zeigt die Stelle an der mein Programm hängen bleibt. Meistens steht dann etwas wie 5000 in wSetSpeed.
ich benutze einen Lenze 3200 Motion mit einem Lenze 8400. Das alles ist aber für das folgende Problem 2. oder eher 3. rangig. Programmiert wird im Lenze PLC 3.8, der aber identisch mit Codesys 3.5 ist.
Ich erhalte von einem Inverter einen 32bit Motor-Positionswert. Eine Motorumdrehung sind 65536 Inkremente. Alles was folgender Code macht ist folgendes:
Umdrehungen können eingegeben werden. Diese werden in Inkremente umgerechnet. Daraus wird ein Soll-Positionswert errechnet (aktueller Motorpositionswert + Umdrehungen in Inkrementen).
Dann wird der Motor beschleunigt. Je näher der Motor am Sollwert ist, desto langsamer wird er um besser ausregeln zu können (x*x/2= Geschwindigkeit in Prozenten, x sind die verbleibenden Umdrehungen).
Das Funktioniert auch super. Wenn x*x/2 größer 95 ist setzte ich die Geschwindigkeit per Hand auf 95. (Alles auch negativ, da ich auch Rückwärts fahren möchte).
Was jetzt aber passiert ist folgendes: Fahre ich mehr als 15 Umdrehungen wird in meine Geschwindigkeit plötzlich der Wert x*x/2 geschrieben, wodurch werte viel Größer 100 entstehen. Mein Motor schaltet dann glücklicherweise automatisch ab.
Die folgende Codestelle zeigt die Stelle an der mein Programm hängen bleibt. Meistens steht dann etwas wie 5000 in wSetSpeed.
Code:
If bExecute Then
Case Ablauf Of
1:
diRestU:=(diIncSoll-diActInc)/65536; //Hier werden die verbleibenden Umdrehungen berechnet. diIncSoll ist der Sollwert, diActIns ist die Motorposition
fFaktorSpeed:=diRestU*(ABS(diRestU)/2.0); //Hier wird die Sollgeschwindigkeit in Prozenten berechnet
IF fFaktorSpeed >0 THEN
fFaktorSpeed1:=fFaktorSpeed+0.5; //Wenn Geschwindigkeit kleiner 0.5 Prozent, dann 0.5 Prozent
ELSE
fFaktorSpeed1:=fFaktorSpeed-0.5;
END_IF
IF fFaktorSpeed1 > 95 THEN //Wenn Geschwindigkeit größer 95%, dann 95%
wSetSpeed:=95;
ELSE
wSetSpeed:=fFaktorSpeed1; //Sonst Geschwindigkeit wie berechnet
END_IF
IF fFaktorSpeed1 < -95 THEN
wSetSpeed:= -95; //In dieser Verschachtelung Frage ich mich wie es passieren kann das wSetSpeed größer 95 oder kleiner -95 werden kann.
ELSE //Ich sehe keine Möglichkeit dafür, dass wSetSpeed fFaktorSpeed1 zu Gesicht bekommt, wenn fFaktorSpeed1 zu groß ist
wSetSpeed:=fFaktorSpeed1; // Aber genau das passiert
END_IF
IF diRestU < 0.0005 AND diRestU > -0.0005 THEN //Die Position gilt dann als erreicht, wenn die verbleibenden Umdrehungen kleiner als 0.0005 sind. (Das sind Grob 0,18°, was bei weniger als 15
wSetSpeed:=0; //Umdrehungen auch super klappt
IF wActSpeed=0 THEN
Ablauf:=2;
End_IF
End_If
END_CASE
END_IF