Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Frage zu Timerfunktion TON

maddi67
2007-04-05
2007-04-07
  • maddi67 - 2007-04-05

    Hallo liebe Freunde des CodeSys !

    Ich habe ein kleines Problem.

    Hintergrund:

    Ein Stellmotor mit einem Stellwinkel von 0-90° und einer Laufzeit von 35 Sek./90°,

    soll mit meinem Programm aus einem beliebigen Winkel in einen beliebigen

    anderen Winkel gefahren werden.

    Dazu habe ich das untenstehende Programm geschrieben.

    Ich nutze darin einen Timer (TON).

    Das Kuriose ist, das es x-Mal funktioniert, besonders aber bei einem

    Startwinkel von 0° auf 90° oder 90° auf 0° kommt für die Variable Timediff

    eine unsinnig große Zahl heraus.

    Ich weiß nicht warum.

    Hat von euch jemand eine Idee / einen Hinweis ?

    Vielen Dank im voraus, Martin


    PROGRAM PLC_PRG

    VAR

    MOVE:BOOL;
    
    WINKEL,ZIELWINKEL:INT; (RETAIN)
    
    LINKS:TOF;
    
    RECHTS:TOF;
    
    TIMEDIFF:DWORD;
    

    END_VAR


    LINKS;

    RECHTS;

    IF MOVE=TRUE THEN

    TIMEDIFF:=TRUNC(ABS(((ZIELWINKEL-WINKEL)*35000.0)/90.0));

    IF ZIELWINKEL<WINKEL THEN

    LINKS.PT:=DWORD_TO_TIME(TIMEDIFF);

    RECHTS.PT:=DWORD_TO_TIME(TIMEDIFF);

    LINKS.IN:=TRUE;

    MOVE:=FALSE;

    END_IF;

    IF ZIELWINKEL>WINKEL THEN

    RECHTS.PT:=DWORD_TO_TIME(TIMEDIFF);

    LINKS.PT:=DWORD_TO_TIME(TIMEDIFF);

    RECHTS.IN:=TRUE;

    MOVE:=FALSE;

    END_IF;

    WINKEL:=ZIELWINKEL;

    END_IF;

    IF LINKS.Q= TRUE THEN

    PDigital_Output_00_00:=TRUE;

    LINKS.IN:=FALSE;

    ELSE

    Digital_Output_00_00:=FALSE;

    END_IF;

    IF RECHTS.Q= TRUE THEN

    Digital_Output_00_01:=TRUE;

    RECHTS.IN:=FALSE;

    ELSE

    Digital_Output_00_01:=FALSE;

    END_IF;

     
  • maddi67 - 2007-04-06

    Also inzw. habe ich raus das es mit dem Timer selber gar nichts zu tun hat.

    Der Fehler passiert wenn z.B der Zielwinkel=0 und der Winkel =90

    ist.

    Der dann berechnete Wert (90-0)*35000/90 wird an

    die Funktion DWORD_TO_TIME übergeben.

    Diese liefert dann einen Wert der nicht dem entspricht

    den ich erwarte.

    Nur, wo liegt der Fehler - was mache ich da falsch ?

     
  • Oberchefe - 2007-04-06

    wie wird das Bit "MOVE" gesetzt? Den Namen solltest Du übrigens nicht verwenden, MOVE ist der Name einer Funktion.

    Der Rest sollte eigentlich funktionieren:

    IMG: Timediff.gif

     
  • maddi67 - 2007-04-06

    Hallo Oberchefe,

    das BIT MOVE heisst " in Echt fredP300_Move", so das es da keinen

    Konflikt gibt.

    Gesetzt wird es durch manuelles Eintasten.

    Wie Du sagst, es sollte funktionieren, tut es aber nicht.

     
  • gravieren - 2007-04-07

    Hi

    Unter OSCAT gibt es diese Funktion bereits fertig.

    Nimm diese Funktion oder schau dir den Quelltext an.

    ( OSCAT ist Quelltextoffen und "frei" )

    (Vieleicht hast du auch Verbessungsvorschläge für das OSCAT-Team)

     

Log in to post a comment.