(* @NESTEDCOMMENTS := 'Yes' *) (* @PATH := '' *) (* @OBJECTFLAGS := '0, 8' *) (* @SYMFILEFLAGS := '2048' *) FUNCTION_BLOCK DELAY VAR_INPUT X,Xinit:REAL; (*входной сигнал и его начальное значение*) Delay, Step:TIME; (*время запаздывания и шаг по времени *) END_VAR VAR_OUTPUT Y:REAL; (*выходной сигнал*) Error:BOOL; (*признак ошибки*) END_VAR VAR buffer: ARRAY [0..100] OF REAL; (*буфер переменной*) current:DWORD:=0; (*место удаления/вставки*) count:DWORD:=0; (*количество элементов в буфере*) bInit:BOOL; (*признак выполнения инициализации*) BufferSize:WORD;(*размер буфера*) t0: TIME; delta: TIME; t0_prev: TIME; END_VAR (* @END_DECLARATION := '0' *) IF NOT bInit THEN BufferSize:=TIME_TO_WORD(Delay)/TIME_TO_WORD(Step); IF BufferSize<0 OR BufferSize>100 THEN Error:=TRUE; RETURN; END_IF bInit:=TRUE; Y:=XInit; END_IF IF count < BufferSize THEN(*буфер еще не заполнен*) Y:=XInit; buffer[count] := X; count:=count+1; ELSE Y:=buffer[current]; buffer[current]:=X; current:=(current+1) MOD count; END_IF DelayUpdateEnable:=FALSE; IF current=0 THEN t0:=TIME(); delta:=t0-t0_prev; t0_prev:=t0; END_IF END_FUNCTION_BLOCK