Problemlösung bei SEL Baustein

Zuviel Werbung?
-> Hier kostenlos registrieren
Wohin zurückspringen ? Auf null ? Ich habe es so verstanden er soll zu der Zeit X den Wert hochfahren und zu Y (EIN_Down) runter fahren. Heißt das du möchtest immer bei 0 starten und bei 10(Bsp) stoppen. Bei der anderen fahrt bei 10 starten und bei Null stoppen ?
 
Dass er oben bleibt ist ja in Ordnung, er soll aber wieder von vorne anfangen, sobald das relay aus und wieder an geht.

Hat den hintergrund, dass damit lampen gedimmt werden sollen, diese soll morgens langsam hochlaufen und abends langsam runter. und am nächsten morgen natürlich wieder langsam hoch ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay. Also das für den Fall das sie abends nicht runter gelaufen sind ? Wenn du sie runterfahren lässt wird der Wert ja kleiner. Sonst hättest du ja am Tag hochfahren. Jetzt kommt eine neuer Impuls (woher ist erstmal egal) und der Zirkus beginnt von vorne. Aber wenn du das wünscht ist das machbar.
 
Ja wichtig ist ja grundlegend ab "Morgens" Baustein, dass dieser, sobald Relay auf FALSE steht, wieder auf den Anfangswert, also Minwert zurückspringt.

Über den Abends Baustein machen wir uns danach Gedanken, denn dieser muss ja auch eine Zeitschaltung zum Start haben, da dort ja nur vor dem Ende des Relays dieser Wert ausgegeben werden muss.
 
Möglichkeit 1, ein Reset Eingang ?
Code:
FUNCTION_BLOCK Sel_ersatz
VAR_INPUT
    EIN, EIN_Down: BOOL;
    Faktor:REAL;
    Maxwert:REAL;
    Minwert:REAL;
    Impulszeit:WORD;
    Reset:BOOL;
END_VAR
VAR_OUTPUT
    Value:REAL;
END_VAR
VAR
    TP1, TP2: TP;
    TRIG, TRIG2:R_TRIG;
    MINv, MAXv:BOOL;
    ImpulsZeit_used:TIME;
END_VAR
und
Code:
ImpulsZeit_used:=WORD_TO_TIME(Impulszeit*1000);
TP1(IN:=EIN AND NOT MAXv AND NOT TP1.Q , PT:=ImpulsZeit_used );
TRIG(CLK:=TP1.Q);
IF TRIG.Q THEN Value:=Value+Faktor;
    ELSE Value:=Value;
END_IF;
IF Reset AND Ein = TRUE THEN Value:=Minwert;
    ELSE Value:=Value;
        END_IF;
IF Reset AND Ein_down = TRUE THEN Value:=Maxwert;
    ELSE Value:=Value;
        END_IF
TP2(IN:=EIN_Down AND NOT MINv AND NOT TP2.Q , PT:=ImpulsZeit_used );
TRIG2(CLK:=TP2.Q);
IF TRIG2.Q THEN Value:=Value-Faktor;
    ELSE Value:=Value;
END_IF;
IF Value>=Maxwert THEN maxv := TRUE;
    ELSE maxv:=FALSE;
END_IF
IF Value<=Minwert THEN minv:=TRUE;
    ELSE minv:=FALSE;
END_IF;
Hierbei wird der Wert entweder auf Maxv (EIN und RESET = TRUE) oder auf MINv (EIN-Down und RESET = TRUE) gesetzt

oder aber das er bei jedem Start bei MINv startet (EIN) bzw MAXv (Ein_Down)
Code:
FUNCTION_BLOCK Sel_ersatz
VAR_INPUT
    EIN, EIN_Down: BOOL;
    Faktor:REAL;
    Maxwert:REAL;
    Minwert:REAL;
    Impulszeit:WORD;
END_VAR
VAR_OUTPUT
    Value:REAL;
END_VAR
VAR
    TP1, TP2: TP;
    TRIG, TRIG2:R_TRIG;
    MINv, MAXv:BOOL;
    ImpulsZeit_used:TIME;
    TRIG_Min, TRIG_Max:R_TRIG;
END_VAR

UND

Code:
TRIG_Min(CLK:=EIN);
TRIG_Max(CLK:=EIN_Down);
IF TRIG_Min.Q THEN Value:=Minwert;
    ELSE Value:=Value;
        END_IF;
IF TRIG_Max.Q THEN Value:=Maxwert;
    ELSE Value:=Value;
        END_IF;
ImpulsZeit_used:=WORD_TO_TIME(Impulszeit*1000);
TP1(IN:=EIN AND NOT MAXv AND NOT TP1.Q , PT:=ImpulsZeit_used );
TRIG(CLK:=TP1.Q);
IF TRIG.Q THEN Value:=Value+Faktor;
    ELSE Value:=Value;
END_IF;
TP2(IN:=EIN_Down AND NOT MINv AND NOT TP2.Q , PT:=ImpulsZeit_used );
TRIG2(CLK:=TP2.Q);
IF TRIG2.Q THEN Value:=Value-Faktor;
    ELSE Value:=Value;
END_IF;
IF Value>=Maxwert THEN maxv := TRUE;
    ELSE maxv:=FALSE;
END_IF
IF Value<=Minwert THEN minv:=TRUE;
    ELSE minv:=FALSE;
END_IF;
 
Das sind zwei verscheide Ansätze. Oben bekommt dein Baustein einen zusätzlichen Eingang Reset. Beim unteren macht startet er immer beim kleinsten bzw höchsten Wert. Je nachdem was dir mehr zusagt.
 
Ja er soll nicht nachdem er fertg ist einfach auf 0 Springen, dann ist ja alles wieder quasi aus.

dann ist Variante eins mit reset ok, aber wie spreche ich den an..... ggf. mit relay0 negieren ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Version zwei beginnt der jedesmal bei Null bzw 10 (Bsp) wenn der Eingang EIN bzw Ein_Down true wird. Er zählt bis Max. Und erst beim nächsten Start wieder. Den Reset kann man besser über einen Impuls der auch vom Relay kommt. Aber das ist dann dasselbe wie Version 2
 
Ich bekomme, nachdem ich Version 1 kopiert habe, folgende Fehlermeldung :



------ Übersetzungslauf gestartet: Applikation: Device.Application -------
Code typisieren ...
[WARNUNG] iodrvgpio, 1.0.0.0 (3s - smart software solutions gmbh): init [GPIO](Zeile 1 (Dekl)): C0351: Das Attribut libdoc_include ist unbekannt und wird vom Compiler ignoriert.
[WARNUNG] iodrvgpio, 1.0.0.0 (3s - smart software solutions gmbh): Fb_exit [GPIO](Zeile 1 (Dekl)): C0351: Das Attribut libdoc_include ist unbekannt und wird vom Compiler ignoriert.
[FEHLER] Terrarienschaltung: Timeclock [Device: SPS-Logik: Application: SystemTimePrg](Element 1): C0080: Funktionsblock 'AnalogOut' muss für den Zugriff instanziert werden
[INFORMATION] Terrarienschaltung: AnalogOut [Device: SPS-Logik: Application]: C0181: Verwandte Position
[FEHLER] Terrarienschaltung: Timeclock [Device: SPS-Logik: Application: SystemTimePrg]: C0080: Funktionsblock 'AnalogOut' muss für den Zugriff instanziert werden
[INFORMATION] Terrarienschaltung: AnalogOut [Device: SPS-Logik: Application]: C0181: Verwandte Position
[FEHLER] Terrarienschaltung: Timeclock [Device: SPS-Logik: Application: SystemTimePrg](Element 1): C0080: Funktionsblock 'AnalogOut' muss für den Zugriff instanziert werden
[INFORMATION] Terrarienschaltung: AnalogOut [Device: SPS-Logik: Application]: C0181: Verwandte Position
Kompilierung abgeschlossen -- 3 Fehler, 2 Warnungen
 
Versuch mal die Version zwei. Also den Code 3 in den Baustein [FB] VAR kopieren und den Code 4 in den Programmteil. Alles andere aus dem Baustein löschen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Super, mit Version 2 läuft es so wie es soll.

Wenn relay aus geht, keine reaktion, geht relay auf true, dann reset der Value.

Perfekt !!


Nun bliebe die ähnliche Funktion vor dem Ausschalten...
 
Ach und auch wenn das jetzt vll schon zuspät ist, gibt es eine Möglichkeit, die als Eingang von mir gegebenen Werte (Impuls, usw...) In der Webvisu zu ändern ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, das klingt einfacher als ich es gedacht hab.

Könntest du mir sagen wie ? Das habe ich so nämlich nicht gefunden.... Und wenn ich das änder, wie lange dauert das, bis die Anwendung das kapiert ?

Oder muss ich das Programm dann neustarten oder so ?
 
Ich gehe davon aus das du Codesys 3 verwendest. Ich kenne mich leider nur mit v2.xx aus. Dort gehst du in der Visu hin und "zeichnest" oder ein Feld. Als Text gibst du bspw "Min Wert : %s" ein. Dann sollte es dort einen Punkt Variablen geben. Dort wählst du bei Anzeige die Variable aus die du dem Baustein als MinWert gegeben hast (lass du es per Variable machen möchtest). Zuletzt noch im Bereich Eingabe unten auswählen das du dort einen NUM Wert eingeben kannst und das sollte es sein.
 
So, das Feld existiert, die Variable wird ausgegeben und wenn ich draufklicke, kann ich diese ändern. Doch wenn ich dies mit Enter bestätige, bleibt er auf dem Ursprungswert....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal die Eingenschaften des Textfeldes..



Bei dem Ausschaltbaustein, wie kann ich da am Besten die Zeitwahl vornehmen ? Also wann dieser das TRUE Signal erhält
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    158,6 KB · Aufrufe: 3
Mh... Leider sind die Parameter bei 3.0 doch etwas anders.... Ich hab es jetzt zwar soweit, dass er die Dateneingabe anbietet, übernimmt, kurzzeitig anzeigt und dann wieder mit der Fest eingegebenen überschreibt.....


Naja das ist auch erstmal zweitrangig....

Wichtiger wäre mir der ausschaltbaustein
 
Zurück
Oben