<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to STEP PID</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/</id><updated>2020-05-11T08:06:56.196000Z</updated><subtitle>Recent posts to STEP PID</subtitle><entry><title>STEP PID</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/?limit=25#b10a" rel="alternate"/><published>2020-05-11T08:06:56.196000Z</published><updated>2020-05-11T08:06:56.196000Z</updated><author><name>smarmiroli</name><uri>https://forge.codesys.com/u/smarmiroli/</uri></author><id>https://forge.codesys.combaf11d98803a57f4435d7b28a1e754d1ccc34746</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;This is my personal solution.. it works!!:&lt;br/&gt;
FUNCTION_BLOCK fb_ctrl_step&lt;br/&gt;
VAR_INPUT&lt;br/&gt;
// parametri PID&lt;br/&gt;
    actualValue : REAL; &lt;br/&gt;
    setPoint : REAL;&lt;br/&gt;
    kP : REAL;&lt;br/&gt;
    kI : REAL;&lt;br/&gt;
// gestione uscite UP DOWN&lt;br/&gt;
    limitSwitchUp : BOOL;&lt;br/&gt;
    limitSwitchDn : BOOL;     &lt;br/&gt;
    minPulseUpDuration : TIME;// durata minima dell'impulso di salita&lt;br/&gt;
    maxPulseUpDuration : TIME;// durata massima dell'impulso di salita&lt;br/&gt;
    minPulseDnDuration : TIME;// durata minima dell'impulso di discesa&lt;br/&gt;
    maxPulseDnDuration : TIME;// durata massima dell'impulso di discesa&lt;br/&gt;
    pausePulseUpDuration : TIME;// duarata pausa impulso di salita&lt;br/&gt;
    pausePulseDnDuration : TIME;// durata pausa impulso di discesa&lt;br/&gt;
// gestione manuali&lt;br/&gt;
    manualMode : BOOL;&lt;br/&gt;
    manualUp: BOOL;&lt;br/&gt;
    manualDn:BOOL;&lt;br/&gt;
END_VAR&lt;/p&gt;
&lt;p&gt;VAR_OUTPUT&lt;br/&gt;
    qUp:BOOL; // uscita per aumentare&lt;br/&gt;
    qDn :BOOL; // uscita per diminuire&lt;br/&gt;
END_VAR&lt;br/&gt;
VAR&lt;br/&gt;
    oscatPI: OSCAT_BASIC.CTRL_PI;&lt;br/&gt;
    oscatHyst3: OSCAT_BASIC.HYST_3;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;upCommandRising&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;R_TRIG&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;dnCommandRising&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;R_TRIG&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;oscatGenPulseUp&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;OSCAT_BASIC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GEN_PULSE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;oscatGenPulseDn&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;OSCAT_BASIC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GEN_PULSE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;END_VAR&lt;br/&gt;
 oscatPI(&lt;br/&gt;
    ACT:= actualValue,// valore di processo &lt;br/&gt;
    SET:= setPoint, // setpoint&lt;br/&gt;
    SUP:= 0 , // soppressione (0)&lt;br/&gt;
    OFS:= 0, // offset da sommare (0)&lt;br/&gt;
    M_I:= 0, // output se in manuale&lt;br/&gt;
    MAN:= manualMode, // manuale&lt;br/&gt;
    RST:= manualMode, // reset - il pid si resetta in manuale&lt;br/&gt;
    KP:= kP, // costante proporzionale&lt;br/&gt;
    KI:= kI, // costante integrale&lt;br/&gt;
    LL:= -1*TIME_TO_REAL(maxPulseDnDuration), // limite inferiore è la durata massima dell'impulso di salita&lt;br/&gt;
    LH:= TIME_TO_REAL(maxPulseUpDuration), // è la durata massima dell'impulso di discesa&lt;br/&gt;
    //Y=&amp;gt;y ,// uscita del filtro&lt;br/&gt;
);  &lt;/p&gt;
&lt;p&gt;oscatHyst3(&lt;br/&gt;
    in:= oscatPi.Y,&lt;br/&gt;
    hyst:=0.1 , &lt;br/&gt;
    val1:=  -1* TIME_TO_REAL(minPulseDnDuration) , &lt;br/&gt;
    val2:= TIME_TO_REAL(minPulseUpDuration) , &lt;br/&gt;
    //Q1=&amp;gt; comando di discesa , &lt;br/&gt;
    //Q2=&amp;gt; comando di salita &lt;br/&gt;
    );&lt;/p&gt;
&lt;p&gt;// discesa&lt;br/&gt;
    oscatGenPulseDn.ENQ S= oscatHyst3.Q1 AND NOT oscatGenPulseUp.ENQ ;&lt;br/&gt;
    oscatGenPulseDn.ENQ R= NOT oscatHyst3.Q1 AND oscatGenPulseDn.Q ;&lt;br/&gt;
    oscatGenPulseDn( PTH:= REAL_TO_TIME (-oscatPI.y) , &lt;br/&gt;
        PTL := pausePulseDnDuration , &lt;br/&gt;
        //Q=&amp;gt; &lt;br/&gt;
    );&lt;/p&gt;
&lt;p&gt;// salita&lt;br/&gt;
    oscatGenPulseUp.ENQ S= oscatHyst3.Q2 AND NOT oscatGenPulseDn.ENQ ;&lt;br/&gt;
    oscatGenPulseUp.ENQ R= NOT oscatHyst3.Q2 AND oscatGenPulseUp.Q ;&lt;br/&gt;
    oscatGenPulseUp( PTH:= REAL_TO_TIME (oscatPI.y) , &lt;br/&gt;
        PTL := pausePulseUpDuration , &lt;br/&gt;
        //Q=&amp;gt; &lt;br/&gt;
    );&lt;/p&gt;
&lt;p&gt;qUp := ((manualMode AND manualUp) OR (NOT ManualMode AND oscatGenPulseUp.Q ))AND NOT limitSwitchUp; &lt;br/&gt;
qDn := ((manualMode AND manualDn) OR (NOT ManualMode AND oscatGenPulseDn.Q ))AND NOT limitSwitchDn; &lt;/p&gt;
&lt;p&gt;END_FUNCTION&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>STEP PID</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/?limit=25#2c01" rel="alternate"/><published>2020-05-08T09:01:22.750000Z</published><updated>2020-05-08T09:01:22.750000Z</updated><author><name>smarmiroli</name><uri>https://forge.codesys.com/u/smarmiroli/</uri></author><id>https://forge.codesys.com4d2ec26ae8fd9249d8510dd8b81cf7c11385a6a3</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;thanks, I try with the ThreePointController, although I preferred to be able to interact with a control system with PI parameters, thanks a lot anyway&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>STEP PID</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/?limit=25#6cae" rel="alternate"/><published>2020-05-08T08:56:45.151000Z</published><updated>2020-05-08T08:56:45.151000Z</updated><author><name>gatto</name><uri>https://forge.codesys.com/u/gatto/</uri></author><id>https://forge.codesys.com8b44475c962f76a7de2a82bf3c8e68679f764845</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi, for control a temperature with one output that heats and one that cools, you can use Three-point controls.&lt;br/&gt;
ThreePointController: Function block for implementing a three-point control&lt;br/&gt;
ThreePointControllerWithValueHysteresis: Function block for implementing a three-point control with&lt;br/&gt;
value-based modulation&lt;br/&gt;
(Part of Control Loop Library)&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>STEP PID</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/?limit=25#acde" rel="alternate"/><published>2020-05-07T15:05:35.756000Z</published><updated>2020-05-07T15:05:35.756000Z</updated><author><name>smarmiroli</name><uri>https://forge.codesys.com/u/smarmiroli/</uri></author><id>https://forge.codesys.com94aa3e81ac6e2c96391a66eeaa9d856a0de472f9</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;'m sorry but there is a problem with the link that i have sent&lt;/p&gt;
&lt;p&gt;the function that i have to replicate is this:&lt;/p&gt;
&lt;p&gt;FB_CTRL_STEP_PID&lt;br/&gt;
fb_ctrl_step_pid&lt;br/&gt;
The function block controls a digitally manipulated variable for integrating actuators. It is based on a standard PID controller with an additional binary output signal along with the analog output and operates without a precise position feedback signal.&lt;/p&gt;
&lt;p&gt;The position feedback signal required to calculate the controller output, is estimated with the help of the limiting values and the time required to reach those limits. The function block then creates pulses based necessary to drive the actuator such as a servo motor.&lt;/p&gt;
&lt;p&gt;the step pid are typically used to control a temperature with one output that heats and one that cools, and this is what I have to do&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>STEP PID</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/?limit=25#7182" rel="alternate"/><published>2020-05-07T11:50:02.498000Z</published><updated>2020-05-07T11:50:02.498000Z</updated><author><name>smarmiroli</name><uri>https://forge.codesys.com/u/smarmiroli/</uri></author><id>https://forge.codesys.comc636589d6e936064f3854e3b58b74ec43a9c243a</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;the pid steps are typically used to control a temperature with one output that heats and one that cools, this is what this function does  &lt;a href="https://infosys.beckhoff.com/english.php?content=../content/1033/tf4100_tc3_controller_toolbox/9007199500176779.html&amp;amp;id" rel="nofollow"&gt;https://infosys.beckhoff.com/english.php?content=../content/1033/tf4100_tc3_controller_toolbox/9007199500176779.html&amp;amp;id&lt;/a&gt; and this is what I have to do&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>STEP PID</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/?limit=25#f84d" rel="alternate"/><published>2020-05-07T11:17:14.818000Z</published><updated>2020-05-07T11:17:14.818000Z</updated><author><name>eschwellinger</name><uri>https://forge.codesys.com/u/eschwellinger/</uri></author><id>https://forge.codesys.com99f1b4bf47ca4fbc1f43cf93009bd618c2f79cf5</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello,&lt;br/&gt;
I would give this a try:&lt;br/&gt;
&lt;a href="https://store.codesys.com/control-loop-library.html?___store=default&amp;amp;___from_store=en" rel="nofollow"&gt;https://store.codesys.com/control-loop-library.html?&lt;strong&gt;&lt;em&gt;store=default&amp;amp;&lt;/em&gt;&lt;/strong&gt;from_store=en&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>STEP PID</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/53ba174e64/?limit=25#7f30" rel="alternate"/><published>2020-05-07T10:32:55.172000Z</published><updated>2020-05-07T10:32:55.172000Z</updated><author><name>smarmiroli</name><uri>https://forge.codesys.com/u/smarmiroli/</uri></author><id>https://forge.codesys.comae59192032e019bc58f35f0808dd67ee1663e02f</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello, I have to create an application that needs a block like this .. &lt;br/&gt;
&lt;a href="https://infosys.beckhoff.com/english.php?content=../content/1033/tf4100_tc3_controller_toolbox/9007199500176779.html&amp;amp;id" rel="nofollow"&gt;https://infosys.beckhoff.com/english.php?content=../content/1033/tf4100_tc3_controller_toolbox/9007199500176779.html&amp;amp;id&lt;/a&gt;&lt;br/&gt;
is there an equivalent in codesys or OSCAT libraries or do I have to build it?&lt;br/&gt;
thanks&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>