lib/timer.txt
changeset 0 fb772792efd1
child 113 ea3f099f5b5f
equal deleted inserted replaced
-1:000000000000 0:fb772792efd1
       
     1 (*
       
     2  * (c) 2005 Mario de Sousa
       
     3  *
       
     4  * Offered to the public under the terms of the GNU General Public License
       
     5  * as published by the Free Software Foundation; either version 2 of the
       
     6  * License, or (at your option) any later version.
       
     7  *
       
     8  * This program is distributed in the hope that it will be useful, but
       
     9  * WITHOUT ANY WARRANTY; without even the implied warranty of
       
    10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
       
    11  * Public License for more details.
       
    12  *
       
    13  * This code is made available on the understanding that it will not be
       
    14  * used in safety-critical situations without a full and competent review.
       
    15  *)
       
    16 
       
    17 (*
       
    18  * An IEC 61131-3 IL and ST compiler.
       
    19  *
       
    20  * Based on the
       
    21  * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
       
    22  *
       
    23  *)
       
    24 
       
    25 (*
       
    26  * This is part of the library conatining the functions
       
    27  * and function blocks defined in the standard.
       
    28  *
       
    29  * Timer Function Blocks
       
    30  * ---------------------
       
    31  *
       
    32  * NOTE: The timing diagrams in the comments were taken from the 
       
    33  *       IEC 61131-3 standard.
       
    34  *)
       
    35 
       
    36 
       
    37 
       
    38 (****************************************************************
       
    39 
       
    40                   TP - pulse timing - state machine
       
    41 
       
    42 
       
    43             +--------+     ++ ++   +--------+
       
    44        IN   |        |     || ||   |        |
       
    45           --+        +-----++-++---+        +---------
       
    46             t0       t1    t2 t3    t4       t5
       
    47             +----+         +----+  +----+
       
    48        Q    |    |         |    |  |    |
       
    49           --+    +---------+    +--+    +-------------
       
    50             t0   t0+PT    t2 t2+PT t4  t4+PT
       
    51          PT      +---+          +       +---+
       
    52           :     /    |         /|      /    |
       
    53        ET :    /     |        / |     /     |
       
    54           :   /      |       /  |    /      |
       
    55           :  /       |      /   |   /       |
       
    56           0-+        +-----+    +--+        +---------
       
    57             t0       t1    t2      t4       t5
       
    58 
       
    59 
       
    60         2        +---+          +       +---+
       
    61 STATE   1   +----+   |     +----|  +----+   | 
       
    62         0 --+        +-----+    +--+        +---------
       
    63 
       
    64 
       
    65 ****************************************************************)
       
    66 
       
    67 FUNCTION_BLOCK TP
       
    68   VAR_INPUT
       
    69     IN : BOOL;  (* first input parameter *)
       
    70     PT : TIME;  (* second input parameter *)
       
    71   END_VAR
       
    72   VAR_OUTPUT
       
    73     Q : BOOL := FALSE;  (* first output parameter *)
       
    74     ET : TIME := T#0s;  (* second output parameter *)
       
    75   END_VAR
       
    76 
       
    77   VAR
       
    78     STATE : SINT := 0;  (* internal state: 0-reset, 1-counting, 2-set *)
       
    79     PREV_IN : BOOL := FALSE;
       
    80     CURRENT_TIME, START_TIME : TIME;
       
    81   END_VAR
       
    82 
       
    83   {data__->CURRENT_TIME = __CURRENT_TIME;}
       
    84 
       
    85   IF ((STATE = 0) AND NOT(PREV_IN) AND IN)   (* found rising edge on IN *)
       
    86   THEN
       
    87     (* start timer... *)
       
    88     STATE := 1;
       
    89     Q := TRUE;
       
    90     START_TIME := CURRENT_TIME;
       
    91 
       
    92   ELSIF (STATE = 1)
       
    93   THEN
       
    94     IF ((START_TIME + PT) <= CURRENT_TIME)
       
    95     THEN
       
    96       STATE := 2;
       
    97       Q := FALSE;
       
    98       ET := PT;
       
    99     ELSE
       
   100       ET := CURRENT_TIME - START_TIME;
       
   101     END_IF;
       
   102   END_IF;
       
   103 
       
   104   IF ((STATE = 2) AND NOT(IN))
       
   105   THEN
       
   106     ET := T#0s;
       
   107     STATE := 0;
       
   108   END_IF;
       
   109 
       
   110 
       
   111   PREV_IN := IN;
       
   112 
       
   113 END_FUNCTION_BLOCK
       
   114 
       
   115 
       
   116 
       
   117 
       
   118 (****************************************************************
       
   119 
       
   120              TON - On-delay timing - state machine
       
   121 
       
   122 
       
   123             +--------+        +---+   +--------+
       
   124        IN   |        |        |   |   |        |
       
   125           --+        +--------+   +---+        +-------------
       
   126             t0       t1       t2  t3  t4       t5
       
   127                  +---+                     +---+
       
   128        Q         |   |                     |   |
       
   129           -------+   +---------------------+   +-------------
       
   130               t0+PT  t1                t4+PT   t5
       
   131          PT      +---+                     +---+
       
   132           :     /    |            +       /    |
       
   133        ET :    /     |           /|      /     |
       
   134           :   /      |          / |     /      |
       
   135           :  /       |         /  |    /       |
       
   136           0-+        +--------+   +---+        +-------------
       
   137             t0       t1       t2  t3  t4       t5
       
   138 
       
   139 
       
   140         2        +---+                     +---+
       
   141 STATE   1   +----+   |        +---+   +----+   |
       
   142         0 --+        +--------+   +---+        +------
       
   143 
       
   144 
       
   145 ****************************************************************)
       
   146 
       
   147 
       
   148 FUNCTION_BLOCK TON
       
   149   VAR_INPUT
       
   150     IN : BOOL;  (* first input parameter *)
       
   151     PT : TIME;  (* second input parameter *)
       
   152   END_VAR
       
   153   VAR_OUTPUT
       
   154     Q : BOOL := FALSE;  (* first output parameter *)
       
   155     ET : TIME := T#0s;  (* second output parameter *)
       
   156   END_VAR
       
   157 
       
   158   VAR
       
   159     STATE : SINT := 0;  (* internal state: 0-reset, 1-counting, 2-set *)
       
   160     PREV_IN : BOOL := FALSE;
       
   161     CURRENT_TIME, START_TIME : TIME;
       
   162   END_VAR
       
   163 
       
   164   {data__->CURRENT_TIME = __CURRENT_TIME;}
       
   165 
       
   166   IF ((STATE = 0) AND NOT(PREV_IN) AND IN)   (* found rising edge on IN *)
       
   167   THEN
       
   168     (* start timer... *)
       
   169     STATE := 1;
       
   170     Q := FALSE;
       
   171     START_TIME := CURRENT_TIME;
       
   172 
       
   173   ELSE
       
   174     (* STATE is 1 or 2 !! *)
       
   175     IF (NOT(IN))
       
   176     THEN
       
   177       ET := T#0s;
       
   178       Q := FALSE;
       
   179       STATE := 0;
       
   180 
       
   181     ELSIF (STATE = 1)
       
   182     THEN
       
   183       IF ((START_TIME + PT) <= CURRENT_TIME)
       
   184       THEN
       
   185         STATE := 2;
       
   186         Q := TRUE;
       
   187         ET := PT;
       
   188       ELSE
       
   189         ET := CURRENT_TIME - START_TIME;
       
   190       END_IF;
       
   191     END_IF;
       
   192 
       
   193   END_IF;
       
   194 
       
   195   PREV_IN := IN;
       
   196 
       
   197 END_FUNCTION_BLOCK
       
   198 
       
   199 
       
   200 
       
   201 
       
   202 
       
   203 (****************************************************************
       
   204 
       
   205              TOFF - Off-delay timing - state machine
       
   206 
       
   207 
       
   208               +--------+        +---+   +--------+
       
   209        IN     |        |        |   |   |        |
       
   210            ---+        +--------+   +---+        +-----------
       
   211               t0       t1       t2  t3  t4       t5
       
   212               +-------------+   +---------------------+
       
   213        Q      |             |   |                     |
       
   214            ---+             +---+                     +------
       
   215               t0          t1+PT t2                  t5+PT
       
   216          PT                 +---+                     +------
       
   217           :                /    |       +            /
       
   218        ET :               /     |      /|           /
       
   219           :              /      |     / |          /
       
   220           :             /       |    /  |         /
       
   221           0------------+        +---+   +--------+
       
   222                        t1           t3           t5
       
   223 
       
   224 
       
   225         2                   +---+                     +------
       
   226 STATE   1              +----+   |   +---+        +----+
       
   227         0 -------------+        +---+   +--------+
       
   228 
       
   229 
       
   230 ****************************************************************)
       
   231 
       
   232 FUNCTION_BLOCK TOFF
       
   233   VAR_INPUT
       
   234     IN : BOOL;  (* first input parameter *)
       
   235     PT : TIME;  (* second input parameter *)
       
   236   END_VAR
       
   237   VAR_OUTPUT
       
   238     Q : BOOL := FALSE;  (* first output parameter *)
       
   239     ET : TIME := T#0s;  (* second output parameter *)
       
   240   END_VAR
       
   241 
       
   242   VAR
       
   243     STATE : SINT := 0;  (* internal state: 0-reset, 1-counting, 2-set *)
       
   244     PREV_IN : BOOL := FALSE;
       
   245     CURRENT_TIME, START_TIME : TIME;
       
   246   END_VAR
       
   247 
       
   248   {data__->CURRENT_TIME = __CURRENT_TIME;}
       
   249 
       
   250   IF ((STATE = 0) AND PREV_IN AND NOT(IN))   (* found falling edge on IN *)
       
   251   THEN
       
   252     (* start timer... *)
       
   253     STATE := 1;
       
   254     START_TIME := CURRENT_TIME;
       
   255 
       
   256   ELSE
       
   257     (* STATE is 1 or 2 !! *)
       
   258     IF (IN)
       
   259     THEN
       
   260       ET := T#0s;
       
   261       STATE := 0;
       
   262 
       
   263     ELSIF (STATE = 1)
       
   264     THEN
       
   265       IF ((START_TIME + PT) <= CURRENT_TIME)
       
   266       THEN
       
   267         STATE := 2;
       
   268         ET := PT;
       
   269       ELSE
       
   270         ET := CURRENT_TIME - START_TIME;
       
   271       END_IF;
       
   272     END_IF;
       
   273 
       
   274   END_IF;
       
   275 
       
   276   Q := IN OR (STATE = 1);
       
   277   PREV_IN := IN;
       
   278 
       
   279 END_FUNCTION_BLOCK
       
   280