# Blinken durch Timer oder Task?



## Digger2010 (10 Mai 2019)

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


----------



## DeltaMikeAir (10 Mai 2019)

Für CoDeSys gibt es doch den Blink Funktions Block

( Um was für eine CoDeSys Version / Steuerung handelt es sich denn )

Siehe hier Seite 370:
ftp://ftp.moeller.net/DOCUMENTATION/AWB_MANUALS/h1437d.pdf

Oder hier:
https://forum.codesys.com/viewtopic.php?t=691


----------



## Digger2010 (10 Mai 2019)

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!


----------



## Guga (10 Mai 2019)

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


----------



## Digger2010 (10 Mai 2019)

Klasse Antwort, vielen Dank!


----------



## O'Gigis (10 Mai 2019)

Hier noch ein Beispiel mit einem einzigen TON Baustein:


```
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();
```


----------



## PN/DP (10 Mai 2019)

oder einfach so:

```
AusgangLeuchte := AusgangLeuchte XOR fbTimer_Leuchte.Q;
fbTimer_Leuchte(IN:=NOT fbTimer_Leuchte.Q, PT:=T#1S);
```


Harald


----------



## O'Gigis (10 Mai 2019)

PN/DP schrieb:


> oder einfach so:
> 
> ```
> AusgangLeuchte := AusgangLeuchte XOR fbTimer_Leuchte.Q;
> ...



Ist daselbe - nur kürzer geschrieben  + DaumenHochIcon


----------



## PN/DP (10 Mai 2019)

O'Gigis schrieb:


> Ist daselbe - nur kürzer geschrieben


... und ergibt auch kürzeren und schnelleren Programmcode

Harald


----------



## O'Gigis (10 Mai 2019)

PN/DP schrieb:


> ... und ergibt auch kürzeren und schnelleren Programmcode
> 
> Harald



Wenn dass dein Programm rettet hast du gaaaaaanz andere Probleme  

Aber ja, sieht schon eleganter aus


----------



## PN/DP (10 Mai 2019)

O'Gigis schrieb:


> Wenn dass dein Programm rettet hast du gaaaaaanz andere Probleme


Wenn ich sehe daß ein so simples Problemchen derartig uuumständlich gelöst wird, dann will ich lieber nicht das restliche "produktive" Programm sehen 

Harald


----------



## hans_a1977 (10 Mai 2019)

Also ich würde den Pulsgenerator (tof/ton) nicht für eine Fehler-Blinke nehmen. (Die Prio muss ja höher sein!)


----------



## StructuredTrash (10 Mai 2019)

hans_a1977 schrieb:


> Also ich würde den Pulsgenerator (tof/ton) nicht für eine Fehler-Blinke nehmen. (Die Prio muss ja höher sein!)



Warum muss die Prio höher sein?


----------



## hans_a1977 (10 Mai 2019)

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...


----------



## StructuredTrash (10 Mai 2019)

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.


----------



## hans_a1977 (10 Mai 2019)

hm. ja, da hast du recht


----------

