Вы наверное представили шнековый, у винтового немного другой принцип и самотеком из него не вытекает...
Вид для печати
Вот пример от произвольного уровня:
Код:function_block grout
var_input
Start, Stop : bool; // Старт/Стоп приготовления
Probe : bool; // Зонд
inEmulsion, inAcid : bool; // Импульсы с расходомеров
end_var
var_output
BatcherEmulsion : bool; // Дозатор эмульсии
BatcherAcid : bool; // Дозатор кислоты
Done : bool; // Раствор готов
end_var
var
OnOff : SYS.RS; // Сотстояние Работа/Ожидание
rtEmulsion, rtAcid : SYS.RTRIG; // Фиксация импульсов
TotalEmulsion, TotalAcid : real; // Накопленные дозы
CalcAcid : real; // Расчетное кол-во кислоты
end_var
rtEmulsion(I := inEmulsion); rtAcid(I := inAcid); // Фиксация импульсов
OnOff(S := Start, R := not Stop); // Пуск/Стоп наведения
if rtEmulsion.Q then
TotalEmulsion := TotalEmulsion + 500; // + доза эмульсии
Done := false; // Новая доза снимает готовность раствора
end_if
if rtAcid.Q then
TotalAcid := TotalAcid + 2.77; // + доза кислоты
Done := false; // Новая доза снимает готовность раствора
end_if
CalcAcid := TotalEmulsion / 500 * 2.77; // Требуемый объем кислоты
if OnOff.Q then // Если наведение включено, ..
BatcherEmulsion := not Probe; // Наполняем эмульсией до зонда
BatcherAcid := Probe and TotalAcid < CalcAcid; // или наполняем кислотой до расчетного объема
Done := not BatcherEmulsion and not BatcherAcid; // Если дозировать больше не надо, сообщим о готовности раствора
else // Если наведение выключено, ..
BatcherEmulsion := false; // то всё выключаем
BatcherAcid := false;
end_if
end_function_block
Насчёт дозатора - это не ко мне. В задании было указано сделать так как я выше написал. Вот и делаю.
Мешалка есть. Включается по срабатыванию минимального зонда.
Спасибо за пример. Изучаю.