Blinken durch Timer oder Task?

Digger2010

Level-2
Beiträge
21
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

bei einer Fehlfunktion der Anlage möchte ich dieses durch das Blinken einer Leuchte signalisieren (1s Leuchte an - 1s Leuchte aus - usw.).

Bisher habe ich das Blinken durch das Hintereinanderschalten zweier TP-Glieder (mit negiertem Eingang) realisiert.

Nun kam mir die Idee, einen Task anzulegen, der jede Sekunde 1 x aufgerufen wird, Priorität 31. Dieser Task ruft einen Baustein auf, der den Wert eines Bits, genannt "Blinker" jedesmal beim Aufruf umkehrt. Das Bit "Blinker" möchte ich bei Bedarf auf die Leuchte geben.

Ich habe es getestet und es funktioniert.

Nun mal meine Frage in die Runde: Welche Methode ist die bessere (ressourcenschonende)?
Natürlich kommt es auch auf den Rest meiner Anwendung an, dass es eine pauschale Lösung nicht gibt. Spricht nur etwas besonders gegen oder für die jeweilige Methode?

Ich möchte gerne ein paar Meinungen hören, äh ... lesen.

Danke und Grüße

Digger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort!

Interessant. Ich finde den Baustein bei mir allerdings nicht. Wie es aussieht, fehlt mir die util.lib-Bibliothek.
Ich würde auch ungern etwas nachinstallieren, weil ich es mit den gegebenen Mitteln ja hinbekomme.

Danke und Grüße!
 
Ich würde die zwei TON-Bausteine nehmen. Auch ein Blink-Baustein ist in der Codesequenz ja identisch. Einzige Ausnahme ist wenn du eine CoDeSys implementierung hast die noch Blinktakte als Systemvariablen mitgeben. Aber das ist doch bei dir nicht der Fall.

Warum?
- zu viele Tasks sind nicht übersichtlich
- der SystemOverhead eine Task aufzurufen (Contextwechsel...) ist deutlich höher als die Ausführung von zwei Bausteinen.
- wenn dein Takt kommt willst du ja das in jedem Fall der Wert wechselt. Das System muss also so oder so darauf ausgelegt sein das es diese Last bewältigt.

Klar kannst du nun argumentieren das nur die uninteressante Lampe eventuell von einer höherprioren Task verdrängt wird, aber ich bin Softwerker und mag keine System wo man den 10fachen Aufwand in die SW stecken muss um HW Defizite auszugleichen.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier noch ein Beispiel mit einem einzigen TON Baustein:

Code:
    fbTimer_Leuchte : TON;



    fbTimer_Leuchte.IN     := TRUE;    // Leuchte wechselt im 1 Sekunden Takt An/Aus
    fbTimer_Leuchte .PT    := T#1S;
    IF fbTimer_Leuchte .Q THEN
        IF AusgangLeuchte THEN          // IO für Leuchte
            AusgangLeuchte := FALSE;
        ELSE
            AusgangLeuchte:= TRUE;            
        END_IF
        fbTimer_Leuchte .IN := FALSE;    
    END_IF            
END_IF

fbTimer_Leuchte();
 
oder einfach so:
Code:
AusgangLeuchte := AusgangLeuchte XOR fbTimer_Leuchte.Q;
fbTimer_Leuchte(IN:=NOT fbTimer_Leuchte.Q, PT:=T#1S);
:cool:

Harald
 
na, weil sonst die höher prioren Tasks das blinken unterdrücken könnten...d.h. würd ich in neuem Task aufrufen und nicht in main-task schreiben... aber evtl. Programm-Sache...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm, laut TE reden wir über 1s an / 1s aus. Wenn der Rechner so stark ausgelastet ist, dass die Main Task noch nicht mal alle 1 s zum Zuge kommt, wird er wohl auch seine eigentliche Aufgabe nicht erledigen können.
 
Zurück
Oben