TIA Problem bei 1200er CPU mit Drehgeber an HSC Zähler

Fluffi

Level-2
Beiträge
453
Reaktionspunkte
69
Zuviel Werbung?
-> Hier kostenlos registrieren
An einer Anlage ist ein A/B Drehgeber am HSC (High-Speed-Counter) Eingang einer 1200er SPS angeschlossen und es werden die Inkremente des Gebers mit 100kHz gezählt. Mittels Interrupt wird der Nulldurchgang erkannt und der Zähler zurückgesetzt. Ab einem definierbaren Zählwert wird programmtechnisch eine Aktion ausgelöst.

Es besteht nun folgendes Problem:
Bei langsamen Geschwindigkeiten funktioniert das Ganze ohne Probleme. Ist die Geschwindigkeit allerdings höher, ca. 200 Inkr. / Sekunde (was nicht wirklich viel ist), kann es sein, dass die SPS schon nicht mehr auf den Zählerwert reagiert.

Das Problem ist eigentlich schnell erkannt. Der Zählwert wird zyklisch im Programm ausgewertet und trotz Bereichserfassung kommt die Steuerung einfach nicht mehr hinterher. Meine Lösung wäre, den Zählerwert per Interrupt mit dem Sollwert zu vergleichen. Nur gibt es hier 2 Probleme. Erstens, kann in der Konfig nur 1 Interrupt definiert werden und dort findet bei Überlauf schon der Reset statt. Das zweite Problem wäre, dass der Referenzwert um den Interrupt auszulösen, ein einzelner fester Wert im gesamten Bereich sein muss. Somit fällt die Lösung flach, bei jedem Inkrement einen Interrupt auszulösen um hier dann den einen möglichen Reset und den Ist/Soll-Vergleich durchzuführen. Es sein denn, man setzt den Referenzwert auf 1 und zählt dann gar nicht mehr in der HW sondern im Interrupt-Programm mit dem Nachteil, dass die CPU komplett in die Knie geht?

Hat jemand eine Lösung wie dieses Problem mit dieser Hardware oder evtl. auch mit zus. HW zu lösen sein könnte?
 
Zuletzt bearbeitet:
Warum willst/mußt Du die Drehgeber-Position (Zählwert) rücksetzen/löschen? Während die Achse sich dreht!? Laß den Zähler doch frei laufen und berechne die relative Position Modulo zur Referenz-Position. Irgendwo machst Du doch bestimmt auch ein Referenzieren?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab das alles so nicht gemacht, ist eine Fremdmaschine. Eine 1200er würde ich nicht mal mit der Kneifzange anfassen.
Ja, da hast du Recht, mit Freilauf und Modulo könnte man den belegten Interrupt wieder freiräumen.
Leider hab ich dann aber das Problem, dass ich keinen festen Referenzwert für das Auslösen des Vergleichs-Interrupts mehr hätte.

Die einzige Lösung die mir jetzt noch einfällt wäre, den Geber parallel auf 2 HSC zu geben, um so mit einem 2.Interrupt den Vergleich auszuführen. Das wäre aber schon arg abenteuerlich.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Die einzige Lösung die mir jetzt noch einfällt wäre, den Geber parallel auf 2 HSC zu geben, um so mit einem 2.Interrupt den Vergleich auszuführen. Das wäre aber schon arg abenteuerlich.
Das habe ich nicht wirklich verstanden, aber es klingt schon sehr nach "overkill" (zumindest bezüglich zusätzlicher Belastung der Zykluszeit durch zusätzliche Interrupte).
Gegen welche (OB1-)Zykluszeit hast Du anzukämpfen?
Es klingt recht sportlich, wenn die Inkremente des Gebers mit 100kHz gezählt werden und Du "zeitnah" beim Erreichen eines bestimmten Zählerstandes etwas auslösen möchtest/musst.
Welche Toleranz hast Du zur Verfügung?
Könntest Du den Vergleich in einem ZeitAlarm bearbeiten, der deutlich kürzer ist als die (OB1-)Zykluszeit und wäre die Reaktion dann schnell genug?
Eine andere Betriebsart als einen freilaufenden Zähler würde ich nicht in Betracht ziehen wollen.
 
100kHz ist nur die Abtastrate des ADC der 1200er HW. Die Anzahl der Inkremente sind so ca. 200/sec. Also so gut wie gar nichts wenn es um Encoder geht. Ein zusätzlicher Interrupt pro Sekunde bei Parallelisierung der Geber auf 2 HSC würde die Zykluszeit überhaupt nicht beeinflussen. Die Frage ist nur ob das el. geht und sich die Eingänge nicht gegenseitig beeinflussen. Diese A/B Signale sind glaube ich sehr empfindlich was sowas angeht.
Die Zykluszeit ist bei ca. 10ms und da reagiert das System schon nicht mehr. Eine Aufweitung der Toleranz bringt leider kein entspr. Ergebnis.
Eine Möglichkeit die mir noch einfallen würde, wäre bei dem einen mir zur Verfügung stehenden Interrupt bei jedem Aufruf immer abwechselnd den RV-Wert (Referenzwert) vom Nulldurchgang auf den Vergleichswert zu ändern, um somit beides abfangen zu können. Alternativ wäre es schön, wenn es ein autom. Rücksetzen bei Überlauf geben würde und ich mir den unnötigen Interrupt sparen könnte.
Gibt es evtl. noch externe Encoder HW die man hier einsetzen könnte? Und warum sind die HSC in diesen 1200ern so beschränkt funktionsfähig? Damit kann doch kein Mensch was anfangen. Es gibt sogar noch einen Referenzwert 2, aber der scheint nicht programmtechnisch nutzbar zu sein, sondern ist anscheinend nur für den Vergleichsausgang gedacht.
 
Zuletzt bearbeitet:
Wäre es evtl. eine Möglichkeit "X" Inkremente vor erreichen des Ziels, die "Gebergeschwindigkeit" soweit zu drosseln, dass du bei einer Zykluszeit von 10ms den Vergleich ohne Interrupt ausführen kannst (das müsste ja bei 200/sec die halbe Geschwindigkeit sein)?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wäre es evtl. eine Möglichkeit "X" Inkremente vor erreichen des Ziels, die "Gebergeschwindigkeit" soweit zu drosseln, dass du bei einer Zykluszeit von 10ms den Vergleich ohne Interrupt ausführen kannst (das müsste ja bei 200/sec die halbe Geschwindigkeit sein)?
Wie soll man denn den richtigen Zeitpunkt "X Inkremente vor Erreichen des Ziels" ermitteln, wenn doch bei Geschwindigkeiten höher als ca. 200 Inkremente/Sekunde die SPS schon nicht mehr auf den Zählwert reagiert.
Bei langsamen Geschwindigkeiten funktioniert das Ganze ohne Probleme. Ist die Geschwindigkeit allerdings höher, ca. 200 Inkr. / Sekunde (was nicht wirklich viel ist), kann es sein, dass die SPS schon nicht mehr auf den Zählerwert reagiert.
Vielleicht könnten wir noch erfahren, welche ausbleibende Reaktion der SPS erwartet wird bzw. wie die Reaktion einerseits bei Funktionieren abläuft und was andererseits bei nicht-Funktionieren passiert.
 
Du hast da bei der Konfiguration nicht alles gesehen/übermittelt oder die haben nicht alles programmiert.
Es ist nicht möglich innerhalb der normalen Zykluszeit mit dem Zähler vernünftig zu arbeiten. Das wird anders gelöst:



Kannst Du unter "Schnelle Zähler (HSC)" nachsehen ob der dort aktiviert wurde? Dann wird nämlich hiermit gearbeitet. Darin steht auch welche Eingänge für die Zählfunktion genutzt wird. Wenn dem nicht so ist, dann ändere das auf den Zähler um.
1656408593207.png
1656408633783.png


Unter dem Zähler kann die Ereigniskonfiguration genutzt werden. Damit wird das Ereignis ausgelöst:
1656408542985.png

Referenzwert vorgeben für das Ereignis, Zählerstand lesen, rücksetzen geschieht mit dem Baustein
CTRL_HSC
 
@escride1 es ist schon alles so eingestellt wie du es gepostet hast. Daran liegt nicht das Problem.

Ich denke ich habe eine Lösung gefunden. Mit der Anweisung CTRL_HSC_EXT, also die erweiterte Variante der HSC-Control-Anweisung, welche nur in den neueren Dokumentationen zur 1200er CPU auftaucht und auch im Anwendungsleitfaden nur rudimentär angeschnitten wird, gibt es den Parameter NewLimitBehavior. Damit lässt sich anscheinend programmtechnisch mit einer Belegung auf 2 der Current-Count bei Überlauf fortlaufend immer auf den StartValue setzen, sofern ich das richtig interpretiere, was seltsamerweise in der HW-Konfig so nicht einzustellen ist. Somit sollte mein Reset-Interrupt wegfallen und ich kann den Interrupt für den Vergleich nutzen.
 
Zuletzt bearbeitet:
Zurück
Oben