TGViewer
КОТЭ в АСУ ТП КОТЭ в АСУ ТП @catinasutp · 298 subscribers
Post #70 929
15. Анализ мощности насоса

На КНС насосы могут забиваться всяким неприятным, что влияет на производительность работы насоса. Сначала мы глядели на маленький ток и понимали, что насос пора как минимум “реверснуть”, как максимум — поднимать и чистить.

Ну и решили написать небольшой блочок для анализа мощности насоса. Если значение процентов отклонения мощностей (текущей и расчетной) превышает предупредительный и аварийный порог, на панели оператора появляется сообщение, либо насос отключается и переключается на следующий готовый к работе (необходимость отключения задается в настройках)

В моем примере расчётная мощность высчитывается линейно по двум точкам. На фото пример настройки, параметры мощности по желанию заказчика зависят от количества работающих насосов, выбор пары мощностей вынесен за пределы ФБ, для универсальности.

Область объявления переменных:
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
  • 👍 8
  • 🔥 4
  • ❤ 1
More from @catinasutp
  1. Oct 2, 2026Post #73
  2. Oct 2, 2026Post #72
  3. Jul 20, 2026Post #71
  4. Jun 9, 2026Прагматичный китайский и интригующий японский. Тот случай, когда из документации на оборуд…
  5. May 26, 202614. Конфигурация видового экрана в AutoCAD Славься, человек, придумавший конфигурацию видо…
  6. May 18, 2026Закопался в работе, как блоха в шерсти уличного пса, которого обходит стороной наш герой,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →