Ankündigung

Einklappen
Keine Ankündigung bisher.

Schaltzustände innerhalb einer Zeitspanne überwachen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Schaltzustände innerhalb einer Zeitspanne überwachen

    Hallo zusammen,

    gegeben sind zwei Signale - SchalterA=AUS und SchalterB=AUS.
    Wenn innerhalb einer minute beide auf EIN gehen soll LampeC brennen.
    Ich wurschtel da gerade schon wieder dran rum. Irgendwie will es nicht so wie ich möchte.
    Vielleicht ist mein Ansatz aber auch komplett falsch. Kreative Ideen von euch?
    Danke

    #2
    ich weiß da auch nicht immer welches.. aber das Handbuch wird dir da sicher weiterhelfen.. aber eigentlich
    sollte doch sowas wie:
    if after(GA1=EIN, 60000u64) and after(GA2=EIN, 60000u64) then write (GA3, EIN) endif

    kann jetzt auch afterc oder delay sein.. glaub delay ist es.. wie gesagt.. Handbuch..



    Gruß Martin
    Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

    Kommentar


      #3
      Also so einfach geht das nicht, denke ich. Was mir einfällt, wäre eine Lösung mit 2 Hilfsvariablen. Also etwa so :
      Code:
       Ist1Frisch = GA-1;
      if after(Ist1Frisch, 60000U64) then Ist1Frisch = AUS endif;
      Ist2Frisch = analog...  
      if Ist1Frisch and Ist2Frisch then write(GA-3, EIN) endif;
      Einfach mal so als Gedanken-Anstoß. Gute Nacht, Jens.

      Kommentar


        #4
        Moin Chris,

        ich habe es jetzt nicht selbst ausprobiert aber folgendes sollte es eigentlich tun:

        Code:
        RemainingTime = 0u64
        Abgelaufen = AUS        // nur dummy
        
        // Timer starten, sobald einer der Schalter auf EIN geht, in RemainingTime steht die Restlaufzeit
        if delayc( SchalterA or SchalterB, 60000u64, RemainingTime) then Abgelaufen = EIN endif
        
        // Wenn beide Schalter auf EIN gehen und die Zeit noch nicht abgelaufen ist, dann schalte Lampe ein und setze Restlaufzeit auf 0
        if SchalterA and SchalterB and RemaingingTime > 0u64 then {
            write (LampeC, EIN);
            RemainingTime = 0u64;
        } endif
        Natürlich geht hier dann der Spaß wieder von vorne los wenn die Lampe C erstmal an ist. Aber Du hast ja nichts weiter zu der Anforderung geschrieben...

        Gruß,
        Bernd
        Zuletzt geändert von bmx; 14.06.2015, 18:19. Grund: delayc, klar ...

        Kommentar


          #5
          Hallo zusammen,
          schon mal vielen Dank für eure kreativen Ideen! Mein Ansatz sah ähnlich dem vom Bernd aus, nur Bernd hat es sehr pfiffig mit der Restlaufzeit gehändelt.
          Ansich eine saubere Lösung! Ich baue das nun mal ein und werde es testen!
          Vielen Dank!!

          LG Chris

          Kommentar


            #6
            Achso, Nachtrag: Man muss dafür delayc verwenden ;-)

            Kommentar


              #7
              Nachtrag 2 - Ich habe es jetzt mal so umgesetzt und es funktioniert super. Vielen Dank!

              Kommentar


                #8
                Mit den utc-Funktionen sollte es auch gehen - nicht getestet, sondern gleich hier rein gecodet:

                Code:
                if change(ga1) and ga1 then {[INDENT]time1 = utctime();[/INDENT]} endif
                if change(ga2) and ga2 then {[INDENT]time2 = utctime();[/INDENT]} endif
                if change(time2) and max(time2 - time1,0u64) < 60000u64 then {[INDENT]write(ga3, EIN);[/INDENT]} endif
                Das "max(...)" könnte man hier wohl weglassen, da der Überlauf sicher einen Wert weit jenseits von 60000u64 erzeugt, falls die Differenz time2-time1 < 0 wäre...

                Ich seh' gerade, dass ich unterstellt habe, es muss eine Schaltreihenfolge eingehalten werden - aber wer das Beispiel checkt, für den ist der Rest ein Klacks...

                Mich würde interessieren, wie hier die Prozessorlast gegenüber dem delayc() aussieht. Man soll ja nicht zu viele Timer benutzen. Vielleicht kann enertegus da mal was sagen...
                Zuletzt geändert von klaus_kraemer; 18.06.2015, 12:52. Grund: Vorletzter Absatz eingefügt

                Kommentar


                  #9
                  Wie habt Ihr es eigentlich geschafft, dass Euer Codefeld alles anzeigt und bei meinem Beitrag muss man scrollen?

                  Kommentar


                    #10
                    Zitat von klaus_kraemer Beitrag anzeigen
                    Mit den utc-Funktionen
                    schöner Ansatz!
                    ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                    Kommentar


                      #11
                      Danke!

                      Kommentar


                        #12
                        Der Vollständigkeit halber: Klaus hatte richtig angemerkt, das es sich auch mit utc lösen lassen wird. Ich hatte auch einen Ansatz dazu gemacht:
                        Code:
                        SchalterA = AUS  
                        SchalterB = AUS
                        Starttime = 0u64
                        
                        // Wenn beide Schalter aus sind, soll Startzeit 0 sein
                        if SchalterA == AUS and SchalterB == AUS then Starttime = 0u64 endif
                        
                        // Startzeit setzen wenn einer der Schalter auf EIN geht
                        if (change( SchalterA ) or change( SchalterB)) and (SchalterA or SchalterB) and Starttime == 0 then {
                            Starttime = utctime();
                        } endif;
                        
                        // Wenn Startzeit kleiner als 1 minute ist und beide Schalter auf EIN sind, dann Licht schalten
                        if (change( SchalterA ) or change( SchalterB)) and (SchalterA and SchalterB) and (utctime() - Starttime < 60001u64) then {
                            write( LampeC, EIN);
                        } endif;
                        
                        // Wenn
                        if (utctime() - Starttime) > 60001u64 then Starttime = 0u64 endif
                        Habe ich allerdings nicht ausprobiert. Erschien mir aber auf den ersten Blick weniger elegant wie die delayc-Variante. Vielleicht hat ja mal jemand viel Zeit und testet das an seinem EibPC :-)

                        Gruß,
                        Bernd

                        Kommentar

                        Lädt...
                        X