Impulsfolge erzeugen

clumsi

Level-1
Beiträge
137
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich möchte für die Aufnahmesteuerung eines Sensors eine Folge von Digitalen Impulsen ausgeben. Da ich noch keine richtigen Projekte/Anlagen mit EtherCAT realisiert habe, würde ich gerne wissen, ob mein Vorhaben "EtherCAT-Tauglich" ist ;-)

Bei jedem Impuls macht der Sensor eine Aufnahme, Impulsfrequenz und Anzahl der Impulse werden vor dem Start festgelegt. Es soll eine Frequenz bis zu 1000 Hz erreicht werden. Kann man das problemlos mit einer PC-Steuerung und EK1100 mit Digitalausgängen aufbauen? Bei welcher Frequenz wäre die Leistungsgrenze von EtherCAT erreicht? Wie genau ist die Einhaltung der Zeiten?
Ich würde entweder das: http://www.beckhoff.de/default.asp?ethercat/el2124.htm oder das: http://www.beckhoff.de/default.asp?ethercat/el2502.htm Modul benutzen. Bei zweitem Modul müsste ich ja nur einmal die Frequenz vorgeben.
Über ein paar Tipps würde ich mich sehr freuen ;-)
clumsi
 
Bei der "Impulsfolge" musst du mehrere Sachen berücksichtigen:

1. Kann Steuerung und Hardware die Impulsfolge ausgeben? (benötigte Maximalfrequenz)
2. Welche Flankenformen sind notwendig?
3. Wie exakt muss die Folge eingehalten werden? (Jitter)

Steuerungstechnisch:
1. Möglichkeit: Schalten von digitalen Ausgängen (on/off)
=> Zykluszeit der Steuerung muss gering genug sein.
=> feste Zykluszeiten sind obligatorisch
=> Der Jitter der Zykluszeit darf das zulässige Maß nicht überschreiten
2. Möglichkeit: Übergabe einer Impulsfolge (Frequenz,m numerisch) an die Hardware:
=> abhängig von der Hardware

Hardwaretechnisch:
Bei Standard-Digitalausgänge (zB ne EL2022) ist das Schaltverhalten zu berücksichtigen. Nicht nur Schaltzeit (TON: 40 µs, TOFF: 200 µs typ.), sondern auch die Form der Kurve und die Flanken.
Die EL2124 schaltet mit anderen Flanken (Push-Pull-Schaltung: TON: < 1 µs typ., TOFF: < 1 µs typ.), aber dann bleibt noch das Problem mit Zykluszeit und dem Jitter seitens der Steuerung.
Die XFC-Klemmen (EL22xx => für dich z.B. die EL2202) können schnell schalten und bieten zusätzlich die "Distributed Clocks", was den Jitter der Steuerungszykluszeit minimiert. Ist die Steuerungszykluszeit höher als die benötigten Schaltfolgen könnte eine Klemme mit Oversampling Abhilfe schaffen: EL2262
Die PWM-Klemmen (EL25xx) realisieren die Schaltfolge in Hardware. Die Steuerung übergibt nur die Frequenz. Den Rest erledigt die Klemme. Aber hier, vermute ich, kann man nur kontinuierlich takten, und nicht zB eine Folge von exakt 1000 Takten ausgeben.

Mit den PWM-Klemmen ist man unabhängig von der Steuerung, aber weniger flexibel. Mit Standard-Ausgangsklemmen hat man möglicherweise Probleme mit den erreichbaren Schaltzeiten und den Signalformen. Die XFC-Klemmen bieten schnelles Schalten mit steilen Flanken und zusätzlichen Distributed Clocks.
=> schau dir mal die EL2202 an. Hier aber die EL2202-0100, da anscheinend nur diese die Distributed Clocks hat.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine ausführliche Antwort!
Als Maximalfrequenz will ich das ganze erstmal für 1 kHz auslegen. Die Flankenform soll ein Rechteck sein. Über Jitter habe ich auch schon nachgedacht, da kann ich aber keine sehr genauen Angaben machen, ich denke aber dass +-10% ausreichend sein werden.
Ich hätte ja bei der maximalen Frequenz von 1 kHz 1000 Impulse pro Sekunde, das heißt der Abstand beträgt 1 ms (0,9 ms - 1,1 ms).
Wie schon gesagt, ich habe bisher noch fast nichts mit TwinCAT gemacht, habe aber gesehen, dass die maximale Zykluszeit bei 1 ms liegt. Also gehe ich mal davon aus, dass ich sie problemlos einige Stufen senken kann. Das ist doch die Zeit, die abgewartet wird, bis der nächste Frame gesendet wird, oder?
Ich gehe auch eher davon aus, dass die Lösung mit den I/O's erstmal die bessere/flexiblere Lösung ist. Aber wozu brauche ich genau die Distributed Clocks?
Zur Zykluszeit der Steuerung: Ich verwende zum Testen einen Desktop-PC mit TwinCAT und kann nicht beurteilen, wie stark der PC mit dieser Aufgabe ausgelastet wäre. Wenn ich davon ausgehe, dass ich die Anzahl der Impulse und die Frequenz konstant lasse und mit einem digitalen Eingang das ganze auslösen möchte, wie würdest du das dann sehen?
 
Also mit einer Zykluszeit von 1ms erreichst du maximal 500Hz, denn 1ms OFF, eine 1ms ON => 1 Puls...
Wenn du irgend eine andere Frequenz willst, muss diese durch 500Hz teilbar sein! (zweitkleinste Frequenz ist dann 2ms OFF, 2ms ON => 4ms sind ein Puls, 250Hz
Zudem muss die Ausgangsklemme mitmachen, die entsprechenden Wandlungszeiten findest du in der Doku.

Ich würde dir die XFC-Klemmen empfehlen, der kannst du ein Array mit Werten für den nächsten Zyklus der SPS übergeben:
http://download.beckhoff.com/download/document/Application_Notes/DK9221-0809-0005.pdf
 
Das mit den XFC-Klemmen sieht ja interessant aus.
Aber die Rechnung verstehe ich trotzdem nicht so ganz:

Ich stelle bei der Basetime einen mittleren Wert = 100 µs ein.
Ein Impulszyklus mit der Maximalfrequenz (1 kHz) wäre dann:
- Ausgang auf 1 setzen
- 0,2 ms warten (2 Framedurchläufe)
- Ausgang auf 0 setzen
- 0,8 ms warten (8 Framedurchläufe)

Wenn es jetzt langsamer gehen soll, setze ich einfach die 0,8 ms hoch, und kann so in 0,1 ms - Schritten die Impulsfrequenz verändern.

Es ist natürlich klar, dass die I/O-Klemmen auch reaktions- und Schaltzeiten haben, aber es könnte ja sein, dass diese im Breich der Toleranz liegen. Ich kann jetzt aber nicht beurteilen, ob mein PC überhaupt schnell genug dazu ist. Ich denke mal, die 100 µs können eingehalten werden, oder? Wie lange dauert denn das logische Umschalten im PC und wie sieht das Programm dann aus? Würde man da dann mit einer Zählschleife und Warteanweisungen (Delay 0,2 ms) arbeiten?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dei Frage ist primär, ob dein PC EtherCAT-tauglich ist... (Netzwerkkarte muss von TwinCAT unterstützt werden)
Die Rechenleistung eines PCs reicht locker aus, solange du nicht noch tausend andere Sachen im schnellen Task machen willst!
 
Dei Frage ist primär, ob dein PC EtherCAT-tauglich ist... (Netzwerkkarte muss von TwinCAT unterstützt werden)
Jo, das ist sie! Habe eine Beckhoff-Karte, aber auch mein normaler Mailboard-Ethernetanschluss scheint zu funktionieren. Ich kann mir zumindest den Onlinestatus der Klemmen etc. ansehen.

Lässt sich dann der Wartetimer im SPS-Programm exakt mit dem Timer zum Frames senden synchronisieren?
Wenn ich bei 0 anfange, wird der erste Frame gesendet und ich warte 100µs um dann den Ausgang zu setzen. Wie kann ich mir sicher sein, ob diese Zustandsänderung dann vom zweiten Frame (100 µs später) noch mitgenommen wird, oder erst mit dem dritten Frame ausgeführt wird?
 
Zuletzt bearbeitet:
Ein Frame wird in der Grundeinstellung gesendet, wenn die SPS mit der Abarbeitung fertig ist. Hier hat man mit zwei verschiedenen Jittern zu kämpfen:
- Die Schwankungen der Echtzeit an sich, also in welchen Abständen genau ein Zyklus gestartet wird.
- Die Dauer der Abarbeitung. Braucht das SPS-Programm länger, wird der Frame später abgeschickt.
Der zweiten Sache kann man im TwinCAT mit der Option "I/O am Task-Anfang" begegnen: Dann wird der Frame am Beginn eines Zyklus gesendet.
Gegen die Echtzeitschwankungen kann man softwaretechnisch nichts machen, da es systembedingt ist. Und hierfür benötigt man die "Distributed Clocks": Der Master misst die Laufzeiten der Telegramme und stellt die internen Uhrzeiten der Slaves nach. Dadurch bekommt jeder Slave eine Interrupt-Zeit mitgeteilt, bei der die Ein- und Ausgaben erfolgen sollen.
http://infosys.beckhoff.de/index.ph...ystem/html/bt_ethercat_dc_synchronization.htm
Beispiel: der Frame mit den Ausgangs-Prozessdaten kommt bei den Slaves vorbei. Normalerweise würden die Slaves die Daten ausgeben, sobald die Daten eingetroffen sind. Dann würde der erste Slave des Systems früher schalten als der letzte. Mit den eingestellten Distributed Clocks erhalten die Slave auch die Prozessdaten, warten aber mit der Ausgaben, bis die vorkonfigurierte Interupt-Zeit abgelaufen ist. Also z. B. für den ersten Slave: "Ausgabe 25,4 µs nach Erhalt des Telegramms" und für den letzten Slaven: "Ausgabe 5µs nach Erhalt des Telegramms". In Summe schalten dann alle Slaves zur selben Zeit (+/- 1µs).
Damit erreicht man, dass die I/O-Ebene eine eigene Zeitbasis und Synchronisation hat, die unabhängig vom Jitter der Software arbeitet.
Auch wenn man nur einen Slave hat bringt es was, da durch die eigene Zeitbasis der I/O-Slaves, das Schalten unabhängig vom Jitter des Masters erfolgt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da ich noch keine Oversamplingklemme habe, habe ich erst einmal ein wenig mit einer EL1859 rumgespielt. Als Task zur Ausgabe einer endlosen Impulsfolge habe ich ein FUP-Programm mit RS, TON und TP erstellt (In ST, oder was sich dazu besser eingen würde, habe ich es leider noch nicht hinbekommen). Als Zeiteingang PT für TON und TP habe ich "T#1ms" und "T#8ms" getestet, damit funktioniert es auch (Auf dem Oszilloskop geprüft). Auch jeweils 1 ms funktionieren problemlos.

"T#0.9ms" funktioniert aber leider nicht, ein Fehler kommt aber nicht. Die Zykluszeit habe ich dazu auf 50 µs gestellt. Wenn ich diese Werte ausprobiere, sehe ich auf dem Oszilloskop die Anstiegsflanke, direkt gefolgt von der Abfallsflanke. Bei 0,1 ms Unterschied und einer gemessenen T_On=22 µs und T_off=48µs sollte 0,9 ms doch eigentlich auch möglich sein, deshalb gehe ich davon aus, das TC3 mit "T#0.9ms" nichts anfangen kann. Was muss ich stattdessen einstellen?
 
Das hast du richtig bemerkt, der Datentyp TIME (T#...) beinhaltet Milisekunden.
Vielleicht gibt es einen speziellen TON/TF Baustein, andernfalls kannst du über die Zyklen rechnen (Du weisst ja mit welcher Taktrate die SPS arbeitet)
 
andernfalls kannst du über die Zyklen rechnen
Und wie würde das gehen, wo gibt es eine Doku dazu? Ist meine Vorgehensweise mit dem FUP und der Blinksteuerung über TON und TP denn generell richtig, oder macht man soetwas lieber ganz anders (hätte auch absolut nichts gegen C :D )?

Demnächst möchte ich ja, wie von euch vorgeschlagen, die EL2262 verwenden. Muss/kann ich mich dann selber darum kümmern, welche 1000 Zustände (als Array) bei jedem Zyklus in das Modul geladen werden? Wenn ja, wie? Über FUP stelle ich mir das schwierig vor.... Ich sehe es doch richtig, dass ich bei einer Zykluszeit von 1 ms und dem maximalen Oversamplingfaktor 1000 Bits in das Modul laden muss, die dann bis zum nächsten Zyklus (also 1 ms später) in gleichen Zeitabständen (also 1 ms / 1000 = 1 µs) den jeweils nächsten Arrayeintrag setzen, oder? Angenommen ich möchte in einem Zyklus von der 4. bis zur 6. µs den Zustand Hi haben, müsste ich [0 0 0 1 1 0 0 0 0 0(...)] schreiben?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey Clumsi

Das mit der Zyklustzeit kannst du wie folgt lösen:
Mache einen Zähler, der in jedem Zyklus inkrementiert wird. Nun teilst du diesen Zähler z.B. durch zwei, drei, vier... Wenn kein Rest übrig bleibt (modulo), ist deine Wunschzahl erreicht und du schaltest deinen Ausgang.

Zur EL2262 gibt es versteckt in der Hilfedatei unter Inbetriebnahme -> Beispielprogramme ein Codebeispiel:
http://download.beckhoff.com/download/Document/BusTermi/BusTermi/EL2262de.chm
 
Zurück
Oben