
Сообщение от
FPavel
Если ПИД, то как лучше разбить участки для адекватной работы на краях диапазона? Или интегральный критерий?
2. каким алгоритмом предотвратить одновременное включение и выключение нескольких насосов - как организовать приоритет?
.
Код:
var input
нельзя1,
нельзя2,
нельзя3,
нельзя4: bool; //например авария
ПИД_выход: real; //0.0..1.0, снаружи определяется пид. И он не знает для чего. Да и не нужно ему
end_var
var output
пашет1,
пашет2,
пашет3,
пашет4: bool;
end_var
var
нельзя,
пашет,
пахал: array[1..4] of bool;
скока: array[1..4] of udint;
i: udint;
сейчас_пашет: udint;
нужно_пахателей: udint;
гонишь: tof;
дольше_всех: udint;
нашелся: udint;
-----------
нельзя[1] := нельзя1;
нельзя[2] := нельзя2;
нельзя[3] := нельзя3;
нельзя[4] := нельзя4;
for i := 1 to 4 do
пашет[i] := not нельзя[i] and пашет[i];
скока[i] := скока[i] + 1;
if пашет[i] <> пахал[i] then
пахал[i] := пашет[i];
скока[i] := 0;
end_if
end_for
сейчас_пашет :=
bool_to_udint(пашет[1]) +
bool_to_udint(пашет[2]) +
bool_to_udint(пашет[3]) +
bool_to_udint(пашет[4]);
case real_to_udint(ПИД_выход * 100.0) of
//например
0..5: нужно_пахателей := 0;
10..20: нужно_пахателей := 1;
30..45: нужно_пахателей := 2;
55..70: нужно_пахателей := 3;
80..100: нужно_пахателей := 4;
end_case
//А есля пид на стартя войдет с 73? - да пофиг. "И" есть
нашелся := 0;
if not гонишь.Q and сейчас_пашет <> нужно_пахателей then
дольше_всех := 0;
for i := 1 to 4 do
if сейчас_пашет > нужно_пахателей and пашет[i] and скока[i] >= дольше_всех then
нашелся := i;
дольше_всех := скока[i];
elsif сейчас_пашет < нужно_пахателей and not пашет[i] and not нельзя[i] and скока[i] >= дольше_всех then
нашелся := i;
дольше_всех := скока[i];
end_if
end_for
if нашелся <> 0 then
пашет[нашелся] := сейчас_пашет < нужно_пахателей;
end_if
end_if
гонишь(in := нашелся <> 0, pt := ...);
пашет1 := пашет[1];
пашет2 := пашет[2];
пашет3 := пашет[3];
пашет4 := пашет[4];
Для простого масштабирования
В битовые маски можно, но смысла не вижу. Да и логические для целочисленных не завезли
При массивах из фб - изящнее. Не завезли.