TIA Cyclic interrupt genauigkeit

TeDi

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich benutze eine 1516F-CPU Firmwareversion 2.8.

Im Cylic interrupt 100 000µs wird ein Merker gesetzt, der in einem FC eine variable um 0.1 erhöht.
Am Ende des FCs wird der Merker zurückgesetzt.

Starte ich gleichzeitig mit der Variable im FC eine externe Stoppuhr, ist die Variable nach 100sec. 10sec. hintendran. Also ca. 10%.

Gibt es eine Möglichkeit, die Variable genauer hochzuzählen?
 
Am Ende des FCs wird der Merker zurückgesetzt.
Typisch Multitasking-Problem. Der Merker darf nur zurückgesetzt werden, wenn er bei der Abfrage gesetzt war. Wenn der Cyclic interrupt auftritt zwischen der Abfrage des Merkers und dem Rücksetzen, dann wird das Setzen aus dem Cyclic interrupt unbemerkt wieder gelöscht.
Wie übergibst Du den Merker an den FC?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Merker setzt in Netzwerk 1 vom FC eine temporäre Variable. Mit der wird weitergearbeitet. Im letzten Netzwerk wird, wenn die temporäre Variable true ist der Merker zurückgesetzt.
 
Warum wird denn der Wert nicht im Cycle Interrupt erhöht?
Der FC wird sicherlich im normalen OB Zyklus aufgerufen?

Du musst scheinbar Zehntelsekunden zählen, dass könnte man auch anders lösen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zeig mal etwas Code

Harald
s. Anhang
Warum wird denn der Wert nicht im Cycle Interrupt erhöht?
Der FC wird sicherlich im normalen OB Zyklus aufgerufen?

Du musst scheinbar Zehntelsekunden zählen, dass könnte man auch anders lösen.
es wird alle 100ms hochgezählt. Der FB wird 384 mal aufgerufen. Da ich nicht jeden Zähler einzeln anlegen möchte, übergibt der FC den Takt an alle und jeder FB zählt hoch.
Was ist denn bitte schön eine "externe Stoppuhr"?
Eine Stoppuhr die nicht auf der CPU läuft. z.B. auf dem Handy oder wie die von DeltaMikeAir
 

Anhänge

  • Gesamt.png
    Gesamt.png
    525,9 KB · Aufrufe: 78
Wenn Du den xxx.takt_06 im OB1 rücksetzt, wird das nix.

Weiterhin funktioniert ne Addition von 0,1 als REAL nicht, die wird einfach irgendwann nicht mehr ausgeführt, wenn der Wert zu groß wird...

Und dieses Kuddelmuddel mit den Datentypen ist ansich Mist.

Und nen Input beschreiben?

DAs ist mir jetzt so auf die Schnelle aufgefallen...
 
Zuletzt bearbeitet:
Der Name "IDB-Bedienpult..." des DB301 legt nahe, daß der OB35 da in einem IDB rumschmiert. Viel besser: einen globalen DB für die Datenübergabe zwischen den verschiedenen OB-Tasks verwenden.

Anstatt Datenübergabe zwischen zwei OB-Tasks könntest Du auch einfacher den 10Hz CPU-Taktmerker verwenden und nur im OB1 programmieren:
Code:
U  "AS_Takt_10Hz"        //Bit 0 des CPU-Taktmerkerbytes (Zyklus-asynchron!)
=  "MyDB".Takt_10Hz      //Zyklus-konsistentes Abbild (auch für den Fall daß "FP" zweimal liest)
U  "MyDB".Takt_10Hz
FP "MyDB".Takt_10Hz_FPM
=  "MyDB".Takt_100ms     //alle 100ms für einen Zyklus lang TRUE

Harald
 
Zuletzt bearbeitet:
Zurück
Oben