Страница 2 из 8 ПерваяПервая 1234 ... ПоследняяПоследняя
Показано с 11 по 20 из 79

Тема: Пид регулятор Codesys

  1. #11

    По умолчанию

    Цитата Сообщение от Мурат Ахриев Посмотреть сообщение
    Библиотека Util распространяется компанией 3S в компилированном виде, соответственно внутренняя структура функциональных блоков скрыта.
    А почему у меня - в открытом?
    Код:
    (* PD controller *)
    FUNCTION_BLOCK PID
    VAR_INPUT
    	ACTUAL :REAL;		(* actual value, process variable *)
    	SET_POINT:REAL;	(* desired value, set point *)
    	KP:REAL;				(* proportionality const. (P)*)
    	TN:REAL;				(* reset time (I) in sec *)
    	TV:REAL;				(* rate time, derivative time (D) in sec*)
    	Y_MANUAL:REAL;		(* Y is set to this value as long as MANUAL=TRUE *)
    	Y_OFFSET:REAL;		(* offset for manipulated variable *)
    	Y_MIN:REAL;			(* minimum value for manipulated variable *)
    	Y_MAX:REAL;			(* maximum value for manipulated variable *)
    	MANUAL:BOOL;		(* 	TRUE: manual: Y is not influenced by controller,
    								FALSE: controller determines Y *)
    	RESET:BOOL;			(* reset: set Y output to Y_OFFSET and reset integral part *)
    END_VAR
    VAR_OUTPUT
    	Y:REAL;				(* manipulated variable, set value*)
    	LIMITS_ACTIVE:BOOL:=FALSE;	(* true set value would exceed limits Y_MIN, Y_MAX *)
    	OVERFLOW:BOOL:=FALSE;		(* overflow in integral part *)
    END_VAR
    VAR
    	CLOCK:TON;
    	I: INTEGRAL;
    	D: DERIVATIVE;
    	TMDIFF: DWORD;
    	ERROR: REAL;
    	INIT: BOOL:=TRUE;
    	Y_ADDOFFSET: REAL;
    	KPcopy:REAL;
    	TNcopy:REAL;
    	TVcopy:REAL;
    END_VAR
    
    IF TN>0 AND KP<> 0 AND (NOT OVERFLOW OR RESET OR MANUAL) THEN
    	ERROR := SET_POINT-ACTUAL;								(* Regeldifferenz *)
    
    	IF RESET OR MANUAL OR INIT OR (KP<>KPcopy OR TN<>TNcopy OR TV<>TVcopy) THEN							(* Reset oder Handbetrieb *)
    		I(RESET:=TRUE);
    		D(RESET:=TRUE);
    		OVERFLOW:=FALSE;
    		LIMITS_ACTIVE:=FALSE;
    		IF RESET OR INIT THEN
    			Y := Y_OFFSET;
    			INIT:=FALSE;
    			Y_ADDOFFSET := 0;
    		ELSIF MANUAL THEN
    			Y := Y_MANUAL;
    			Y_ADDOFFSET := Y_MANUAL-(Y_OFFSET+KP*(ERROR+I.OUT/TN+D.OUT*TV));
    		ELSE
    			Y_ADDOFFSET := Y - Y_OFFSET - KP*ERROR;
    		END_IF
    		TMDIFF:=0;
    		CLOCK(IN:=FALSE);									(* Timer neu starten *)
    		CLOCK(PT:=t#1h, IN:=TRUE);
    
    		TNcopy := TN;
    		TVcopy := TV;
    		KPcopy := KP;
    	ELSE
    		CLOCK;												(* Timer abfragen *)
    		TMDIFF:=TIME_TO_DWORD(CLOCK.ET);					(* Zeitdifferenz seit letztem Aufruf *)
    	END_IF;
    
    	IF TMDIFF>0 THEN
    		CLOCK(IN:=FALSE);									(* Timer neu starten *)
    		CLOCK(PT:=t#1h, IN:=TRUE);
    
    		D(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE);				(* Differential absch&#228;tzen *)
    		I(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE);				(* Integral absch&#228;tzen *)
    
    		OVERFLOW := I.OVERFLOW;
    		IF NOT OVERFLOW THEN
    			Y:=Y_OFFSET+KP*(ERROR+I.OUT/TN+D.OUT*TV) + Y_ADDOFFSET;
    			IF Y>1E30 OR Y<-1E30 THEN						(* Overflow steht bevor, darf aber eigentlich nicht passieren *)
    				OVERFLOW:=TRUE;
    			END_IF;
    
    			LIMITS_ACTIVE:=FALSE;
    			IF Y_MAX>Y_MIN AND Y>Y_MAX  THEN				(* Stellwert-Obergrenze &#252;berschritten *)
    				LIMITS_ACTIVE:=TRUE;
    				IF KP<>0 THEN
    					I(IN:=(Y_MAX-Y)*TN/KP,TM:=1000,RESET:=FALSE);		(* Integral korrigieren *)
    				END_IF
    				Y:=Y_MAX;
    			END_IF;
    			IF Y_MAX>Y_MIN AND Y<Y_MIN THEN					(* Stellwert-Untergrenze unterschritten *)
    				LIMITS_ACTIVE:=TRUE;
    				IF KP<>0 THEN
    					I(IN:=(Y_MIN-Y)*TN/KP,TM:=1000,RESET:=FALSE);		(* Integral korrigieren *)
    				END_IF
    				Y:=Y_MIN;
    			END_IF;
    		END_IF;
    	ELSE
    		CLOCK(PT:=t#1h,IN:=TRUE);
    	END_IF;
    
    END_IF;
    Последний раз редактировалось ASo; 26.01.2014 в 14:05.

  2. #12
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    709

    По умолчанию

    АSо, а как так получилось, что код с ошибками?
    В строке
    IF Y_MAX>Y_MIN AND Y0 THEN
    Переменная Y0 не описана. И в конце END_IF лишний.

  3. #13

    По умолчанию

    Видимо, глюк движка форума.
    Сейчас попробовал скопипастить. Внутри тэгов CODE все нормально, при сохранении сообщения - вот так

    Но это не имеет большого значения. Откройте util.lib, как проект, откройте блок PID и смотрите.

  4. #14
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    709

    По умолчанию

    Да, действительно, глюк интеллектуальный, еще и AND добавил

  5. #15

    По умолчанию

    Цитата Сообщение от ASo Посмотреть сообщение
    А почему у меня - в открытом?
    Код:
    (* PD controller *)
    FUNCTION_BLOCK PID
    VAR_INPUT
    	ACTUAL :REAL;		(* actual value, process variable *)
    	SET_POINT:REAL;	(* desired value, set point *)
    	KP:REAL;				(* proportionality const. (P)*)
    	TN:REAL;				(* reset time (I) in sec *)
    	TV:REAL;				(* rate time, derivative time (D) in sec*)
    	Y_MANUAL:REAL;		(* Y is set to this value as long as MANUAL=TRUE *)
    	Y_OFFSET:REAL;		(* offset for manipulated variable *)
    	Y_MIN:REAL;			(* minimum value for manipulated variable *)
    	Y_MAX:REAL;			(* maximum value for manipulated variable *)
    	MANUAL:BOOL;		(* 	TRUE: manual: Y is not influenced by controller,
    								FALSE: controller determines Y *)
    	RESET:BOOL;			(* reset: set Y output to Y_OFFSET and reset integral part *)
    END_VAR
    VAR_OUTPUT
    	Y:REAL;				(* manipulated variable, set value*)
    	LIMITS_ACTIVE:BOOL:=FALSE;	(* true set value would exceed limits Y_MIN, Y_MAX *)
    	OVERFLOW:BOOL:=FALSE;		(* overflow in integral part *)
    END_VAR
    VAR
    	CLOCK:TON;
    	I: INTEGRAL;
    	D: DERIVATIVE;
    	TMDIFF: DWORD;
    	ERROR: REAL;
    	INIT: BOOL:=TRUE;
    	Y_ADDOFFSET: REAL;
    	KPcopy:REAL;
    	TNcopy:REAL;
    	TVcopy:REAL;
    END_VAR
    
    IF TN>0 AND KP<> 0 AND (NOT OVERFLOW OR RESET OR MANUAL) THEN
    	ERROR := SET_POINT-ACTUAL;								(* Regeldifferenz *)
    
    	IF RESET OR MANUAL OR INIT OR (KP<>KPcopy OR TN<>TNcopy OR TV<>TVcopy) THEN							(* Reset oder Handbetrieb *)
    		I(RESET:=TRUE);
    		D(RESET:=TRUE);
    		OVERFLOW:=FALSE;
    		LIMITS_ACTIVE:=FALSE;
    		IF RESET OR INIT THEN
    			Y := Y_OFFSET;
    			INIT:=FALSE;
    			Y_ADDOFFSET := 0;
    		ELSIF MANUAL THEN
    			Y := Y_MANUAL;
    			Y_ADDOFFSET := Y_MANUAL-(Y_OFFSET+KP*(ERROR+I.OUT/TN+D.OUT*TV));
    		ELSE
    			Y_ADDOFFSET := Y - Y_OFFSET - KP*ERROR;
    		END_IF
    		TMDIFF:=0;
    		CLOCK(IN:=FALSE);									(* Timer neu starten *)
    		CLOCK(PT:=t#1h, IN:=TRUE);
    
    		TNcopy := TN;
    		TVcopy := TV;
    		KPcopy := KP;
    	ELSE
    		CLOCK;												(* Timer abfragen *)
    		TMDIFF:=TIME_TO_DWORD(CLOCK.ET);					(* Zeitdifferenz seit letztem Aufruf *)
    	END_IF;
    
    	IF TMDIFF>0 THEN
    		CLOCK(IN:=FALSE);									(* Timer neu starten *)
    		CLOCK(PT:=t#1h, IN:=TRUE);
    
    		D(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE);				(* Differential absch&#228;tzen *)
    		I(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE);				(* Integral absch&#228;tzen *)
    
    		OVERFLOW := I.OVERFLOW;
    		IF NOT OVERFLOW THEN
    			Y:=Y_OFFSET+KP*(ERROR+I.OUT/TN+D.OUT*TV) + Y_ADDOFFSET;
    			IF Y>1E30 OR Y<-1E30 THEN						(* Overflow steht bevor, darf aber eigentlich nicht passieren *)
    				OVERFLOW:=TRUE;
    			END_IF;
    
    			LIMITS_ACTIVE:=FALSE;
    			IF Y_MAX>Y_MIN AND Y>Y_MAX  THEN				(* Stellwert-Obergrenze &#252;berschritten *)
    				LIMITS_ACTIVE:=TRUE;
    				IF KP<>0 THEN
    					I(IN:=(Y_MAX-Y)*TN/KP,TM:=1000,RESET:=FALSE);		(* Integral korrigieren *)
    				END_IF
    				Y:=Y_MAX;
    			END_IF;
    			IF Y_MAX>Y_MIN AND Y<Y_MIN THEN					(* Stellwert-Untergrenze unterschritten *)
    				LIMITS_ACTIVE:=TRUE;
    				IF KP<>0 THEN
    					I(IN:=(Y_MIN-Y)*TN/KP,TM:=1000,RESET:=FALSE);		(* Integral korrigieren *)
    				END_IF
    				Y:=Y_MIN;
    			END_IF;
    		END_IF;
    	ELSE
    		CLOCK(PT:=t#1h,IN:=TRUE);
    	END_IF;
    
    END_IF;

    Спасибо за информацию, оказывается для Codesys 2 библиотеки поставляются с исходными кодами, в Codesys 3 уже компилированные поставляются.

  6. #16

    По умолчанию

    кто нибудь подскажет, Пид регулятор работает или нет.

  7. #17
    Пользователь Аватар для Василий Кашуба
    Регистрация
    20.11.2011
    Адрес
    Ставрополь
    Сообщений
    2,558

    По умолчанию

    Цитата Сообщение от kaxriman Посмотреть сообщение
    кто нибудь подскажет, Пид регулятор работает или нет.
    Работает, работает.

  8. #18

    По умолчанию

    Цитата Сообщение от Василий Кашуба Посмотреть сообщение
    Работает, работает.
    Не могли бы выложит на форум небольшой пример для проверки.
    А то я хочу приобрести СПК 107, но не зная справится ПЛК с нашей
    задачей не могу этого сделать.
    Для примера сделайте терморегулятор на 4 зоны с програмным задатчиком
    и контролем разности температур между зонами .
    Буду очень благодарен.

  9. #19
    Пользователь Аватар для smk1635
    Регистрация
    06.09.2010
    Адрес
    Брянск
    Сообщений
    1,306

    По умолчанию

    Цитата Сообщение от kaxriman Посмотреть сообщение
    Не могли бы выложит на форум небольшой пример для проверки.
    А то я хочу приобрести СПК 107, но не зная справится ПЛК с нашей
    задачей не могу этого сделать.
    Для примера сделайте терморегулятор на 4 зоны с програмным задатчиком
    и контролем разности температур между зонами .
    Буду очень благодарен.
    Оплата наличными или по безналу ?
    Впрочем приобрести СПК 107 и самому попробовать дешевле выдет.
    Теория и практика иногда сталкиваются. Когда это случается, теория проигрывает. Всегда. (Закон Линуса)

  10. #20

    По умолчанию

    Цитата Сообщение от smk1635 Посмотреть сообщение
    Оплата наличными или по безналу ?
    Впрочем приобрести СПК 107 и самому попробовать дешевле выдет.
    платить будем как вы хотите .
    Попробовать как говорится всегда успеем, хочется выбрать правильное направление.
    Выше писали что Пид регулятор в библиотеке с ошибками. Кажется этот проект еще
    сырой . Сомненья, сомненья.

Страница 2 из 8 ПерваяПервая 1234 ... ПоследняяПоследняя

Похожие темы

  1. ПИД регулятор
    от Николаев Андрей в разделе ПЛК (среда программирования CoDeSys V2.3)
    Ответов: 445
    Последнее сообщение: 08.11.2019, 08:42
  2. ПИД регулятор
    от Александр М в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 22.10.2007, 08:47

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •