Страница 45 из 53 ПерваяПервая ... 354344454647 ... ПоследняяПоследняя
Показано с 441 по 450 из 529

Тема: Функциональные блоки на языке ST

  1. #441

    По умолчанию

    Цитата Сообщение от Urfin_Dzhyus Посмотреть сообщение
    Вот, чего я добивался, выкладываю. На вход Enable установил RS, пририсовал независимые входы Val1-4 для независимой установки времени шагов и паузы между ними, выкинул фнкцию funMul, а необходимое значение шагов записал на прямую.
    Это всё хорошо, только зачем было разбираться с Т триггером и в итоге поставить RS триггер? И главное он даже не отключает блок на 9 шаге)))

    Пример из Oscat, можно перерисовать прямо со скрина, это тоже Т триггер, только без использования R-триггера, если это интересно)
    А вообще любую открытую биб-ку ( и Oscat), можно открыть как проект и скопировать код.
    Только не всегда всё просто, этот пример в Лоджике будет с ошибкой, хоть и не сложной.

    А разложение Маски на биты, на ST ещё проще b0:=Mask.0; b1:=Mask.1; b2:=Mask.2; b3:=Mask.3; ....... b7:=Mask.7;
    Последний раз редактировалось kondor3000; 26.02.2024 в 15:47.

  2. #442

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Это всё хорошо, только зачем было разбираться с Т триггером и в итоге поставить RS триггер?
    На работе RS встал сразу и полностью меня удавлетварил, даже более чем, а ТТ для интереса и как вариант исполнения и задницеподгорания). У меня реально дома проблема с лоджиком, а если бы я тупил, я бы сам об этом сказал не стесьняясь, ведь то количество выкуренного и выпитого позволяет к таким вещам относится философически)))
    ЗЫ: Разобрался с лоджиком, оказывается я подключал тестируемые триггеры к глючному блоку с форума)))
    Последний раз редактировалось Urfin_Dzhyus; 26.02.2024 в 22:02.

  3. #443

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Это всё хорошо, только зачем было разбираться с Т триггером и в итоге поставить RS триггер? И главное он даже не отключает блок на 9 шаге)))

    Пример из Oscat, можно перерисовать прямо со скрина, это тоже Т триггер, только без использования R-триггера, если это интересно)
    А вообще любую открытую биб-ку ( и Oscat), можно открыть как проект и скопировать код.
    Только не всегда всё просто, этот пример в Лоджике будет с ошибкой, хоть и не сложной.

    А разложение Маски на биты, на ST ещё проще b0:=Mask.0; b1:=Mask.1; b2:=Mask.2; b3:=Mask.3; ....... b7:=Mask.7;
    Гляжу вы также как и я по полдня ответы пишете и по нескольку раз редактируете.

    Пример из Oscat, можно перерисовать прямо со скрина, это тоже Т триггер, только без использования R-триггера, если это интересно)
    Перевёл, он что и должен постоянно генерить при единице на клике?

    А разложение Маски на биты, на ST ещё проще b0:=Mask.0; b1:=Mask.1; b2:=Mask.2; b3:=Mask.3; ....... b7:=Mask.7;
    Я думал над блоком GetMasc, но не вижу особого смысла менять один кусок кода на другой. В этом плане я полный оппортунист, мне что кубики, что крякозябры, всё это просто код облечённый в разные обёртки.

  4. #444

    По умолчанию

    Цитата Сообщение от Urfin_Dzhyus Посмотреть сообщение
    Перевёл, он что и должен постоянно генерить при единице на клике?
    Генерить он не должен.
    Это точно такой же Т- триггер, как ранее обсуждали и работать должен так же, если у вас не так, значит не правильно перевели.
    Даже по коду видно, что если нет сброса, есть сигнал на входе и нет в промежуточной переменной, то инвертировать выход Q:= not Q;
    Последний раз редактировалось kondor3000; 27.02.2024 в 08:10.

  5. #445

    По умолчанию

    Здравствуйте .Обращаюсь к представителю Овен.Есть ли возможность посмотреть код st функционального блока PID регулятора ?Или посмотрите этот код Снимок экрана (6).png.

  6. #446

    По умолчанию

    БАЙТ, я не представитель Овен.

    В CoDeSys библиотека Util позволяет ознакомиться с PID регулятором на ST
    PID из Util:
    Код:
    (* 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;


    Ещё открыт исходник ПИД регулятора из компонентов OwenLogic, хоть и на FBD.

  7. #447

    По умолчанию

    За код спасибо!А тот код не мой, нейросеть пример привела.

  8. #448
    Пользователь
    Регистрация
    01.11.2022
    Адрес
    <7924127@mail.ru> Минск
    Сообщений
    489

    По умолчанию

    Цитата Сообщение от БАЙТ Посмотреть сообщение
    За код спасибо!А тот код не мой, нейросеть пример привела.
    Похоже что скоро ИИ нам сможет толковые советы давать.

    Вот, обещались.

  9. #449

    По умолчанию

    Народ, а как макрос SelChgF в виде FB на ST написать?
    Может, кто поделится мыслями, а то что-то самому не представить...

  10. #450

    По умолчанию

    Код:
    function_block SelChgF //имя функционального блока.
    
        var_input //объявление входных переменных
           var1_F : real;
           var2_F : real;
        end_var
    
        var_output 
           out : real; 
        end_var
    
        var 
           var1_F_mem : real;
           var2_F_mem : real;
        end_var
    
        if var1_F_mem <> var1_F then
            out := var1_F;
        elsif var2_F_mem <> var2_F then
            out := var2_F;
        end_if
        
        var1_F_mem := var1_F;
        var2_F_mem := var2_F; 
    
    end_function_block

Страница 45 из 53 ПерваяПервая ... 354344454647 ... ПоследняяПоследняя

Похожие темы

  1. ПЛК73 (Функциональные кнопки)
    от necro в разделе ПЛК63/73
    Ответов: 8
    Последнее сообщение: 18.05.2022, 10:03
  2. Функциональные блоки
    от ribamuka в разделе СПК2xx (архив)
    Ответов: 4
    Последнее сообщение: 08.04.2018, 15:01
  3. Функциональные блоки насосов в CoDeSys
    от Алексей Ермолаев в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 28.03.2017, 13:50
  4. Функциональные блоки- где искать?
    от Xops в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 01.03.2016, 11:07
  5. СПК функциональные клавиши
    от Lyohin в разделе Трёп (Курилка)
    Ответов: 0
    Последнее сообщение: 30.03.2015, 15:10

Ваши права

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