PDA

Просмотр полной версии : Неккоректная работа ПИД регулятора в ПЛК 150



RZH
06.01.2016, 11:28
Добрый день! Вопрос разработчикам ПЛК ОВЕН 150. Недавно написал программу на языке ST. И в программе были включены блоки управления PID. Но регулировка PID в программе не регулируется. Коэффициенты PID выставлены. Регулировка производится при помощи унифицированными сигналами. Есть ли какие то документации для настройки PID. Что означают которые указаны красными на рисунке? Где можно найти их обозначании.

capzap
06.01.2016, 11:40
А Вы считаете, что ошибки в готовом блоке? Вам для начала надо избавиться от использования команд АТ в ПОУ, использовать в программе программу без какой то крайне важной необходимости. Ну и выложить весь код, на скрине не видно как именно и с какой периодичностью запускается регулятор

RZH
06.01.2016, 15:03
ДА! Я ГДЕ ТО В ФОРУМЕ ЧИТАЛ, что стандартный блок pid регулятор в библиотеке util.lib не регулируется в аналоговом сигнале.чтобы было понятно суть алгоритма таково:Регулятор принимает сигнал от раcходемера в диапазоне 4-20мА. Дальше обработанный сигнал в регуляторе передаться к частотнику через аналог сигнал 0-10В (Этот диапазон сигнала указана в регуляторе). Когда задаешь задание чтобы регулятор удерживал заданную значению, регулятор выдает к ПЧ максимальную напряжению 10В(50Гц). когда достигается до заданного значения показания герца на ПЧ резко снижается. И каждый раз насос герца прыгает. Что посоветуете.
21649

RZH
06.01.2016, 19:01
У меня выглядит так
21654

Валенок
06.01.2016, 19:10
.....................

RZH
06.01.2016, 21:20
код программы



PROGRAM PLC_PRG
VAR
(*configuration panel*)
set_point_from_panel_1 AT %QD9.6.0 : REAL;
set_point_from_panel_2 AT %QD9.7.0 : REAL;
FIT_VR_value_1 AT %QD9.19.0:REAL;
FIT_VR_value_2 AT %QD9.20.0:REAL; (*ðåàëüíîå çíà÷åíèå ðàñõîäà*)
button_for_sp AT %QX9.1.0.6: BOOL;
hi_limit_error AT %QX9.2.0.4: BOOL;
PID_manual AT %QX9.3.0.0: BOOL; (*ðó÷íîé ðåæèì ðåãóëÿòîðà*)
alarm AT %QX9.3.0.1: BOOL;
status_system AT %QX9.3.0.2: BOOL;
simulation AT %QX9.3.0.3: BOOL;
level_lall AT %QX9.3.0.4: BOOL;
level_lal AT %QX9.3.0.5: BOOL;
level_lah AT %QX9.3.0.6: BOOL;
level_lahh AT %QX9.3.0.7: BOOL;
battery_low AT %QX9.4.0.2: BOOL;
emergency_system AT %QX9.4.0.3: BOOL;
temp_plc150_owen AT %QD9.23.0 : REAL;
time_accum AT %QW9.24.0: WORD;
(*configuration panel*)



P1_PID:PID;
P2_PID:PID;
kP : REAL;
kI : REAL;
kD : REAL;

(* AT %QX9.17.0.7: BOOL; (*ðó÷íîé ðåæèì ðåãóëÿòîðà*)*)
sp_flow1_for_PID: REAL; (*óñòàâêà íà ã/ë*)
sp_flow2_for_PID: REAL; (*óñòàâêà íà ã/ë*)
unit_1: REAL;
unit_2: REAL;
block_system: BOOL;

regulation: BOOL;


END_VAR

VAR_INPUT

P1_Flow_SP:REAL;
P2_Flow_SP:REAL;
(*configuration panel*)
k_P AT %QD9.12.0:REAL;
k_I AT %QD9.13.0:REAL;
k_D AT %QD9.14.0:REAL;
KH2SO4 AT %QD9.15.0:REAL; (*êîýôôèöåíò ïëîòíîñòè êèñëîòû*)
FIT_acida_PID AT %QD9.17.0:REAL;
FIT_acidb_PID AT %QD9.18.0:REAL;
(*configuration panel*)

(*discret input PLC*)
start_system AT %IX0.0: BOOL;
stop_system AT %IX0.1: BOOL;
manual_system AT %IX0.2: BOOL;
auto_system AT %IX0.3: BOOL;
emergency_stop AT %IX0.4: BOOL;
(*discret input PLC*)
FIT_1 AT %ID10.2.0.0: REAL;
FIT_2 AT %ID10.2.1.0: REAL;
timer_turn: BOOL;
PV_FI_1_panel: REAL; (*çíà÷åíèå òåêóùåãî ðàñõîäà êèñëîòû*)
PV_FI_2_panel: REAL; (*çíà÷åíèå òåêóùåãî ðàñõîäà êèñëîòû*)
FIT_VR_1 AT %ID10.2.2.0:REAL; (*ðàñõîä ÂÐ*)
FIT_VR_2 AT %ID10.2.3.0:REAL; (*ðàñõîä ÂÐ*)
END_VAR

VAR_OUTPUT
(*configuration panel*)
fithics_vallue_Hz_1 AT %QD9.8.0:REAL;
fithics_vallue_Hz_2 AT %QD9.9.0:REAL;
(*configuration panel*)
(*discret output PLC*)

status_system_start_stop AT %QX1.1: BOOL;
alarm_system AT %QX1.2: BOOL;



(*discret output PLC*)

P_01 AT %QD7.0: REAL;
P_02 AT %QD8.0: REAL;
statistic_power AT %IW11.1: WORD;
Temp_inside_PLC AT %ID11.2: REAL;
END_VAR

VAR_INPUT RETAIN
(*configuration panel*)
HI_LIM AT %QD9.16.0: REAL; (*âåðõíèé ïðèäåë øêàëû äëÿ ðàñõîäåìåðà êèñëîòû*)
HI_LIM_VR AT %QD9.21.0:REAL;(*LO_LIM AT %QD9.10.0: REAL;*) (*íèæíèé ïðèäåë øêàëû ðàñõîäåìåðà*)
(*configuration panel*)
END_VAR



(*ìàñøòàáèðîâàíèå àíàëîãîâûõ ñèãíàëîâ m3/h*)

scale_1(
IN:=FIT_1 , (*ðàñõîä êèñëîòû*)
IN_MIN:= 0.0,
IN_MAX:= 100,
OUT_MIN:= 0,
OUT_MAX:= HI_LIM, (*HI_LIM*)
OUT=>FIT_acida_PID ,
ERROR=>error_fit1 );(**)
IF error_fit1 THEN(*îáíóëåíèå ñèãíàëà ïðè àâòî ðåæèìå. Åñëè îòñóòñòâóåò ñèãíàë ðàñõîäà êèñëîòû, òî íàñîñû íå áóäåò ðàáîòàòü*)
FIT_acida_PID:=0.0;
END_IF;

scale_3(
IN:= FIT_VR_1, (*ðàñõîä ÂÐ*)
IN_MIN:= 0.0,
IN_MAX:= 100.1,
OUT_MIN:= 0,
OUT_MAX:= HI_LIM_VR, (*HI_LIM_VR*)
OUT=> FIT_VR_value_1,
ERROR=> error_fi_vr1);(**)
IF error_fi_vr1 THEN
FIT_VR_value_1:=0.0;
END_IF;

IF HI_LIM=0.0 OR HI_LIM_VR=0.0(*ïàðàìåòðèðîâàíèå â ïàíåëè ìàêñ. çíà÷åíèå ðàñõîäîâ*)
THEN
hi_limit_error:=TRUE;
ELSE
hi_limit_error:=FALSE;
END_IF;

IF button_for_sp THEN (*ïåðåêëþ÷åíèå ïî ðåæèìàì ðåãóëèðîâàíèÿ*)
P1_Flow_SP:=sp_flow1_for_PID;
P2_Flow_SP:=sp_flow2_for_PID;
ELSE
(*óñòàâêà äëÿ ðåãóëèðîâàíèå*)
P1_Flow_SP:= FIT_VR_value_1*sp_flow1_for_PID/(0.925*koef); (*ôîðìóëà äëÿ âû÷åñëåíèÿ ðàñõîäà êèñëîòû ë/÷*)
P2_Flow_SP:= FIT_VR_value_2*sp_flow2_for_PID/(0.925*koef); (*óñòàâêà äëÿ ðåãóëèðîâàíèå*)
END_IF;

(*ïåðåìåííûå äëÿ íàñîñîâ+ðåãó*)
P1_01:=P_01;
P2_02:=P_02;
(*ÏÈÄ-ðåãóëèðîâàíèÿ äëÿ íàñîñà P1*)
P1_PID(
ACTUAL:= FIT_acida_PID, (*__FIT_acida_PID,--->íàäî çàìåíèòü ïîñëå ñèìóëÿöèè*)
SET_POINT:= P1_Flow_SP,
KP:= P1_P_SP,
TN:= P1_I_SP,
TV:= P1_D_SP,
Y_MANUAL:=P1_Man_Spd_SP,
Y_OFFSET:= 0.0,
Y_MIN:=0.0,
Y_MAX:= 10.0,
MANUAL:=PID_manual,
RESET:= ,
Y=> P_01,
LIMITS_ACTIVE=> ,
OVERFLOW=> );

(*ÏÈÄ-ðåãóëèðîâàíèÿ äëÿ íàñîñà P2*)
P2_PID(
ACTUAL:= FIT_acidb_PID,
SET_POINT:= P2_Flow_SP,
KP:= P1_P_SP,
TN:= P1_I_SP,
TV:= P1_D_SP,
Y_MANUAL:=P2_Man_Spd_SP,
Y_OFFSET:=0.0 ,
Y_MIN:=0.0,
Y_MAX:= 10.0,
MANUAL:=PID_manual,
RESET:= ,
Y=> P_02,
LIMITS_ACTIVE=> ,
OVERFLOW=> );


21658
21659

RZH
06.01.2016, 21:31
Вызов всех ПИД регуляторов советую вынести в отдельную программу.
Тайминг поставьте 100мс, приоритет меньший, чем у остальной программы
Ну и конечно график не ленитесь, сделайте. Чтоб была PV, SP, OUT

я вас понял. чтобы сделать график надо по месту пойти и получить график. Как получится отправлю. Я сейчас далеко от этого ШУ. Спасибо за совет! Необходимо изменить прогу.

RZH
10.01.2016, 11:51
Добрый день!
Кто знает, как можно произвести ПИ регулирование с дозирующими насосами?

RZH
10.01.2016, 13:35
21687
В большинстве процессов d дифференциальная составляющая и не нужна.
Она нужна тогда, когда при воздействии на контур возникают "мелкие волны",
и в любом случае настраивается в последнюю очередь.

У меня в проге d дифференциальная составляющая равно нулю. Просто поставил переменную для того чтобы если вдруг понадобится.
Я вот никак не могу понять термина "мертвая зона". Для чего это? Можете простыми словами описывать.