Вход

Просмотр полной версии : Настройка ПИД в ПР200 (уставка/время)



Anthony.Alekseev
09.09.2024, 21:23
Привет. Тут пытаюсь построить сушило
Есть 11 параметров температуры (в документе)
Уставки по температуре вроде дошло до меня как поставить...
А вот время нагрева до определенной температуры - нет... Не подскажите как отрегулировать ПИД с учетом времени и температуры?

kondor3000
09.09.2024, 21:31
Привет. Тут пытаюсь построить сушило
Есть 11 параметров температуры (в документе)
Уставки по температуре вроде дошло до меня как поставить...
А вот время нагрева до определенной температуры - нет... Не подскажите как отрегулировать ПИД с учетом времени и температуры?

Вам уже ответили в соседней теме, зачем столько тем создавать? https://owen.ru/forum/showthread.php?t=40181

Anthony.Alekseev
10.09.2024, 08:20
тот ответ мне не помог

EFrol
10.09.2024, 08:24
Специально для Вас, Антон.
78537



function Ust: udint;
var_input
tm : udint;
end_var

Ust := 0;
if tm > 0 then Ust := tm * 50 / 30; end_if
if tm > 30 then Ust := 50; end_if
if tm > 90 then Ust := 50 + (tm - 90) * 50 / 30; end_if
if tm > 120 then Ust := 100; end_if
if tm > 180 then Ust := 100 + (tm - 180) * 10 / 30; end_if
if tm > 210 then Ust := 110; end_if
if tm > 300 then Ust := 110 + (tm -300) * 20 / 30; end_if
if tm > 330 then Ust := 130; end_if
if tm > 420 then Ust := 130 + (tm - 420) * 20 / 30; end_if
if tm > 450 then Ust := 150; end_if
if tm > 560 then Ust := 0; end_if

end_function

Anthony.Alekseev
12.09.2024, 09:29
FUNCTION_BLOCK FB_PEKA_TOP2
VAR_INPUT
start : BOOL; // Стартовый сигнал
currentTemp : REAL; // Фактическая температура (в градусах)
elapsedTime : REAL; // Прошедшее время (в секундах)

// Уставки температуры и времени
tempSetpoint1 : REAL;
tempSetpoint2 : REAL;
tempSetpoint3 : REAL;
tempSetpoint4 : REAL;
tempSetpoint5 : REAL;
tempSetpoint6 : REAL;
tempSetpoint7 : REAL;
tempSetpoint8 : REAL;
tempSetpoint9 : REAL;
tempSetpoint10 : REAL;
tempSetpoint11 : REAL;
tempSetpoint12 : REAL;

timeSetpoint1 : REAL;
timeSetpoint2 : REAL;
timeSetpoint3 : REAL;
timeSetpoint4 : REAL;
timeSetpoint5 : REAL;
timeSetpoint6 : REAL;
timeSetpoint7 : REAL;
timeSetpoint8 : REAL;
timeSetpoint9 : REAL;
timeSetpoint10 : REAL;
timeSetpoint11 : REAL;
timeSetpoint12 : REAL;

END_VAR

VAR_OUTPUT
Ust : REAL; // Уставка температуры для ПИД (в градусах)
done : BOOL; // Сигнал завершения всех этапов
currentStage : UDINT; // Текущий этап (цикл)
END_VAR

VAR
stage : UDINT := 1; // Текущий этап (начинается с 1)
targetTemp : REAL := 0; // Целевая температура для текущего этапа
targetTime : REAL := 0; // Время для достижения целевой температуры
stageStartTime : REAL := 0; // Время начала текущего этапа
heatingTimeElapsed : REAL := 0; // Прошедшее время на текущем этапе
tempRate : REAL := 0; // Скорость изменения температуры на этапе
stageTimeReached : BOOL := FALSE; // Флаг, что время этапа закончилось
END_VAR

// Основная логика
IF start THEN
// Определение текущих целей на основе этапа
CASE stage OF
1:
targetTemp := tempSetpoint1;
targetTime := timeSetpoint1;
2:
targetTemp := tempSetpoint2;
targetTime := timeSetpoint2;
3:
targetTemp := tempSetpoint3;
targetTime := timeSetpoint3;
4:
targetTemp := tempSetpoint4;
targetTime := timeSetpoint4;
5:
targetTemp := tempSetpoint5;
targetTime := timeSetpoint5;
6:
targetTemp := tempSetpoint6;
targetTime := timeSetpoint6;
7:
targetTemp := tempSetpoint7;
targetTime := timeSetpoint7;
8:
targetTemp := tempSetpoint8;
targetTime := timeSetpoint8;
9:
targetTemp := tempSetpoint9;
targetTime := timeSetpoint9;
10:
targetTemp := tempSetpoint10;
targetTime := timeSetpoint10;
11:
targetTemp := tempSetpoint11;
targetTime := timeSetpoint11;
12:
targetTemp := tempSetpoint12;
targetTime := timeSetpoint12;
ELSE
done := TRUE; // Завершение, если этап больше 12
stage := 12; // Установка текущего этапа на последний
END_CASE;

// Обновление текущего этапа на выход
currentStage := stage;

// Вычисление времени, прошедшего с начала текущего этапа
heatingTimeElapsed := elapsedTime - stageStartTime;

// Расчет скорости изменения температуры (градусы в секунду)
IF targetTime > 0 THEN
tempRate := (targetTemp - currentTemp) / targetTime;
ELSE
tempRate := 0;
END_IF

// Обновление уставки на основании прошедшего времени
IF heatingTimeElapsed < targetTime THEN
// Постепенное увеличение уставки температуры для PID
Ust := currentTemp + tempRate * heatingTimeElapsed;
ELSE
// Если этап завершён, уставка равна целевой температуре
Ust := targetTemp;
stageTimeReached := TRUE; // Отметка, что время этапа завершено
END_IF

// Переход к следующему этапу только если температура достигла целевой
IF stageTimeReached AND (currentTemp >= targetTemp) THEN
stage := stage + 1; // Переход на следующий этап
stageStartTime := elapsedTime; // Обновление времени начала этапа
stageTimeReached := FALSE; // Сброс флага времени этапа
END_IF

// Если этап больше 12, завершение
IF stage > 12 THEN
done := TRUE;
ELSE
done := FALSE;
END_IF

ELSE
// Сброс параметров при отсутствии сигнала старта
Ust := 0;
stage := 1;
currentStage := stage; // Сброс текущего этапа
stageStartTime := elapsedTime;
heatingTimeElapsed := 0;
done := FALSE;
END_IF
END_FUNCTION_BLOCK