На КНС насосы могут забиваться всяким неприятным, что влияет на производительность работы насоса. Сначала мы глядели на маленький ток и понимали, что насос пора как минимум “реверснуть”, как максимум — поднимать и чистить.
Ну и решили написать небольшой блочок для анализа мощности насоса. Если значение процентов отклонения мощностей (текущей и расчетной) превышает предупредительный и аварийный порог, на панели оператора появляется сообщение, либо насос отключается и переключается на следующий готовый к работе (необходимость отключения задается в настройках)
В моем примере расчётная мощность высчитывается линейно по двум точкам. На фото пример настройки, параметры мощности по желанию заказчика зависят от количества работающих насосов, выбор пары мощностей вынесен за пределы ФБ, для универсальности.
Область объявления переменных:
FUNCTION_BLOCK FB_POWER_CONTROL
VAR_INPUT
rSpFreqMin :REAL; // Частота, от которой начинаем контролировать мощность
rSpPow1, rSpPow2 :REAL; // Уставки мощности для точек 1 и 2
rSpFreq1, rSpFreq2 :REAL; // Уставки частоты для точек 1 и 2
rSpPerWarn,rSpPerAlr :REAL; // Пороги отклонения мощности в процентах
rPower, rFreq :REAL; // Текущие мощность и частота насоса
uiSpTimeDelay :UINT; // Задержка возникновения сообщений
END_VAR
VAR_OUTPUT
xWarn, xAlr :BOOL; // Предупредительный и аварийный сигналы
rPerCount :REAL; // Текущее отклонение мощности от расчётной
rPowerCalc :REAL; // Расчетное значение мощности при текущей частоте
END_VAR
VAR
a, b :REAL;
tonDelayWarn :TON;
tonDelayAlr :TON;
END_VAR
Тело функционального блока:
// Расчёт коэффициентов линейного уравнения
IF rSpFreq2 - rSpFreq1 <> 0.0 THEN
a := (rSpPow2 - rSpPow1) / (rSpFreq2 - rSpFreq1);
b := (rSpPow1 * rSpFreq2 - rSpPow2 * rSpFreq1) / (rSpFreq2 - rSpFreq1);
ELSE
a := 0.0;
b := 0.0;
END_IF;
// Вычисление рассчетной мощности
rPowerCalc := a * rFreq + b;
// Вычисление отклонения текущей мощности от расчётной
IF rFreq >= rSpFreqMin AND rPowerCalc <> 0.0 AND rPower <> 0.0 THEN
IF rPower < rPowerCalc THEN
rPerCount := (1.0 - rPower / rPowerCalc) * 100.0;
ELSE
rPerCount := (1.0 - rPowerCalc / rPower) * 100.0;
END_IF;
ELSE
rPerCount := 0.0;
END_IF;
// Формирование предупредительного и аварийного сигналов
tonDelayWarn(IN := rPerCount > rSpPerWarn, PT := T#1s * uiSpTimeDelay);
tonDelayAlr(IN := rPerCount > rSpPerAlr, PT := T#1s * uiSpTimeDelay);
xWarn := tonDelayWarn.Q;
xAlr := tonDelayAlr.Q;
Этот блок пригодится нам не только на КНС, но и везде, где изменение нагрузки говорит о нештатной ситуации.
#Программирование@catInAsuTp
