etisserant@0: FUNCTION_BLOCK LAG1 etisserant@0: VAR_INPUT etisserant@0: RUN : BOOL ; (* 1 = run, 0 = reset *) etisserant@0: XIN : REAL ; (* Input variable *) etisserant@0: TAU : TIME ; (* Filter time constant *) etisserant@0: CYCLE : TIME ; (* Sampling time interval *) etisserant@0: END_VAR etisserant@0: VAR_OUTPUT XOUT : REAL ; END_VAR (* Filtered output *) etisserant@0: VAR K : REAL ; (* Smoothing constant, 0.0<=K<1.0 *) etisserant@0: END_VAR etisserant@0: IF RUN THEN XOUT := XOUT + K * (XIN - XOUT) ; etisserant@0: ELSE XOUT := XIN ; etisserant@0: K := TIME_TO_REAL(CYCLE) / TIME_TO_REAL(CYCLE + TAU) ; etisserant@0: END_IF ; etisserant@0: END_FUNCTION_BLOCK etisserant@0: