Код:
function_block Queue
var_input
I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16 : bool;
I17, I18, I19, I20, I21, I22, I23, I24, I25, I26, I27, I28, I29, I30, I31, I32 : bool;
N : udint; // Сколько можно загружать одновременно
end_var
var_output
Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, Q16 : bool;
Q17, Q18, Q19, Q20, Q21, Q22, Q23, Q24, Q25, Q26, Q27, Q28, Q29, Q30, Q31, Q32 : bool;
end_var
var
tr1, tr2, tr3, tr4, tr5, tr6, tr7, tr8, tr9, tr10, tr11, tr12, tr13, tr14, tr15, tr16 : SYS.RTRIG;
tr17, tr18, tr19, tr20, tr21, tr22, tr23, tr24, tr25, tr26, tr27, tr28, tr29, tr30, tr31, tr32 : SYS.RTRIG;
ts1, ts2, ts3, ts4, ts5, ts6, ts7, ts8, ts9, ts10, ts11, ts12, ts13, ts14, ts15, ts16 : dt;
ts17, ts18, ts19, ts20, ts21, ts22, ts23, ts24, ts25, ts26, ts27, ts28, ts29, ts30, ts31, ts32 : dt;
LoadCount : udint; // Текущее количество под загрузкой
nQ : udint; // Следующий в очереди и время его прибытия
minTime : dt; // .. и время его прибытия
end_var
// Фиксируем прибытие в очередь
tr1(I:=I1); tr2(I:=I2); tr3(I:=I3); tr4(I:=I4); tr5(I:=I5); tr6(I:=I6); tr7(I:=I7); tr8(I:=I8);
tr9(I:=I9); tr10(I:=I10); tr11(I:=I11); tr12(I:=I12); tr13(I:=I13); tr14(I:=I14); tr15(I:=I15); tr16(I:=I16);
tr17(I:=I17); tr18(I:=I18); tr19(I:=I19); tr20(I:=I20); tr21(I:=I21); tr22(I:=I22); tr23(I:=I23); tr24(I:=I24);
tr25(I:=I25); tr26(I:=I27); tr27(I:=I27); tr28(I:=I28); tr29(I:=I29); tr30(I:=I30); tr31(I:=I31); tr31(I:=I32);
// Фиксируем время прибытия
if tr1.Q then ts1 := get_date_time(); end_if
if tr2.Q then ts2 := get_date_time(); end_if
if tr3.Q then ts3 := get_date_time(); end_if
if tr4.Q then ts4 := get_date_time(); end_if
if tr5.Q then ts5 := get_date_time(); end_if
if tr6.Q then ts6 := get_date_time(); end_if
if tr7.Q then ts7 := get_date_time(); end_if
if tr8.Q then ts8 := get_date_time(); end_if
if tr9.Q then ts9 := get_date_time(); end_if
if tr10.Q then ts10 := get_date_time(); end_if
if tr11.Q then ts11 := get_date_time(); end_if
if tr12.Q then ts12 := get_date_time(); end_if
if tr13.Q then ts13 := get_date_time(); end_if
if tr14.Q then ts14 := get_date_time(); end_if
if tr15.Q then ts15 := get_date_time(); end_if
if tr16.Q then ts16 := get_date_time(); end_if
if tr17.Q then ts17 := get_date_time(); end_if
if tr18.Q then ts18 := get_date_time(); end_if
if tr19.Q then ts19 := get_date_time(); end_if
if tr20.Q then ts20 := get_date_time(); end_if
if tr21.Q then ts21 := get_date_time(); end_if
if tr22.Q then ts22 := get_date_time(); end_if
if tr23.Q then ts23 := get_date_time(); end_if
if tr24.Q then ts24 := get_date_time(); end_if
if tr25.Q then ts25 := get_date_time(); end_if
if tr26.Q then ts26 := get_date_time(); end_if
if tr27.Q then ts27 := get_date_time(); end_if
if tr28.Q then ts28 := get_date_time(); end_if
if tr29.Q then ts29 := get_date_time(); end_if
if tr30.Q then ts30 := get_date_time(); end_if
if tr31.Q then ts31 := get_date_time(); end_if
if tr32.Q then ts32 := get_date_time(); end_if
// Фиксируем выход из под загрузки
if not I1 then Q1 := false; end_if
if not I2 then Q2 := false; end_if
if not I3 then Q3 := false; end_if
if not I4 then Q4 := false; end_if
if not I5 then Q5 := false; end_if
if not I6 then Q6 := false; end_if
if not I7 then Q7 := false; end_if
if not I8 then Q8 := false; end_if
if not I9 then Q9 := false; end_if
if not I10 then Q10 := false; end_if
if not I11 then Q11 := false; end_if
if not I12 then Q12 := false; end_if
if not I13 then Q13 := false; end_if
if not I14 then Q14 := false; end_if
if not I15 then Q15 := false; end_if
if not I16 then Q16 := false; end_if
if not I17 then Q17 := false; end_if
if not I18 then Q18 := false; end_if
if not I19 then Q19 := false; end_if
if not I20 then Q20 := false; end_if
if not I21 then Q21 := false; end_if
if not I22 then Q22 := false; end_if
if not I23 then Q23 := false; end_if
if not I24 then Q24 := false; end_if
if not I25 then Q25 := false; end_if
if not I26 then Q26 := false; end_if
if not I27 then Q27 := false; end_if
if not I28 then Q28 := false; end_if
if not I29 then Q29 := false; end_if
if not I30 then Q30 := false; end_if
if not I31 then Q31 := false; end_if
if not I32 then Q32 := false; end_if
// Подсчитаем сколько сейчас под загрузкой
LoadCount := 0;
if Q1 then LoadCount := LoadCount + 1; end_if
if Q2 then LoadCount := LoadCount + 1; end_if
if Q3 then LoadCount := LoadCount + 1; end_if
if Q4 then LoadCount := LoadCount + 1; end_if
if Q5 then LoadCount := LoadCount + 1; end_if
if Q6 then LoadCount := LoadCount + 1; end_if
if Q7 then LoadCount := LoadCount + 1; end_if
if Q8 then LoadCount := LoadCount + 1; end_if
if Q9 then LoadCount := LoadCount + 1; end_if
if Q10 then LoadCount := LoadCount + 1; end_if
if Q11 then LoadCount := LoadCount + 1; end_if
if Q12 then LoadCount := LoadCount + 1; end_if
if Q13 then LoadCount := LoadCount + 1; end_if
if Q14 then LoadCount := LoadCount + 1; end_if
if Q15 then LoadCount := LoadCount + 1; end_if
if Q16 then LoadCount := LoadCount + 1; end_if
if Q17 then LoadCount := LoadCount + 1; end_if
if Q18 then LoadCount := LoadCount + 1; end_if
if Q19 then LoadCount := LoadCount + 1; end_if
if Q20 then LoadCount := LoadCount + 1; end_if
if Q21 then LoadCount := LoadCount + 1; end_if
if Q22 then LoadCount := LoadCount + 1; end_if
if Q23 then LoadCount := LoadCount + 1; end_if
if Q24 then LoadCount := LoadCount + 1; end_if
if Q25 then LoadCount := LoadCount + 1; end_if
if Q26 then LoadCount := LoadCount + 1; end_if
if Q28 then LoadCount := LoadCount + 1; end_if
if Q29 then LoadCount := LoadCount + 1; end_if
if Q30 then LoadCount := LoadCount + 1; end_if
if Q31 then LoadCount := LoadCount + 1; end_if
if Q32 then LoadCount := LoadCount + 1; end_if
// Если можно поставить под зашрузку еще кого-то, то ..
if LoadCount < N then
minTime := get_date_time(); nQ := 0; // Пока нет кандидата
// Но если стоишь в очереди и еще не загружаешься и с временем меньше чем у кандитата, то становишься первым кандидатом
if I1 and not Q1 and dt_to_udint(ts1) < dt_to_udint(minTime) then minTime := ts1; nQ := 1; end_if
if I2 and not Q2 and dt_to_udint(ts2) < dt_to_udint(minTime) then minTime := ts2; nQ := 2; end_if
if I3 and not Q3 and dt_to_udint(ts3) < dt_to_udint(minTime) then minTime := ts3; nQ := 3; end_if
if I4 and not Q4 and dt_to_udint(ts4) < dt_to_udint(minTime) then minTime := ts4; nQ := 4; end_if
if I5 and not Q5 and dt_to_udint(ts5) < dt_to_udint(minTime) then minTime := ts5; nQ := 5; end_if
if I6 and not Q6 and dt_to_udint(ts6) < dt_to_udint(minTime) then minTime := ts6; nQ := 6; end_if
if I7 and not Q7 and dt_to_udint(ts7) < dt_to_udint(minTime) then minTime := ts7; nQ := 7; end_if
if I8 and not Q8 and dt_to_udint(ts8) < dt_to_udint(minTime) then minTime := ts8; nQ := 8; end_if
if I9 and not Q9 and dt_to_udint(ts9) < dt_to_udint(minTime) then minTime := ts9; nQ := 9; end_if
if I10 and not Q10 and dt_to_udint(ts10) < dt_to_udint(minTime) then minTime := ts10; nQ := 10; end_if
if I11 and not Q11 and dt_to_udint(ts11) < dt_to_udint(minTime) then minTime := ts11; nQ := 11; end_if
if I12 and not Q12 and dt_to_udint(ts12) < dt_to_udint(minTime) then minTime := ts12; nQ := 12; end_if
if I13 and not Q13 and dt_to_udint(ts13) < dt_to_udint(minTime) then minTime := ts13; nQ := 13; end_if
if I14 and not Q14 and dt_to_udint(ts14) < dt_to_udint(minTime) then minTime := ts14; nQ := 14; end_if
if I15 and not Q15 and dt_to_udint(ts15) < dt_to_udint(minTime) then minTime := ts15; nQ := 15; end_if
if I16 and not Q16 and dt_to_udint(ts16) < dt_to_udint(minTime) then minTime := ts16; nQ := 16; end_if
if I17 and not Q17 and dt_to_udint(ts17) < dt_to_udint(minTime) then minTime := ts17; nQ := 17; end_if
if I18 and not Q18 and dt_to_udint(ts18) < dt_to_udint(minTime) then minTime := ts18; nQ := 18; end_if
if I19 and not Q19 and dt_to_udint(ts19) < dt_to_udint(minTime) then minTime := ts19; nQ := 19; end_if
if I20 and not Q20 and dt_to_udint(ts20) < dt_to_udint(minTime) then minTime := ts20; nQ := 20; end_if
if I21 and not Q21 and dt_to_udint(ts21) < dt_to_udint(minTime) then minTime := ts21; nQ := 21; end_if
if I22 and not Q22 and dt_to_udint(ts22) < dt_to_udint(minTime) then minTime := ts22; nQ := 22; end_if
if I23 and not Q23 and dt_to_udint(ts23) < dt_to_udint(minTime) then minTime := ts23; nQ := 23; end_if
if I24 and not Q24 and dt_to_udint(ts24) < dt_to_udint(minTime) then minTime := ts24; nQ := 24; end_if
if I25 and not Q25 and dt_to_udint(ts25) < dt_to_udint(minTime) then minTime := ts25; nQ := 25; end_if
if I26 and not Q26 and dt_to_udint(ts26) < dt_to_udint(minTime) then minTime := ts26; nQ := 26; end_if
if I27 and not Q27 and dt_to_udint(ts27) < dt_to_udint(minTime) then minTime := ts27; nQ := 27; end_if
if I28 and not Q28 and dt_to_udint(ts28) < dt_to_udint(minTime) then minTime := ts28; nQ := 28; end_if
if I29 and not Q29 and dt_to_udint(ts29) < dt_to_udint(minTime) then minTime := ts29; nQ := 29; end_if
if I30 and not Q30 and dt_to_udint(ts30) < dt_to_udint(minTime) then minTime := ts30; nQ := 30; end_if
if I31 and not Q31 and dt_to_udint(ts31) < dt_to_udint(minTime) then minTime := ts31; nQ := 31; end_if
if I32 and not Q32 and dt_to_udint(ts32) < dt_to_udint(minTime) then minTime := ts32; nQ := 32; end_if
// Если найден подходящий кандидат, то включаем его под загрузку
case nQ of
1: Q1 := true;
2: Q2 := true;
3: Q3 := true;
4: Q4 := true;
5: Q5 := true;
6: Q6 := true;
7: Q7 := true;
8: Q8 := true;
9: Q9 := true;
10: Q10 := true;
11: Q11 := true;
12: Q12 := true;
13: Q13 := true;
14: Q14 := true;
15: Q15 := true;
16: Q16 := true;
17: Q17 := true;
18: Q18 := true;
19: Q19 := true;
20: Q20 := true;
21: Q21 := true;
22: Q22 := true;
23: Q23 := true;
24: Q24 := true;
25: Q25 := true;
26: Q26 := true;
27: Q27 := true;
28: Q28 := true;
29: Q29 := true;
30: Q30 := true;
31: Q31 := true;
32: Q32 := true;
end_case
end_if
end_function_block
В вашем случае идет подсчет времени ожидания и, в принципе, вход с наибольшим накопленным временем тоже кандидат.