
Сообщение от
Vadik2881
Ну ты читай между строк же

) MS4D я только в руки взял и она достаточно громоздкая. А не простые проекты лучше делать на том, что лучше знаешь! Потом перенести алгоритм совсем не проблема. В конечном счёте, проект будет на ПЛК110-60.
Ну а с FIFO функция первый пришёл - первый ушёл - вроде как реализована. Будем считать это альтернативным вариантом исполнения. Но думаю на настоящем FIFO данную задачу тоже можно и нужно делать!
Народ, ну чё, никто не потестил?
Сейчас думаю как доработать очередь и сделать выбор для одновременного обслуживания двух и более (хотя бы двух) абонентов и пока что-то нет мыслей...
Ну, я потестил! Я в упор не вижу FIFO.
Owen1.jpg
Подсчет длительности импульсов (*0,2сек) на каждом входе и потом поиск входа с максимальной длительностью и всё!
Может надо запихивать длительность каждого импульса на одном входе в буфер?
Owen2.jpg
Если хочется буфер на ST?
Owen3.jpg
cделайте на ST
В чём проблема-то ?
Код:
function_block FIFO
var_input
in : udint;
shift : bool;
end_var
var_output
out: udint;
end_var
var
out0, out1, out2, out3, out4, out5, out6, out7, out8 : udint;
end_var
if shift then
out := out8;
out8 := out7;
out7 := out6;
out6 := out5;
out5 := out4;
out4 := out3;
out3 := out2;
out2 := out1;
out1 := out0;
out0 := in;
end_if
end_function_block
Если речь о фиксации входа с исключением, то:
Owen4.jpg
самый простой вариант
Код:
function_block Push
var_input
I1, I2, I3, I4, I5, I6, I7, I8 : bool;
end_var
var_output
Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8 : bool;
end_var
var
State, newState : udint;
end_var
newState.0 := I1; newState.1 := I2; newState.2 := I3; newState.3 := I4;
newState.4 := I5; newState.5 := I6; newState.6 := I7; newState.7 := I8;
if newState > 0 then
if newState <> State then
State := newState;
Q1 := I1; Q2 := I2; Q3 := I3; Q4 := I4;
Q5 := I5; Q6 := I6; Q7 := I7; Q8 := I8;
end_if
end_if
end_function_block
Тоже без ST:
Owen5.jpg
Фиксация следующего при условии что он единственный активный:
Код:
function_block Push
var_input
I1, I2, I3, I4, I5, I6, I7, I8 : bool;
end_var
var_output
Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8 : bool;
end_var
var
State, newState : udint;
Cnt : udint; // Кол-во активных входов
end_var
newState.0 := I1; newState.1 := I2; newState.2 := I3; newState.3 := I4;
newState.4 := I5; newState.5 := I6; newState.6 := I7; newState.7 := I8;
Cnt := 0;
if I1 then Cnt := Cnt + 1; end_if
if I2 then Cnt := Cnt + 1; end_if
if I3 then Cnt := Cnt + 1; end_if
if I4 then Cnt := Cnt + 1; end_if
if I5 then Cnt := Cnt + 1; end_if
if I6 then Cnt := Cnt + 1; end_if
if I7 then Cnt := Cnt + 1; end_if
if I8 then Cnt := Cnt + 1; end_if
if newState > 0 and Cnt = 1 and newState <> State then
State := newState;
Q1 := I1; Q2 := I2; Q3 := I3; Q4 := I4;
Q5 := I5; Q6 := I6; Q7 := I7; Q8 := I8;
end_if
end_function_block