PDA

Просмотр полной версии : Несколько ПИД регуляторов.



Эдуард
05.11.2008, 11:29
Здравствуйте. Помогите пожалуйста советом. Как мне запустить несколько ПИД регуляторов на одном ПЛК 150? Один регулятор работает пекрасно, стоит вставить второй регулятор как выход первого начинает влиять на выход второго.
Пример:
VAR REG_PID: PID;
END_VAR
VAR_INPUT
ACTUAL: REAL; (* фактическая переменная величины, процесса *)
SET_POINT: REAL; (* желаемая величина, уставка *)
KP: REAL; (* прямая пропорциональность const. (P) *)
TN: REAL; (* время интегрирования (I) в sec *)
TV: REAL; (* время дифференцирования (D) в sec *)
Y_MANUAL: REAL; (* выходная величина в ручном режиме если MANUAL=TRUE *)
Y_OFFSET: REAL; (* компенсация для манипулирующей переменной *)
Y_MIN: REAL; (* минимальная величина для манипулирующей переменной *)
Y_MAX: REAL; (* максимальная величина для манипулирующей переменной *)
MANUAL: BOOL; (* ИСТИНА: руководство: Y - не под влиянием диспетчера, ЛОЖ: диспетчер определяет Y *)
RESET: BOOL; (* reset: set Y output to Y_OFFSET and reset integral part *)
END_VAR
VAR_OUTPUT
Y: REAL;(* манипулирующая переменная, установившая величину *)
LIMITS_ACTIVE: BOOL := FALSE; (* true set value would exceed limits Y_MIN, Y_MAX *)
OVERFLOW: BOOL := FALSE; (* overflow in integral part *)
END_VAR
-------------------------------------------------------------------------
CAL REG_PID(ACTUAL :=UROV1 , SET_POINT :=UST1 , KP := PROP1, TN := INTEG1, TV := 0, Y_MANUAL :=VIXOD1 , Y_OFFSET := 0, Y_MIN :=MIN1 , Y_MAX :=MAX1 , MANUAL :=AVTRUCH1 , RESET := FALSE)
LD REG_PID.Y
ST VIXOD1
LD REG_PID.Y
MUL 10
REAL_TO_WORD
ST KL1
CAL REG_PID(ACTUAL :=UROV2 , SET_POINT :=UST2 , KP := PROP2, TN := INTEG2, TV := 0, Y_MANUAL :=VIXOD2 , Y_OFFSET := 0, Y_MIN :=MIN2 , Y_MAX :=MAX2 , MANUAL :=AVTRUCH2 , RESET := FALSE)
LD REG_PID.Y
ST VIXOD2
LD REG_PID.Y
MUL 10
REAL_TO_WORD
ST KL2
CAL REG_PID(ACTUAL :=UROV3 , SET_POINT :=UST3 , KP := PROP3, TN := INTEG3, TV := 0, Y_MANUAL :=VIXOD3 , Y_OFFSET := 0, Y_MIN :=MIN3 , Y_MAX :=MAX3 , MANUAL :=AVTRUCH3 , RESET := FALSE)
LD REG_PID.Y
ST VIXOD3
LD REG_PID.Y
MUL 10
REAL_TO_WORD
ST KL3
Заранее благодарен!

Малышев Олег
05.11.2008, 12:27
Создайте несколько экземпляров ПИД - например REG_PID: array [1..3] of PID; работайте с нужным экземпляром. PID - это не функция, а Функциональный Блок (ФБ), который хранит в себе данные между вызовами.