INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Rückmeldekontakt im Zeitfenster überwachen
30.06.2015, 18:29 (Dieser Beitrag wurde zuletzt bearbeitet: 30.06.2015 18:30 von alpenpower.)
Beitrag #1
Rückmeldekontakt im Zeitfenster überwachen
Hallo,

ich habe folgendes Problem mit einer zeitlichen Überwachung.
An einem Schütz, den ich schalten will, ist mechanisch ein Hilfskontakt montiert.
Beim Befehl 'Schütz einschalten' soll in einem bestimmten Zeitfenster eine Rückmeldung kommen, dass der Schütz auch wirklich geschaltet hat.
Erst dann, wenn nach dem Befehl auch die Rückmeldung kommt, soll ein weiterer Ablauf starten.
Zur Info: Der erste Befehl schaltet in einer Zuluftheizung den Lüfter ein, dann kommen die vorwählbaren Heizstufen und die sollten erst freigegeben werden, wenn ich 100% die Info habe, dass der Lüfter in Betrieb ist. Zusätzlich wird noch ein Windfahnenrelais verbaut, welches dann auch noch eine Info bringt. Dieses alles logisch verknüpft, überwacht mir den Lüfterbetrieb.

Die Schaltzeit vom Schütz liegt bei ca. 30-50ms. Ich möchte in einem Zeitfenster von ca. 500ms dieses Schalten überwachen.
Nachfolgend habe ich einen Code, bei dem ich beide Schalter, den Befehl und die Rückmeldung logisch mit '&&' verknüpft habe, das klappt schon soweit, ist aber nicht die Lösung.
Ich probiere schon eine Zeit rum, um hier den zeitlichen Ablauf einzubauen, komme aber nicht weiter.

Der Ablauf sollte sein:
1. Btn Lüfter ein
2. einen Timer oder Zähler starten mit Grenzwert von z.B. 500ms
3. in diesem Zeitfenster die Rückmeldung abfragen
4. wenn beide Signale soweit und in der vorgegebenen Zeit vorhanden, dann weiter oder sonst Abbruch und Fehlermeldung

Kann mir hier mal jemand den Weg deuten?
Vielen Dank.

Gruß Franz

Code:
// constants won't change. They're used here to
// set pin numbers:
const int btnPin_Start = 6;     // Schalter Nr. 1...Startknopf fuer 'Schuetz ein'
const int btnPin_Quit = 9;      // Schalter Nr. 4... Rueckmeldesignal, wenn Schuetz ein
const int ledPin_Output = 2;    // the number of the LED pin
const int ledPin_Alarm = 3;     // the number of the LED pin

// variables will change:
int btnState_Start = 0;         // variable for reading the pushbutton status
int btnState_Quit = 0;          // variable for reading the pushbutton status

//---------------------------------------------
void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin_Output, OUTPUT);
  pinMode(ledPin_Alarm, OUTPUT);
  
  // initialize the pushbutton pin as an input:
  pinMode(btnPin_Start, INPUT);
  pinMode(btnPin_Quit, INPUT);
  Serial.begin(9600);
}

//---------------------------------------------
void loop() {
  // read the state of the pushbutton value:
  btnState_Start = digitalRead(btnPin_Start);
  btnState_Quit = digitalRead(btnPin_Quit);

  // check if the pushbuttons are pressed.
  // if it is, the buttonState is HIGH:
  if ((btnState_Start == HIGH) && (btnState_Quit == HIGH)) {
    // turn LED on:
    digitalWrite(ledPin_Output, HIGH);
  }
  else {
    // turn LED off:
    digitalWrite(ledPin_Output, LOW);
  }
  
  Serial.print("Start: ");
  Serial.print(btnState_Start);
  Serial.print("    Quit: ");
  Serial.println(btnState_Quit);
  delay(500);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.06.2015, 20:39
Beitrag #2
RE: Rückmeldekontakt im Zeitfenster überwachen
Hi,
Du hast ja schon fast alles. Es fehlt nur noch die Fehlermeldung nach 500ms.
Dazu solltest Du erst einmal das delay rauswerfen.
Das Folgende kannst Du einfach mit in loop() reinhängen.
Dann merkst Du Dir beim Übergang vom "Start" Pin von LOW nach HIGH die Zeit. D.h. Du merkst Dir immer den vorherigen Zustand. Wenn das Ding vorher LOW war und jetzt HIGH ist, dann speicherst Du die aktuellen millis() in einer statischen Variable (nennen wir sie mal startTime).
Immer wenn der Quit-Pin auf HIGH ist, dann setzt Du startTime auch auf millis().
Dasselbe wenn der Start-Pin auf LOW ist.
Zum Schluss vergleichst Du die aktuellen millis() mit startTime. Wenn das > 500ms, dann Fehlermeldung.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.07.2015, 11:30
Beitrag #3
RE: Rückmeldekontakt im Zeitfenster überwachen
Hallo,

so, es ist etwas Zeit vergangen und ich habe mich mit den Timern beschäftigt.
Nachfolgend ein Code, der ungefähr das macht, was ich geplant hatte.
Vielleicht kann ein Profi mal drüberschauen, ob das so gut ist, oder verbesserungsfähig.
Speziell der Teil 'A' mit der Veroderung der beiden Kriterien, dass einmal die Zeit abgelaufen ist und die zweite Funktion, welche abbricht, wenn der Rückmeldekontakt (HIGH=ok) in der laufenden Zeit eingegangen ist.

Das delay am Ende verschwindet natürlich und die 10000ms werden auf <1000ms geändert.
Dann noch eine Frage, könnte man sowas mit dem Befehl 'pulseIn' auch lösen?

Gruß Franz

Code:
/ 09.07.2015
int btn_Start = 6;         //Start: Relais wird eingeschaltet
int btn_quit = 9;          //Quit:  Rueckmeldung vom geschalteten Relais
int startState = 0;        //Initialisierung der Variable auf 0
int quitState = 0;         //Initialisierung der Variable auf 0
int LED = 4;               //Port fuer LED
int druckzeit = 10000;     //Zeitfenster, in der der Rueckmeldekontakt HIGH liefern soll
unsigned long aktuellezeit;
long vorherigezeit;
int a = 0;                 //Variable fuer FLAG
int b = 0;  
//---------------------------------------
void setup()
{
  pinMode(btn_Start, INPUT);
  pinMode(btn_quit, INPUT);
  pinMode(LED, OUTPUT); //LED
  Serial.begin(9600);
}
//---------------------------------------
void loop()
{
  startState = digitalRead(btn_Start);
  if (startState == HIGH)
  {
      if (a == 0)
      {
        vorherigezeit = millis();
        a = 1;
      }
    
    aktuellezeit = millis();      //Speicherung der aktuellen Zeit in Variable 'aktuellezeit'
    
//-A--------------------------------------    
    if ((aktuellezeit - vorherigezeit >= druckzeit) || (quitState = digitalRead(btn_quit) == HIGH))
    //wenn 'druckzeit' überschritten ODER wenn der 'quitState == HIGH' wird, so wird das Zeitfenster verlassen
    {
      digitalWrite(4, HIGH);    //LED
      b = 1;                    //Variable zur weiteren Verwendung (Merker)
    }
  }
  else
  {
    digitalWrite(4, LOW);      //LED
    a = 0;
    b = 0;
  
  }

//-Serielle Ausgabe----------------------  
  Serial.print("Starttaste: ");
  Serial.print(startState);
  Serial.print("    Quittaste: ");
  Serial.print(quitState);
  Serial.print("    vorherige Zeit: ");
  Serial.print(vorherigezeit);
  Serial.print("    aktuelle Zeit: ");
  Serial.print(aktuellezeit);
  Serial.print("    A= ");
  Serial.print(a);
   Serial.print("   B(Ausgang_OK)= ");
  Serial.print(b);
  Serial.println("");
  delay(1000);            //verschwindet natürlich aus dem Code, ist nur zum Testen eingebaut
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.07.2015, 12:11 (Dieser Beitrag wurde zuletzt bearbeitet: 09.07.2015 12:12 von Scherheinz.)
Beitrag #4
RE: Rückmeldekontakt im Zeitfenster überwachen
Das könntest du auch mit pulseIn() umsetzen ist aber für deine Anwendung nicht nötig.
Außer du willst die Zeit genau messen zwischen der Ansteuerung und dem tatsächlichen Anziehen. Damit kannst die herausfinden falls dein Schütz mal dräger werden sollte. Macht aber eigentlich nur in die andere Richtung Sinn. Mit pulseIn kannst du maximal 3min zählen.

Ich würde die seriellen ausgaben vielleicht nicht gerade zyklisch ausgeben, sondern nur bei Änderung oder nach bestimmten Zeiten (millis()).

Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.07.2015, 13:44
Beitrag #5
RE: Rückmeldekontakt im Zeitfenster überwachen
Hallo,
vielen Dank.
Mit pulsIn werde ich dann nicht weiter arbeiten, die Genauigkeit reicht völlig. Außer der Code wird kleiner, übersichtlicher usw.
Die ganzen Serial.print's kommen eh wieder raus, war ja nur zum Austesten gedacht. Auch die max. Zeitspanne muss ich noch ausmessen und ändern.
Vielen Dank

Gruß Franz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.07.2015, 13:46
Beitrag #6
RE: Rückmeldekontakt im Zeitfenster überwachen
Hi,
ich habe jetzt nicht die komplette Logik analysiert, nur das hier:
Code:
if ((aktuellezeit - vorherigezeit >= druckzeit) || (quitState = digitalRead(btn_quit) == HIGH))
Erstens: vorherigezeit ist nur ein long. Es muss aber auch unsigned long sein, sonst gibt's u.U. seltsame Effekte.
Zweitens: Das nach dem || ist seltsam. Es kann sein, dass das zufällig funktioniert, aber besser wäre es so:
Code:
quitState = digitalRead(btn_quit);
if ((aktuellezeit - vorherigezeit >= druckzeit) || (quitState == HIGH))
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.07.2015, 10:58
Beitrag #7
RE: Rückmeldekontakt im Zeitfenster überwachen
Hallo,

Code:
if ((aktuellezeit - vorherigezeit >= druckzeit) || (quitState = digitalRead(btn_quit) == HIGH))
Diesen zweiten Teil vom o.g. Code hatte ich mal in einem Beispiel gesehen, ich wusste selber nicht, dass man es auch so machen kann.
Aber sauber programmiert sieht es eh nicht aus, ich habe nun die herkömmliche Variante gewählt, vorher die Zuweisung der Variable und dann weiter im Programm.

Die Problematik war ja auch nur als eine Teilfunktion gedacht und muss noch weiter ausgebaut werden.
Aber trotzdem vielen Dank für die Hilfestellung.

Gruß Franz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste