holgermaik
Level-3
- Beiträge
- 1.435
- Reaktionspunkte
- 375
-> Hier kostenlos registrieren
Schreibe doch mal konkret was du erreichen möchtest.
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Ganz oben habe ich gedacht, dass das Fazit ist, dass ich es nicht schaffe mit den TON Timern wirklich genau zu sein, wenn die Timerzeit sehr klein gewählt wird.Ja
Das hängt mit der Abarbeitung der POE zusammen. Einen Einfluss auf die Zeit hat auch die Zykluszeit des Task.
Die einfachste Lösung wäre tatsächlich die zyklische Task.
Wenn es unbedingt in der freialufende Task passieren soll, sollte hier nur ein Timer verwendet werden.
Deklaration:
Code:meinTimer: TON; diZeitwert: DINT; diSchritt: DINT; diSchrittAlt: DINT; CNT: DINT; value: REAL; tDurY: TIME; diAnzahl: DINT; tDurX: TIME;
und Code:
Code:diAnzahl := 50; tDurX:= T#100ms; tDurY:= tDurX*REAL_TO_DINT((DINT_TO_REAL(diAnzahl)+1.5)); meinTimer(PT:= tDurY, IN:= TRUE); diZeitwert := TIME_TO_DINT(meinTimer.ET); diSchritt := (diZeitwert - (diZeitwert MOD TIME_TO_DINT(tDurX))) / TIME_TO_DINT(tDurX); IF diSchritt <> diSchrittAlt AND diSchritt<>0 AND diSchritt <=diAnzahl THEN CNT := CNT + 1; value := value + 100 * (TIME_TO_REAL(tDurX)/(TIME_TO_REAL(tDurY))); END_IF; diSchrittAlt := diSchritt;
Ich möchte genau alle 100 ms eine Aktion durchführen. z.B. einen Wert erhöhen, eine Funktion inkrementieren ...Schreibe doch mal konkret was du erreichen möchtest.
==>Ich möchte genau alle 100 ms eine Aktion durchführen. z.B. einen Wert erhöhen, eine Funktion inkrementieren ...
Die Zykluszeit ist das Zeitraster in welchen die Task aufgerufen wird.
Bei Codesys kann man wählen zwischen:
Freilaufend -> hier wird der Task aufgerufen wenn der Controller Zeit hat
Ereignisgesteuert -> Aufruf bei bestimmten Ereignis
Zeitraster -> z.B.50ms -> Hier wird die Task alle 50ms aufgerufen
Dann musst Du ein Ereignis oder Zyklus nehmen, was genau alle 100ms kommt. Z.B. die Task-Aufrufzeit. Wenn Du eine Task alle 10ms aufrufst, dann in der Task bis 10 zählen und dann die Aktion aufrufen. Falls Du auch noch freilaufende Task oder unsynchrone Feldbus-EA-Zyklen hast, dann wird da aber auch wieder ein Jitter bei der Verarbeitung der Aktion entstehen.Ich möchte genau alle 100 ms eine Aktion durchführen. z.B. einen Wert erhöhen, eine Funktion inkrementieren ...
Wenn es wirklich eine Punktlandung werden muss, sind Zeitbausteine wie TON, TOFF & TP nicht geeignet. Hier wäre der Weg von PN/DP der richtige.Ich möchte genau alle 100 ms eine Aktion durchführen. z.B. einen Wert erhöhen, eine Funktion inkrementieren ...
Ich hab das jetzt nur zu Lernzwecken gemacht, um die Funktionsweise der Timer richtig zu verstehen und anwenden zu können.Dann musst Du ein Ereignis oder Zyklus nehmen, was genau alle 100ms kommt. Z.B. die Task-Aufrufzeit. Wenn Du eine Task alle 10ms aufrufst, dann in der Task bis 10 zählen und dann die Aktion aufrufen. Falls Du auch noch freilaufende Task oder unsynchrone Feldbus-EA-Zyklen hast, dann wird da aber auch wieder ein Jitter bei der Verarbeitung der Aktion entstehen.
Warum muß die Aktion "genau alle 100ms" passieren? Ist alle 95..105ms nicht genau genug?
Bedeutet? Kannst du mal Fakten nennen? Statt 100ms sind es nur 99,999ms oder 94ms..... oder 100,01ms....???Das scheint etwas genauer zu sein, aber 100 % genau klappt es damit gefühlt auch nicht.
Ich habe kein Oszilloskop dran, aber ich kann die Dauer tDurY erhöhen, dann steigt der Fehler auch. Und bei der Timer Version (In 20s bis 196 gezählt) ist der Fehler größer als bei der Task Version (Bei 20s bis 199 gezählt).Bedeutet? Kannst du mal Fakten nennen? Statt 100ms sind es nur 99,999ms oder 94ms..... oder 100,01ms....???
Wie stellst du fest dass es nicht 100%ig passt? Oder ist das ein Bauchgefühl?
Stimmt. Womöglich ist der Task dann sehr genau, aber der 20s Timer hatte eine kleine Schwankung.Aber woher weißt Du, daß genau 20 Sekunden vergangen sind?
Womöglich ist der Task dann sehr genau, aber der 20s Timer hatte eine kleine Schwankung.
Gestoppt, mitgezählt...? Wie hast du das ermittelt?Bei 20s bis 199 gezählt
Immer wenn der Task aufgerufen wurde, wurde eine Variable + 1 gerechnet.Gestoppt, mitgezählt...? Wie hast du das ermittelt?
Und dann? Wie hast du die 20s gestoppt?Immer wenn der Task aufgerufen wurde, wurde eine Variable + 1 gerechnet.
In dem FB, indem sich der 20 s Timer befindet wird eine Variable geändert, sobald Timer.Q = True. Diese Variable ist global und befindet sich in dem anderen Task. Dort wird sie abgefragt. Nur wenn die Variable True ist, wird auch die Zahl inkrementiert.Und dann? Wie hast du die 20s gestoppt?
Ich behaupte mal, die Steuerung und der Task laufen sehr genau, es liegt eher ein Gedankenfehler vor ( durch die zwei Tasks ).In dem FB, indem sich der 20 s Timer befindet wird eine Variable geändert, sobald Timer.Q = True. Diese Variable ist global und befindet sich in dem anderen Task. Dort wird sie abgefragt. Nur wenn die Variable True ist, wird auch die Zahl inkrementiert.
Hast du eine Idee was der Gedankenfehler sein könnte?Ich behaupte mal, die Steuerung und der Task laufen sehr genau, es liegt eher ein Gedankenfehler vor ( durch die zwei Tasks ).
mw = 123.456
abfragen will. Da muß man auch ein gewisses Toleranzfenster oder Totband festlegen.Alles klar. DankeWeil die SPS zyklisch arbeitet, schwanken alle erzeugten Zeiten durchschnittlich +/- ca. einen halben Zyklus. Man muß für die Aufgabe ein Toleranzfenster festlegen, wie genau man die Zeiten tatsächlich braucht, und nicht exakt genaue Zeiten erwarten.
Das ist ähnlich, wie wenn man einen analogen Messwert auf exaktmw = 123.456
abfragen will. Da muß man auch ein gewisses Toleranzfenster oder Totband festlegen.
Harald
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen