Код:
FUNCTION_BLOCK TFans32
VAR_INPUT
PT:TIME;
(*Если на вход можно массив пихнуть, то даже проще.*)
Di1, Di2, Di3, Di4, Di5, Di6, Di7, Di8, Di9, Di10, Di11, Di12, Di13, Di14,
Di15, Di16, Di17, Di18, Di19, Di20, Di21, Di22, Di23, Di24, Di25, Di26,
Di27, Di28, Di29, Di30, Di31, Di32, Di33, Di34, Di35, Di36, Di37, Di38,
Di39, Di40, Di41, Di42, Di43, Di44, Di45, Di46, Di47, Di48, Di49, Di50,
Di51, Di52, Di53, Di54, Di55, Di56, Di57, Di58, Di59, Di60, Di61, Di62,
Di63, Di64: BOOL;
Di65, Di66, Di67, Di68, Di69, Di70, Di71, Di72, Di73, Di74, Di75, Di76,
Di77, Di78, Di79, Di80, Di81, Di82, Di83, Di84, Di85, Di86, Di87, Di88,
Di89, Di90, Di91, Di92, Di93, Di94, Di95, Di96, Di97, Di98, Di99, Di100,
Di101, Di102, Di103, Di104, Di105, Di106, Di107, Di108, Di109, Di110,
Di111, Di112, Di113, Di114, Di115, Di116, Di117, Di118, Di119, Di120,
Di121, Di122, Di123, Di124, Di125, Di126, Di127, Di128: BOOL;
Di129, Di130, Di131, Di132, Di133, Di134, Di135, Di136, Di137, Di138,
Di139, Di140, Di141, Di142, Di143, Di144, Di145, Di146, Di147, Di148,
Di149, Di150, Di151, Di152, Di153, Di154, Di155, Di156, Di157, Di158,
Di159, Di160: BOOL;
END_VAR
VAR_OUTPUT
Do1, Do2, Do3, Do4, Do5, Do6, Do7, Do8, Do9, Do10, Do11, Do12, Do13, Do14,
Do15, Do16, Do17, Do18, Do19, Do20, Do21, Do22, Do23, Do24, Do25, Do26,
Do27, Do28, Do29, Do30, Do31, Do32, Do33, Do34, Do35, Do36, Do37, Do38,
Do39, Do40, Do41, Do42, Do43, Do44, Do45, Do46, Do47, Do48, Do49, Do50,
Do51, Do52, Do53, Do54, Do55, Do56, Do57, Do58, Do59, Do60, Do61, Do62,
Do63, Do64: BOOL;
END_VAR
VAR
Set:ARRAY[1..160] OF DWORD:=
(*В этом массиве хранитса состояние вентиляторов
для каждого из 160 маршрутов норий №1-4*)
(*16*)
2#00000000000000000000000000000000,
2#00000000000000000000000000000000,
.............................................................
2#00000000000000000000000000000000;
Fan:ARRAY[0..31] OF TFan;
i:INT;
State: DWORD;
PDi, PStart, PStop:POINTER TO BOOL;
tStart, tStop:TP;
END_VAR
(*******************************************)
State:=0;
PDi:=ADR(Di1);
FOR i:=1 TO 160 DO
State:= SEL(PDi^,State,State OR Set[i]);
PDi:=PDi+1;
END_FOR
PStart:=ADR(Do1);
PStop:=ADR(Do2);
FOR i:=0 TO 31 DO
Fan[i](
State:=EXTRACT(State,i),
Start=> PStart^,
Stop=>PStop^
);
PStart:=PStart+2;
PStop:=PStop+2;
END_FOR