Wie kann man eine Zeitintervall in Codesys programmieren?

2009-01-20
2009-01-22
  • guynougouapi - 2009-01-20

    hallo,

    ich möcchte einen Sollwert (50) während einer Zeit (Zeitintervall) z.B von 200ms halten. Wenn die erste 200ms gelaufen sind,der alten Sollwert um 10 erhöhen um wieder innerhalb von 200ms halten, so dass am Ende, der Sollwert einen treppenverlauf hat.

    Dieser Verlauf vom Sollwert würde ich mich das auch auf dem Trace anschauen. Leider klappt die Progrmmierung dieses Verlaufs nicht. !!!!

    Wer kann mir helfen

    LG Guy

     
  • Speicherzelle - 2009-01-20

    guynougouapi hat geschrieben:
    hallo,
    ich möcchte einen Sollwert (50) während einer Zeit (Zeitintervall) z.B von 200ms halten. Wenn die erste 200ms gelaufen sind,der alten Sollwert um 10 erhöhen um wieder innerhalb von 200ms halten, so dass am Ende, der Sollwert einen treppenverlauf hat.
    Dieser Verlauf vom Sollwert würde ich mich das auch auf dem Trace anschauen. Leider klappt die Progrmmierung dieses Verlaufs nicht. !!!!
    Wer kann mir helfen
    LG Guy

    Prob mal so

    PROGRAM PLC_PRG

    VAR

    t1: TON;
    
    io: BOOL;
    
    takt: BOOL;
    
    m2: BOOL;
    
    m1: BOOL;
    
    anfangswert: INT := 50;
    
    endwert: INT;
    
    END_VAR
    
    
    
    
    
    
    
    LD      TRUE
    
    ANDN    takt
    
    ST      t1.IN
    
    CAL     t1(PT := T#200ms)
    
    
    
    LD      t1.Q
    
    ST      takt
    
    
    
    LD      takt
    
    ANDN    m2
    
    ST      m1
    
    
    
    LD      takt
    
    ST      m2
    
    
    
    LD      m1
    
    
    
    JMPCN   en_temp3
    
    
    
    LD      anfangswert
    
    ADD     10
    
    ST      anfangswert
    

    en_temp3:

    mfg

    Speicherzelle

     
  • Ralph Holz - 2009-01-20

    Geht kürzer:

    PROGRAM PLC_PRG
    VAR
    t1: TON;
    wert: INT := 50;
    END_VAR
    LDN  t1.Q
    ST t1.IN
    CAL t1(PT := T#200ms)
    ld t1.Q
    JMPCN en_temp3
    LD wert
    ADD 10
    ST wert
    en_temp3: 
    

    Gruß

    Ralph

     
  • Speicherzelle - 2009-01-20

    Ralph Holz hat geschrieben:
    Geht kürzer:

    PROGRAM PLC_PRG
    VAR
    t1: TON;
    wert: INT := 50;
    END_VAR
    LDN  t1.Q
    ST t1.IN
    CAL t1(PT := T#200ms)
    ld t1.Q
    JMPCN en_temp3
    LD wert
    ADD 10
    ST wert
    en_temp3:
    

    Gruß
    Ralph

    voll kurz

    alles geht ürgendwie kürzer oder anders nä

    MFG

    Speicherzelle

     
  • guynougouapi - 2009-01-21

    Hallo Ralp,

    es funktioniert soweit wie ich mir vorher vorgestellt habe. Aber jetzt kommt noch was dazu. Die funktion muss den Anfangswert z.B 0 während einer sehr kurze Zeit (z.B 10ms) behalten, dann wird der Anfangswert (0) z.B um 10 erhöht. Sie muss diesen neuen berechneten wert jetzt während der Zeit z.B 200ms behalten. Nach Ablauf dieser 200ms soll sie wieder auf 0 wieder während z.B 10ms (wie ich oben erklärt habe, wenn der funktionswert den wert 0 hat) zurückgesetzt werden.

    So würde eine funktion enstehen die ganz kurz (10ms) den Wert 0 hat, dann während 200ms hat sie einen neuen Wert z.B 10 der ungleich null ist.

     
  • Ralph Holz - 2009-01-21

    Was erwartest Du jetzt eigentlich von uns? Wir werden dir nicht dein Problem lösen sondern nur den Ansatz liefern. Du brauchst einen Osziilator mit unterscheidlichen Impuls/Pausenverhältnis also am einfachsten 2 Timer. Das ist genau das was Speicherzelle dir geliefert hat die verwendung von einem Timer jetzt also mal das Gehirn einschalten und versuch mal das auf zwei Timer umzusetzen

    Also konkret:

    Timer 1 läuft (10ms) --> Ausgabe von Wert 0

    Wenn Timer 1 abgelaufen ist

    Timer 2 läuft (200ms) --> Ausgabe von Wert 0 + 10 oder vielleicht doch gleich 10

    Wenn Timer 2 abgalaufen ist geht es wieder von vorne los

    Also Forum funktioniert so:

    1. Gehirn einschalten

    2. Selbst probieren (also z.B. rausfinden wie die Timer funktionieren und rausfinden wie man beding etwas ausführt)

    3. Wenn du nicht mehr weiter kommst das Forum fragen und dabei am besten noch deine Code den du schon geschrieben hast posten

     
  • guynougouapi - 2009-01-21

    Hallo,

    hier ist mein Programmcode:

    PROGRAM PLC_PRG

    VAR

    t1: TON;
    
    t2:TON;
    
    wert: INT := 0;
    
    wert1:INT:=0;
    
    temp_:INT:=0;
    
    VAR_TEMP1:INT:=0;
    
    BOOLl: BOOL;
    

    END_VAR

    VAR_OUTPUT

    END_VAR

    LDN t1.Q

    ST      t1.IN
    
    CAL     t1(pt:=t#10ms)
    
    LD      t1.Q
    
    JMPCN   M001
    
    
    
    LDN     t2.Q
    
    ST      t2.IN
    
    CAL     t2(pt:=t#200ms)
    
    LD      t2.Q
    
    JMPCN   M002
    

    M001:LD 0

    ST      wert
    
    JMP     en
    

    M002:LD 10

    ADD     wert
    
    ST      wert
    
    JMP     en
    

    en:

    Das Programm läuft in Taskmodus mit einem Zykluszeit die von 100ms. Der Wert wurde von mir willkürlich gegeben.

    Auf dem Trace bekommen nichts sinnvolles.

    Wie kann und wo kann ich mein Programm korrigieren?

    LG Guy

     
  • Speicherzelle - 2009-01-21

    guynougouapi hat geschrieben:
    Hallo,
    hier ist mein Programmcode:
    PROGRAM PLC_PRG
    VAR
    t1: TON;
    t2:TON;
    wert: INT := 0;
    wert1:INT:=0;
    temp_:INT:=0;
    VAR_TEMP1:INT:=0;
    BOOLl: BOOL;
    END_VAR
    VAR_OUTPUT
    END_VAR
    LDN t1.Q
    ST t1.IN
    CAL t1(pt:=t#10ms)
    LD t1.Q
    JMPCN M001
    LDN t2.Q
    ST t2.IN
    CAL t2(pt:=t#200ms)
    LD t2.Q
    JMPCN M002
    M001:LD 0
    ST wert
    JMP en
    M002:LD 10
    ADD wert
    ST wert
    JMP en
    en:
    Das Programm läuft in Taskmodus mit einem Zykluszeit die von 100ms. Der Wert wurde von mir willkürlich gegeben.
    Auf dem Trace bekommen nichts sinnvolles.
    Wie kann und wo kann ich mein Programm korrigieren?
    LG Guy

    Hallöchen,

    wollte eigentlich nur mal wisen was für ein Background-Wissen Du hast.

    Anfänger

    sage doch mal Bescheid dann wissen wir wie intensiv das Frage Antwortspiel wird.

    nigs für Ungut

    MFG

    Speicherzelle

     
  • guynougouapi - 2009-01-21

    Hallo,

    ich bin relativ neu in Codesys. Aber ich hab mal in der Vorlesung Steuerungstechnik ein bisschen von SPS mitbekommen.

    Ist mein Programmcode total daneben?

    LG Guy

     
  • guynougouapi - 2009-01-21

    Hallo,

    ich hab ein sinnvolleres Code gechrieben s.u

    PROGRAM Text

    VAR

    bool_1:BOOL;

    bool_2:BOOL;
    
    rtrig:R_TRIG;
    
    ftrig:F_TRIG;
    
    tp_1:TP;
    
    tp_2:TP;
    
    F:REAL:=10;
    

    END_VAR

        IF NOT bool_1 THEN
    
    
    
                                                rtrig(CLK:= NOT bool_2);
    
                                                tp_1(IN:= rtrig.Q, PT:= t#6000ms);
    
    
    
                                                      IF tp_1.Q THEN
    
                                                           bool_2:=TRUE;
    
                                                           F:=F;
    
                                                      END_IF
    
                                     END_IF
    
    
    
    
    
                                IF NOT tp_1.Q THEN
    
    
    
                                               bool_1:=TRUE;
    
                                               ftrig(CLK:= NOT bool_2);
    
                                                tp_2(IN:= ftrig.Q, PT:= t#6000ms);
    
    
    
                                                      IF tp_2.Q THEN
    
                                                           bool_2:=FALSE;
    
                                                           F:=0;
    
                                                      ELSE
    
                                                         F:=20;
    
                                                         bool_1:=FALSE;
    
                                                    END_IF
    
    
    
                                     END_IF
    

    Die Frage ist folgendes:

    Warum am Zeil mit dem Befehl ftrig(CLK:= NOT bool_2); wird keine negative Flanke erkannt obwohl bool_2 der Wert TRUE an diesem Programmzeil hat. ?

    Ich habe Breakpoint gesetzt und vermute dass da der Fehler kommt. Theoretisch würde es funktionieren. Sie können selbst probieren.

    LG

    Guy

     
  • Speicherzelle - 2009-01-22

    guynougouapi hat geschrieben:
    Hallo,
    ich hab ein sinnvolleres Code gechrieben s.u
    PROGRAM Text
    VAR
    bool_1:BOOL;
    bool_2:BOOL;
    rtrig:R_TRIG;
    ftrig:F_TRIG;
    tp_1:TP;
    tp_2:TP;
    F:REAL:=10;
    END_VAR
    IF NOT bool_1 THEN
    rtrig(CLK:= NOT bool_2);
    tp_1(IN:= rtrig.Q, PT:= t#6000ms);
    IF tp_1.Q THEN
    bool_2:=TRUE;
    F:=F;
    END_IF
    END_IF
    IF NOT tp_1.Q THEN
    bool_1:=TRUE;
    ftrig(CLK:= NOT bool_2);
    tp_2(IN:= ftrig.Q, PT:= t#6000ms);
    IF tp_2.Q THEN
    bool_2:=FALSE;
    F:=0;
    ELSE
    F:=20;
    bool_1:=FALSE;
    END_IF
    END_IF
    Die Frage ist folgendes:
    Ich habe Breakpoint gesetzt und vermute dass da der Fehler kommt. Theoretisch würde es funktionieren. Sie können selbst probieren.
    LG
    Guy

    Hallo mein Freund,

    habe mal eine Function geschrieben wo alle variable von dir vorgegeben werden können.

    Prob es aus und viel spaß dabei

    Im Beispielproggi siehste ja wie Du das machen sollst oda kannst

    testberechnung.zip [9.38 KiB]

     
  • guynougouapi - 2009-01-22

    Hallöchen,

    ich bin gestern abend auf meine Lösung nach einer langen Suche gekommen. Das programmcode steht unten. Sie können selbst probieren es funktioniert wunderbar. Ich habe sogar spasshalber eine Visualisierung dazu gemacht wo ich 6 Parameter (Stufenhoehe, Stufenanzahl, anfangswerte, die Zeiten der beide Timer etc...) eingeben kann.

    Ich danke Ihnen nochmals für Ihre Vorschläge zwei Timer zu benutzen

        IF NOT tp_2.Q AND bool_1 THEN
    
    
    
                                                rtrig(CLK:= NOT bool_2);
    
                                                tp_1(IN:= rtrig.Q, PT:= t#500ms);
    
    
    
                                                      IF tp_1.Q THEN
    
                                                           bool_2:=TRUE;
    
                                                           F:=F;
    
                                                           Anzahlstufe:=Anzahlstufe;
    
                                                      END_IF
    
                                     END_IF
    
    
    
                                IF NOT tp_1.Q AND bool_1 THEN
    
    
    
                                               ftrig(CLK:=  bool_2);
    
                                                tp_2(IN:=  ftrig.Q, PT:= t#100ms);
    
    
    
                                                      IF tp_2.Q THEN
    
                                                           bool_2:=FALSE;
    
                                                           F:=0;
    
                                                      ELSE
    
                                                         F:=F+zaehler;
    
                                                         zaehler:=zaehler +30;
    
                                                         Anzahlstufe:= Anzahlstufe+1;
    
                                                    END_IF
    
    
    
                                     END_IF
    
    
    
                                IF  Anzahlstufe = 5 THEN
    
                                       bool_1:=FALSE;
    
                                        F:=0;
    
                                   END_IF
    
     
  • hugo - 2009-01-22

    hier noch ein beispiel wie es geht

    tx := time();

    if not init then

    last := tx;

    init := true;

    elsif tx - last >= intervall then

    out := out + step;

    last := last + intervall;

    end_if;

    codebeispiele wie diese findest du zahlreich in der open source library von oscat

     

Log in to post a comment.