
Сообщение от
Рогов Алексей
Потребуется два массива - один для времени, другой для номера ошибки
Строб - флаг ошибки от устройств
FUNCTION_BLOCK FB_Array16U1
VAR_INPUT
inValue: UDINT; (* Входное значение (целое) *)
reset: BOOL; (* Сигнал сброса массива *)
strobe: BOOL; (* Стробирующий импульс: запись при фронте TRUE *)
END_VAR
VAR_OUTPUT
out1: UDINT; (* Выход 1 — самое старое значение *)
out2: UDINT;
out3: UDINT;
out4: UDINT;
out5: UDINT;
out6: UDINT;
out7: UDINT;
out8: UDINT;
out9: UDINT;
out10: UDINT;
out11: UDINT;
out12: UDINT;
out13: UDINT;
out14: UDINT;
out15: UDINT;
out16: UDINT; (* Выход 16 — самое новое значение *)
END_VAR
VAR
arr: ARRAY [1..16] OF UDINT; (* Массив на 16 элементов *)
idx: UDINT := 1; (* Текущий индекс записи *)
lastStrobe: BOOL := FALSE; (* Для детектирования фронта строба *)
END_VAR
(* Сброс массива и состояния при входе reset *)
IF reset THEN
FOR idx := 1 TO 16 DO
arr[idx] := 0;
END_FOR
idx := 1;
lastStrobe := FALSE;
ELSIF strobe AND NOT lastStrobe THEN
(* Запись нового значения по фронту строба *)
arr[idx] := inValue;
(* Циклическое обновление индекса: 1..16, затем снова 1 *)
idx := idx + 1;
IF idx > 16 THEN
idx := 1;
END_IF
END_IF
(* Сохранение состояния строба для следующего цикла *)
lastStrobe := strobe;
(* Вывод значений массива на выходы *)
out1 := arr[1];
out2 := arr[2];
out3 := arr[3];
out4 := arr[4];
out5 := arr[5];
out6 := arr[6];
out7 := arr[7];
out8 := arr[8];
out9 := arr[9];
out10 := arr[10];
out11 := arr[11];
out12 := arr[12];
out13 := arr[13];
out14 := arr[14];
out15 := arr[15];
out16 := arr[16];
END_FUNCTION_BLOCK