
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo Reiner, unten findest Du ein einfaches Demoprogramm für vier Bahnen, das sich sehr gut durchsimulieren läßt. Während der Simulation müssen im Fenster 'C-Control-Digitalports" die Tasten 1, 2, 3 und 4 stellvertretend für die vier Lichtschranken gedrückt werden und dürfen nach dem Drücken nicht losgelassen werden. Denn das Loslassen wird natürlich als Portänderung (high auf low) detektiert. Um zu starten, muß die Taste 5 als Startpistole gedrückt werden. Die kann man nach dem Drücken wieder loslassen. Diese Ausgaben werden erzeugt: Ich warte, bis die Startpistole (an PORT[5]) gedrueckt wird. Starttimer ist 18128 Ich warte, bis der 1. Laeufer ins Ziel geht. Ich warte, bis der 2. Laeufer ins Ziel geht. Ich warte, bis der 3. Laeufer ins Ziel geht. Ich warte, bis der 4. Laeufer ins Ziel geht. Ergebnisse: Zeit des Siegers auf Bahn 3: 2740 ms Zeit des Zweiten auf Bahn 2: 3960 ms Zeit des Dritten auf Bahn 4: 4580 ms Zeit des Vierten auf Bahn 1: 5220 ms Natürlich kann man noch ein Menge verbessern oder das Programm an andere Signalformen anpassen. Ich habe zum Beispiel noch nicht den Fall beachtet, daß zwei Läufer zur gleichen Zeit ins Ziel kommen. Die C-Control kann außerdem nur Zahlen im positiven Bereich bis 255 (Byteformat) oder 32767 (Wordformat) verarbeiten. Falls ein Läufer länger als 32,767 Sekunden benötigt, kommt es zum Beispiel bei der Ausgabe der Zeit zu einem Überlauf. Durch ein etwas längeres Programm kann man das alles aber leicht beheben. Und zumindest die PRINT-Ausgabe "Ich warte, bis ein Laeufer ins Ziel geht" ist natürlich nur zur Verdeutlichung, was vor sich geht. In der richtigen Applikation hat das nichts zu suchen. Denn diese Ausgabe über die serielle Schnittstelle bremst erheblich. Ebenso wird eine laufende Ausgabe auf das LCD nicht sinnvoll sein. Das würde aber wahrscheinlich auch bei anderen Kontrollertypen nicht funktionieren, wenn die Lichtschranken, wie hier, per Polling abgefragt werden. Hier das Programm: define lichtschranke1 port[1] 'Hier im Programm wird angenommen, das Signal define lichtschranke2 port[2] ' der Lichtschranke ist low (0 Volt), solange define lichtschranke3 port[3] ' die Schranke nicht ausgeloest hat und wird define lichtschranke4 port[4] ' high (5 Volt), sobald ein Laeufer ins Ziel ' geht, und bleibt auch danach high. define startpistole port[5] 'Die Startpistole wird high beim Schuss. define achtports byteport[1] 'Damit lassen sich 8 Ports gleichzeitig abfragen. define led port[6] 'Eine LED zur schnellen Status-Ueberpruefung. define starttimer word 'Zwichenspeichern des TIMER-Standes. define endetimer word define alterzustand byte 'Hiermit werden Veraenderungen detektiert. define zustand byte define laeufer byte 'Zaehler fuer den Ersten, Zweiten, Dritten, ... define zustand1 byte 'Zwischenspeichern der Lichtschranken und define timer1 word 'Zielzeiten des ersten, zweiten, dritten define zustand2 byte 'und vieren Zieleinlaeufers. define timer2 word define zustand3 byte define timer3 word define zustand4 byte define timer4 word laeufer=0 'Ausgabe ueber Terminal, z.B. Hyperterminal 'oder waehrend der Simulation im Fenster 'C-Control-Ausgaben' print "Ich warte, bis die Startpistole (an PORT[5]) gedrueckt wird." 'LED einschalten led=on 'Der WAIT-Befehl laesst das Programm solange auf der Stelle stehen, 'bis die angegebene Bedingung erfuellt ist, der Ergebniswert also 'ungleich Null ist. wait startpistole starttimer=timer 'Die vier Lichtschranken sind an den unteren vier Ports (Bits) von 'BYTEPORT[1] angeschlossen. Mit dem logischen Operator AND koennen 'beliebige Bits ausmaskiert werden. alterzustand=achtports and &b00001111 print "Starttimer ist ";starttimer #wartenochmal print "Ich warte, bis der ";laeufer+1;". Laeufer ins Ziel geht." 'Warten, bis sich der Zustand einer Lichtschranke veraendert #wartelichtschranke zustand=achtports and &b00001111 if zustand=alterzustand then wartelichtschranke 'Zustand zwischenspeichern endetimer=timer alterzustand=zustand 'LED umschalten tog led 'Subroutine in Abhaengigkeit der Variablen 'laeufer' aufrufen, 'um die Bahn und den Zeitpunkt des Siegers und der drei uebrigen 'Laeufer festzuhalten on laeufer gosub erster, zweiter, dritter, vierter laeufer=laeufer+1 if laeufer<4 then wartenochmal print "Ergebnisse:" alterzustand=0 print "Zeit des Siegers"; zustand=zustand1 gosub printbahn print ": ";(timer1-starttimer)*20;" ms" print "Zeit des Zweiten"; zustand=zustand2 gosub printbahn print ": ";(timer2-starttimer)*20;" ms" print "Zeit des Dritten"; zustand=zustand3 gosub printbahn print ": ";(timer3-starttimer)*20;" ms" print "Zeit des Vierten"; zustand=zustand4 gosub printbahn print ": ";(timer4-starttimer)*20;" ms" end #erster zustand1=zustand timer1=endetimer return #zweiter zustand2=zustand timer2=endetimer return #dritter zustand3=zustand timer3=endetimer return #vierter zustand4=zustand timer4=endetimer return 'hier wird die logische Funktion XOR verwendet #printbahn if (zustand xor alterzustand)=1 then print " auf Bahn 1"; if (zustand xor alterzustand)=2 then print " auf Bahn 2"; if (zustand xor alterzustand)=4 then print " auf Bahn 3"; if (zustand xor alterzustand)=8 then print " auf Bahn 4"; alterzustand=zustand return Gruß Dietmar Meine Homepage: http://ccintern.dharlos.de |
| Antwort schreiben |