IF-Verzweigung wird nicht berücksichtigt

b4w3f

Level-1
Beiträge
33
Reaktionspunkte
7
Zuviel Werbung?
-> 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.


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
 
Ich bin soooo doof. Wenn man Stunden auf den gleichen Text starrt und sich dann entscheidet Hilfe zu suchen.
wSetSpeed wird am Ende immer auf fFaktorSpeed1 gesetzt. Thema darf geschlossen werden....
 
Zurück
Oben