Montag, 14. April 2014

Software des Weichenantriebsprüfstands

Programm des automatischen Prüfstandes für Weichenantriebe. Noch muss die Zuverlässigkeit der seriellen Verbindung verbessert werden.

Kopieren und Bearbeiten des Programms ist gemäß der Lizenz CC-BY-SA 4.0 jedermann erlaubt.

#define COIL_A  12 // Relais für Weichenantriebe
#define COIL_B  10
#define COIL_C   8
#define COIL_D   6
#define OPTOS    4 // Relais für Rueckmelder
#define RM_A     9   // Eingänge für Rueckmelder
#define RM_B    11  // Vertauschung beruecksichtigen!
#define RM_C     5  // Endschalter A hängt an Spule B
#define RM_D     7  // etc.


#define T_ON   250  // Schaltzeit des Relais und damit des Antriebs
#define T_REC  250  // Wiederaufladung der Elkos
#define T_DISC 400  // Entladen der Endschalter-Kondensatoren
#define T_OPTO 100  // Optokoppler-Aktivierung
#define IS    1     // Abstand zwischen zwei Meldungen
#define IMAX  1000  // Anzahl der Schaltvorgänge insgesamt

int i = 0;  // Zaehlt die Schaltvorgaenge
int j = 0;  // Hilfsvariable für Meldungen

void setup(){
  pinMode(COIL_A, OUTPUT);
  pinMode(COIL_B, OUTPUT);
  pinMode(COIL_C, OUTPUT);
  pinMode(COIL_D, OUTPUT);
  pinMode(OPTOS, OUTPUT);
  pinMode(RM_A, INPUT_PULLUP);
  pinMode(RM_B, INPUT_PULLUP);
  pinMode(RM_C, INPUT_PULLUP);
  pinMode(RM_D, INPUT_PULLUP);
    
  Serial.begin(115200);
  Serial.println(F("Betriebsbereit."));
}

void loop(){
  // Schalten von A und C 
  delay(T_DISC);
  digitalWrite(COIL_A, HIGH);
  delay(T_ON);
  digitalWrite(COIL_A, LOW);
  delay(T_REC);
  digitalWrite(COIL_C, HIGH);
  delay(T_ON);
  digitalWrite(COIL_C, LOW);
 
  // Pruefen der Endlage von A und C
  delay(T_REC);
  digitalWrite(OPTOS, HIGH);
  delay(T_OPTO);
  if(HIGH == digitalRead(RM_A)){
    error('A');
  }else if(HIGH == digitalRead(RM_C)){
    error('C');
  }   
  digitalWrite(OPTOS, LOW);
 
 
    // Schalten von B und D 
  delay(T_DISC);
  digitalWrite(COIL_B, HIGH);
  delay(T_ON);
    digitalWrite(COIL_B, LOW);
  delay(T_REC);
  digitalWrite(COIL_D, HIGH);
  delay(T_ON);
  digitalWrite(COIL_D, LOW);
 
  // Pruefen der Endlage von B und D
  delay(T_REC);
  digitalWrite(OPTOS, HIGH);
  delay(T_OPTO);
  if(HIGH == digitalRead(RM_B)){
    error('B');
  }else if(HIGH == digitalRead(RM_D)){
    error('D');
  }   
  digitalWrite(OPTOS, LOW);

  // Zaehlung und Datenuebertragung
  i++;
  j++;

  if (IS == j){  
    Serial.print(F("i = "));
    Serial.println(i);
    j = 0;
  }

  if (i >= IMAX){
    Serial.println("Versuch abgeschlossen.");
    Serial.print("Erfolgreiche Schaltvorgaenge: ");
    Serial.println(i);
    Serial.end();
    while(true){
      // do nothing
    }
  }
 
}

void error(char k){
  Serial.print("Endschalter leitet nicht:");
  Serial.println(k);
  Serial.println("Versuch angehalten.");
  Serial.print("Erfolgreiche Schaltvorgänge: ");
  Serial.println(i);
  Serial.end();
    while(true){
    // do nothing
  }
}

Keine Kommentare:

Kommentar veröffentlichen