FIFO для булевых переменных в CDS 3.5
Цитата Сообщение от B.S.V Посмотреть сообщение
А что еще надо? Истина - в очереди, лож - вылетаешь.
основное - что CDS.


Код:
FUNCTION_BLOCK ??  //обязательно FB...
VAR_INPUT
   in1, ...., inXX: BOOL; //XX здесь и дальше - сами. Но и 254 можно запилить
END_VAR
VAR_OUTPUT
   Out: BYTE; //номер того кто на выходе, 0 - никто
END_VAR
VAR
   Pin: POINTER TO ARRAY[1..XX] OF BOOL; //.. потому что FB
   P: POINTER TO BYTE;
   Str1: STRING(1) := '*';
   Очередь: STRING(XX);
   Pos: INT;
END_VAR
-------------------------------------------
Pin := ADR(in1);
P := ADR(Str1);
FOR P^ := 1 TO XX DO
   Pos := FIND(Очередь, Str1);
   IF Pos <> 0 AND NOT Pin^[P^] THEN //был и лож - вылетаешь (жопу поднял - место потерял)
      Str := DELETE(Очередь, 1, Pos);   
   ELSIF Pos = 0 AND Pin^[P^] THEN //не был, но Истина - в очереди(ь)
      Str := CONCAT(Очередь, Str1); //но FIFO
   END_IF
END_FOR
P := ADR(Очередь);
Out := P^;
всё