
Сообщение от
Viktor D
Не совсем так. На дозатор выдаётся не импульс а постоянный сигнал по которому срабатывает его насос. От расходомера в дозаторе приходит импульс, что налито 2.77л (фиксированное количество, не меняется), по нему происходит останов двигателя. Если за один цикл, концентрация не достигнута - цикл повторяется. Далее по одному циклу при наполнении на следующие 500 литров.
Частичный слив - это как потребуется (в это время наполнение остановлено).
ПРоблема у меня, еси обобщить в том, что бы сделать расчёт не от нулевого уровня а от произвольного.
Буду пробовать что то сделать в очередной раз.
Вот пример от произвольного уровня:
Код:
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