Standard function blocks: counter, triggers

This test case it part of the test suite proposed for new devices.

Test case ID: R0095
Language: ST

Code:
tests2/t0095.st
(* Test some function blocks from stdlib *)
PROGRAM Test_R0095
VAR
    srb : SR;
    rsb : RS;
    rtrigb : R_TRIG;
    ftrigb : F_TRIG;
    ctub : CTU;
    ctdb : CTD; // down counter (also for rising edges)
    srb_q1,rsb_q1 : BOOL;
    
END_VAR
    srb( S1 := TRUE, Q1 => srb_q1);
    rsb( R1 := TRUE, S:= TRUE , Q1 => rsb_q1); // RESET rules: Q1=FALSE

    rtrigb( CLK := TRUE);
    rtrigb( CLK := TRUE);
    ftrigb( CLK := TRUE);
    ftrigb( CLK := FALSE);

    ctub(CU:=TRUE);
    ctub(R :=TRUE, PV:=5); // RESET
    ctub(R := FALSE,CU:=TRUE); // not a rising edge: no effect 
    ctub(CU:=TRUE);
    ctub(CU:=FALSE);              
    ctub(CU:=TRUE, PV:=0);     // rising edge, : counter = 1 > PV: Q=TRUE 
    
             
    ctdb(CD := TRUE);
    ctdb(LD := TRUE, PV:=5);  // loads counter=5
    ctdb(LD := FALSE, CD:=TRUE); // not a rising edge! no effect
    ctdb(CD:=TRUE); // idem
    ctdb(CD:=TRUE);
    ctdb(CD:=FALSE);
    ctdb(CD:=TRUE, PV:=2);  // rising edge, decreases counter to 4. pv=2 has no effect


_GEB_ASSERT_(ctdb.CD=1);
_GEB_ASSERT_(ctdb.CV=4);
_GEB_ASSERT_(ctdb.Q=0);

_GEB_ASSERT_(ctub.CU=1);
_GEB_ASSERT_(ctub.CV=1);
_GEB_ASSERT_(ctub.Q=1);

_GEB_ASSERT_(rsb_q1 = 0);
_GEB_ASSERT_(srb_q1 = 1);


END_PROGRAM