IF bInit THEN // Counter initialization: // [counter value] > [1/(<input frequency> * TaskCycleTime)] fbGetCurTaskIdx(); CMMcnt := REAL_TO_UINT( 1.1E7/(nMinFreqInput*UDINT_TO_REAL( _TaskInfo[fbGetCurTaskIdx.index].CycleTime))); // At least an entire period have to be sampled for min/max determination // Initialization, go on: nMaxValCnt :=CMMcnt; nMinValCnt :=CMMcnt; nMaxVal :=CMAXinit; nMinVal :=CMINinit; bInit := FALSE; END_IF // Assertions: new min/max values exists: bValidMaxVal := TRUE; bValidMinVal := TRUE; // Filter min/max values IF (nMaxVal < nInputValue) THEN bValidMaxVal := FALSE; nMaxVal := nInputValue; // Max value was found END_IF IF (nMinVal > nInputValue) THEN bValidMinVal := FALSE; nMinVal := nInputValue; // Min value was found END_IF // Count down, if no new value come in: IF (bValidMaxVal AND (nMaxValCnt > 0)) THEN nMaxValCnt := nMaxValCnt - 1; END_IF // Count down, if no new value come in: IF (bValidMinVal AND (nMinValCnt > 0)) THEN nMinValCnt := nMinValCnt - 1; END_IF IF ((nMaxValCnt = 0) AND (nMinValCnt = 0)) THEN // Consequence: min/max determined bInit := TRUE; // Prepare next call bRESULT := NOT (nMaxVal = nMinVal); // Sign valid results ELSE bRESULT := FALSE; // Sign still invalid results END_IF