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