Taster reagieren nicht oder sehr träge

Zuviel Werbung?
-> Hier kostenlos registrieren
Vermutung: die langen Zykluszeiten entstehen, wenn ein Taster physikalisch hängen bleibt was schon hin und wieder mal vorkommt.
Doppelklicks gibts bei mir keine, nur gedrückt halten für Dimmen. Das würde meine Mitbewohner überfordern ;)

Schleifen gibts meine ich nicht - nur an einer Stelle gibts eine kleine FOR schleife in einem ST Programm, die mal über 3-4 indices drübergeht.

Es sind viele Netzwerke die z.B. selbstgebaute Bausteine hernehmen, alleine die LED Dimmer (64 Kanäle weiss, 16 Kanäle RGB) und nochmal 64 Steckdosen. Ob das ideal programmiert ist, kann ich nicht sagen, dazu fehlt mir das Fachwissen.

Es gibt 5 verschiedene Timer (heizung, beleuchtungssteuerung, etc.)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Vermutung: die langen Zykluszeiten entstehen, wenn ein Taster physikalisch hängen bleibt was schon hin und wieder mal vorkommt.
Dann würde mich mal der Code für einen Taster interessieren
Mich auch. Ob ein Taster gedrückt ist oder nicht sollte sich nur äußerst minimal auf die Zykluszeit auswirken.

Harald
 
Grobe Struktur:
1637792902558.png
Beispiel Flurlicht:
1637792922185.png
1637792960105.png

FB_DMX_MAX
Code:
Masterfader;
Tastenauswertung;
Visu_Farbwerte;

IF xZentral_AUS OR DMX_Select_Off  OR (Taste_kurz OR (Taste_lang OR (Richtungswechsel OR (bHelligkeitswert <> REAL_TO_BYTE(Akku)))))THEN

    Akku:=BYTE_TO_REAL(bHelligkeitswert);
    MinWert:=INT_TO_REAL(iMinWert);
    MaxWert:=INT_TO_REAL(iMaxWert);

    (*Grenzwertvorgabe*)

    IF MaxWert > 255 THEN
        MaxWert:=255;
    ELSIF MaxWert <MinWert THEN
        MaxWert := MinWert + rSchrittweite_uB;
    END_IF

    IF MinWert < 0 THEN
        MinWert := 0;
    ELSIF MinWert > MaxWert THEN
        MinWert := MaxWert - rSchrittweite_oB;
    END_IF

    (*Vorgabe der Dimmrichtung*)

    IF Richtungswechsel THEN
        IF (Dimm_rauf AND (Akku > (MinWert + 30)))THEN
            Dimm_rauf:= FALSE;
            Dimm_runter:=TRUE;
        ELSIF (Dimm_runter AND (Akku < (MaxWert - 30))) THEN
            Dimm_rauf:= TRUE;
            Dimm_runter:=FALSE;
        END_IF
    END_IF

    (* Verarbeitung  - kurzer Tastendruck*)
    (*(Taste_kurz  AND (Akku = 0)) OR*)

    IF    (Taste_kurz  AND (Akku = 0)) THEN
        IF xLetzter_Wert AND (letzter_Wert <>0)THEN
            Akku:=letzter_Wert;
        ELSE Akku := MaxWert;
        END_IF
    ELSIF (Taste_kurz AND (Akku > 0)) THEN
            Akku:=0;
    END_IF

    (* Verarbeitung  - langer Tastendruck*)

    IF Taste_lang THEN
        IF Dimm_rauf THEN
                IF Akku < MinWert THEN
                    Akku:=MinWert;
                ELSE
                    IF Akku<=rBereichsgrenze THEN
                        Akku := Akku + rSchrittweite_uB;
                    ELSIF Akku>rBereichsgrenze THEN
                        Akku := Akku + rSchrittweite_oB;
                    END_IF
                END_IF
                IF Akku > MaxWert THEN
                    Akku := MaxWert;
                END_IF
        ELSIF Dimm_runter THEN
                IF Akku<=rBereichsgrenze THEN
                    Akku := Akku - rSchrittweite_uB;
                ELSIF Akku>rBereichsgrenze THEN
                    Akku := Akku - rSchrittweite_oB;
                END_IF
                IF xAus_bei_Min THEN
                    IF ((Akku <= MinWert) AND (Akku <>0))THEN
                        Akku := 0;
                    END_IF
                ELSIF Akku < MinWert THEN
                    Akku := MinWert;
                END_IF
        END_IF
    END_IF

    (* Verarbeitung  - Zentral-Aus*)

    IF (xZentral_AUS OR DMX_Select_Off) THEN
        Akku:=0;
        IF Dimm_runter THEN
        Dimm_runter:=FALSE;
        DImm_rauf:=TRUE;
        END_IF
    END_IF



    (* letzten Helligkteiswert merken*)

    IF Akku >0 THEN
        letzter_Wert:=Akku;
        IF (NOT xLetzter_Wert_vor_MaxWert) AND letzter_Wert >MaxWert THEN
            letzter_Wert := MaxWert;
        END_IF
    END_IF

bHelligkeitswert:=REAL_TO_BYTE(Akku);
rProzentWert:=Akku/255*100;

    (*Werteübergabe am Masterfader*)

    bValue_in:=bHelligkeitswert;

END_IF
 
gute Frage..... gerade nochmal nachgesehen, ist da nicht zu finden...

Code:
FUNCTION_BLOCK FB_DMX_MAX
(*****************************************************
DMX Baustein White
*****************************************************)

VAR_INPUT
    xTaste: BOOL;
    xZentral_AUS: BOOL:=FALSE;
    xLetzter_Wert: BOOL:=FALSE;
    xLetzter_Wert_vor_MaxWert: BOOL:=TRUE;
    xAus_bei_Min:BOOL:=FALSE;
    rSchrittweite_uB:REAL:=1;
    rSchrittweite_oB:REAL:=1;
    rBereichsgrenze:REAL:=150;
    iMinWert: INT:= 0;
    iMaxWert: INT:= 255;
    bMasterfader        :BYTE;                            (* Fadet alle Bausteine Global*)
    xTaste_Flash        :BOOL;                            (*Ausgang ist aktiv,  so lange Eingang TRUE ist .Ausgang immer mind 10 %,
                                                        oder der letzte gespeichterte Wert - Masterfader wird immer  überlagert *)
    XTaste_EIN        :BOOL;                            (*Einschalimpuls z.B. für Timer*)
    XTaste_Nacht        :BOOL;                            (* wenn Nacht True, dann immer 4 % Wert am ausgang - Nachtlichtsteuerung *)
    Masterfader_Funktion: BOOL;                    (* wenn True, dann immer Wirkt der Masterfader direkt auf den Ausgang *)
    DMX_Select_On    :BOOL;                            (* Einschaltimpuls über DMX Select Baustein *)
    DMX_Select_Off    :BOOL;                            (* Ausschaltimpuls über DMX Select Baustein *)


END_VAR

VAR_OUTPUT

    bDMX_out        : BYTE;
    rProzent        : REAL;
    dFarbe_Visu    : DWORD;
    Status_An_aus: BOOL;

END_VAR

VAR_IN_OUT

    bHelligkeitswert: BYTE;

END_VAR
VAR
    Akku:REAL;
    MinWert:REAL;
    MaxWert:REAL;
    letzter_Wert: REAL;
    Taste_kurz: BOOL;
    Taste_Lang: BOOL;
    TON_FBDimm: TON;
    Dimm_rauf: BOOL:=TRUE;
    Dimm_runter: BOOL;
    FTRIG_taste_lang: F_TRIG;
    FTRIG_taste: F_TRIG;
    Richtungswechsel: BOOL;

    rProzentwert:REAL;
    bValue_in    :BYTE;
    TP_X_Ein: R_TRIG;


END_VAR
 
Also greift "Masterfader" auf Variablen außerhalb seines Bausteins zu -> unschön.

Aber ich kann noch keinen Showstopper erkennen.
 
kann man sich irgendwie die Zykluszeiten aller Unterprogramme im einzelnen aus der PLC_PRG Main ansehen oder muss ich jeden Programmaufruf mit irgendeinem Start / End Codeblock umgeben um das Delta zu messen?
 
Zuletzt bearbeitet:
Also ich weiß da nichts. Musst halt jedes PRG Schritt für Schritt mal deaktivieren.
Ich kenn mich mit Dmx nicht aus aber kann mich erinnern das in der Vergangenheit andere user damit Probleme hatten.
Wenn du deinen Fehler in diese Richtung eingrenzen kannst wäre ein Anruf beim Support nicht verkehrt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich hatte einmal ein ähnliches Problem, das mir Taster und vor allem Dimmer nicht mehr richtig reagierten.
Bei mir lag es am Summenstrom des K-Buses / Systemversorgung.
Ich hatte am ende noch eine zusätzliche Karte angesteckt und dies nicht kontrolliert.
Und dann häuften sich auch solche "Fehler", leider auch erst im Verlauf der nächsten Wochen und nicht unmittelbar.
 
Hallo Philipp
um den PFC auf über 200ms zu bekommen ist schon einiges nötig.
Um etwas konkretes dazu sagen zu können lade doch dein Programm mit den Bibliotheken hoch wenn du möchtest.

Hast du zum Linux noch etwas hinzuinstalliert (Docker, Phyton Scripte,..??)
 
Zurück
Oben