Search code examples
codesys

Is there a timer function or variable in Codesys as in arduino millis()?


Is there a timer function or variable in Codesys as in arduino millis() ?

If not, how can I create a timer?

Thanks!


Solution

  • You can build one yourself. Here an example:

    Declaration part:

    FUNCTION_BLOCK FB_Millis
    VAR_INPUT
        timer : TON := (IN:=TRUE,PT:=maxTime);
    END_VAR
    VAR_OUTPUT
        tElapsedTime : TIME;
    END_VAR
    VAR
        maxTime : TIME := UDINT_TO_TIME(4294967295);
        //timer : TON := (IN:=TRUE,PT:=maxTime);
    END_VAR
    

    Implementation part:

    timer();
    tElapsedTime := timer.ET;
    

    You call it cyclically like this:

    fbMillis();
    

    And retrieve the result like this:

    tElapasedTime := fbMillis.tElapsedTime;
    

    FB_Millis overflows after 49days 17hours 2minutes 47seconds and 295ms.

    If you want to compare the elapsed time from fbMillis.tElapsedTime with another variable you do like this:

    IF fbMillis.tElapsedTime < tAnotherTimeVar 
    THEN
     ; //Do something
    ELSE
     ; //Do something else
    END_IF
    

    If you instead just want a simple timer you need the TON Function Block:

    Declaration part:

    //2 seconds timer
    mySimpleTimer : TON := (PT:=T#2s);
    

    Implementation part:

    mySimpleTimer();
    
    // your code here
    
    //Start timer
    mySimpleTimer.IN := TRUE;
    
    //Check if timer has reached desired time
    IF mySimpleTime.Q
    THEN
     //Do something here
     mySimpleTimer.IN := FALSE;
    END_IF