Seiten

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