Funktion zur Flankenabfrage bzw. Flankenauswertung



  • Hallo,

    standardmäßig verwende ich um z.B. die positive Flanke eines Signals (Eingang, Tastendruck o.ä.) abzufragen folgenden Code:

    bool Flankenmerker;
    bool Hilfsmerker;
    
    /* DI_Signal = Signal, dessen Flanke abgefragt werden soll */
    Flankenmerker = DI_Signal && !Hilfsmerker;  
    Hilfsmerker   = DI_Signal;
    
    /* dann Abfrage der Flanke... */
    if(Flankenmerker) 
    {
       /* mach' sonstwas ... */
    }
    

    Der Code wird zyklisch aufgerufen (in einer Maschinensteuerung) und die Flankenabfrage funktioniert auch einwandfrei.

    ABER:

    In der Regel muss ich einen ganzen Haufen Flanken verschiedener Signale abfragen. Für jede Abfrage müssen also mind. 3, 4 Zeilen Code getippt werden und das ist mir schlicht zu aufwändig.
    Deshalb würde ich die Flankenabfrage gerne in einer Funktion unterbringen so dass ich zur Abfrage nur noch folgenden Aufruf benötigte:

    if(SteigendeFlanke(DI_Signal)) 
    {
      ...
    }
    

    Der Funktion wird also nur das Signal übergeben, alles andere (Anlegen von Hilfsvariablen etc.) geschieht innerhalb der Funktion.

    Gedacht (und gemacht) habe ich das folgendermaßen:

    bool SteigendeFlanke(bool _Signal)
    {
      static bool Flankenmerker;
      static bool Hilfsmerker;
      Flankenmerker = _Signal && !Hilfsmerker;
      Hilfsmerker   = _Signal
      return Flankenmerker;
    }
    

    Zunächst hatte ich das 'static' weggelassen, so dass die Funktion natürlich nicht funktionierte (da 'Flankenmerker' und 'Hilfsmerker' bei jedem Funktionsaufruf (geschieht zyklisch wie oben beschrieben) neu initialisiert wurden).

    Mit 'static' hat's dann erstmal prima geklappt.

    Allerdings nur solange, bis ich die Funktion für die Auswertung eines zweiten Signals benutzt habe. Hier steht das 'static' nun im Weg, da die Funktion, die die Flanke des zweiten Signals auswerten soll, die gleichen Variablen/Werte verwendet, die in der Funktion, die das erste Signal auswertet, initialisiert wurden.

    Deshalb meine Frage an alle:

    Hat irgendwer eine Idee, wie ich so etwas lösen kann (natürlich OHNE Übergabe zusätzlicher Parameter an die Funktion)?
    Dass es geht bin ich mir sicher, da ich eine solche Funktion bereits verwendet habe (die war jedoch Bestandteil eines Frameworks/Editors und ihr Quellcode leider, leider nicht zugänglich).

    Gibt es irgendeine Möglichkeit "Instanzen" (o.ä.) von Funktionen anzulegen, so dass jede "Funktions-Instanz" ihre eigenen static-Variablen hat? In C++ könnte ich mir sowas vorstellen, es muss aber leider in ANSI-C sein.

    Für Tips/Anregungen/Lösungsvorschläge schonmal im Voraus DANKE!

    MfG

    Symbolic



  • Definiere dir doch einfach eine Struktur die als Member den aktuellen, sowie den (bzw. die n-) diskreten Vorgänger integriert. Die Instanzen der Struktur übergibst du dann der funktion (evtl auch nur als Zeiger). Das wäre eigentlich dann auch das was du in C++ mit Instanzen von Klassen und deren Methoden machen würdest.


Anmelden zum Antworten