Ereignisgesteuerter Task wird nur zufällig ausgeführt

b4w3f

Level-1
Beiträge
33
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
ich beschäftige mich erst seit einem knappen Monat mit Codesys 3.5.

Ich habe ein ganz simples Programm geschrieben um Ereignisgesteuerte Tasks zu verstehen.
Dazu habe ich zwei Tasks erstellt:

StartTask (Ruft PLC_PRG auf, zyklisch 20ms, Priorität 5)
MotionTask (Ruft MotionTask auf, Ereignis, Globale Variable xMotionTaskStart, Priorität 1)

Code:
Inhalt PLC_PRG:
MotionTaskStart();
MotionTaskEnd();

Inhalt MotionTaskStart:
xMotionTaskStart:= TRUE;

Inhalt MotionTaskEnd:
xMotionTaskStart:= FALSE;

Inhalt MotionTask:
Zaehler:= Zaehler +1;


Das alles lässt sich fehlerfrei erstellen. Das Programm läuft auch. Während ich hier schreibe schaffte StartTask 33000 Zyklen. MotionTask wurde nur 25 Mal aufgerufen.
Wenn ich mich mit Prozedurschritt vorarbeite wird MotionTask jeden Zyklus aufgerufen. Deswegen verstehe ich nicht was hier falsch läuft.


Noch eine kleine Frage hinterher: Wo versteckt sich AxisGroup.bSync aus Codesys 2.3? Das es AxisGroup nicht mehr gibt ist klar, die meisten Funktionen habe ich wiederfinden können. Die Flankenerkennung für den MotionTask soll nämlich das Empfangen des Sync-Telegramms sein, wie ich es aus 2.3 kenne.
 
Ich kenne Codesys sicher nicht genug, doch mir fällt auf:

Soll xMotionTaskStart eine Art Freigabe für die Ausführung der ereignisgesteuerten Task sein?
xMotionTaskStart wird nur eine extrem kurze Zeit TRUE, die Ereignisse müßten genau in dieser kurzen Zeitspanne zwischen MotionTaskStart() und MotionTaskEnd() auftreten, um xMotionTaskStart=TRUE zu sehen. (oder stehen die Ereignisse in einer Warteschlange bis xMotionTaskStart TRUE wird?)

Wenn im Einzelschritt die PLC_PRG zwischen MotionTaskStart() und MotionTaskEnd() angehalten ist, dann sieht jedes Ereignis xMotionTaskStart=TRUE

Mache doch mal in der MotionTask einen Aufruf-Zähler VOR der Auswertung von xMotionTaskStart.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mache doch mal in der MotionTask einen Aufruf-Zähler VOR der Auswertung von xMotionTaskStart.

Der Task MotionTask wird immer dann ausgeführt wenn xMotionTaskStart eine steigende Flanke hat, also auf True gesetzt wird. Folglich kann MotionTask nichts tun VOR der Auswertung von xMotionTaskStart. Aber könnte es sein, dass die Flanke vom Taskmanager (mit dem ich als Nutzer ja nicht viel zu tun habe) erkannt wird, sollten zwischen True und False einige µs vergehen?
Eben Ausprobiert mit 55µs zwischen MotionTaskStart und MotionTaskEnd. Viel länger wird mein Programm so oder so nicht brauchen. Weiterhin nur Zufall.

Habe grade einen Wago 750-377 mit einer 750-430 angeklemmt. Wenn ich xMotionTaskStart auf einen Eingang Mappe wird jeder Aufruf erkannt, wenn ich das Signal an der Hardware auf True setzte. Egal wie schnell der PLC_PRG läuft. Da es später ja eh mit dem Sync-Telegramm der Motion-Motoren auslösen soll ist mir die Lösung des obigen Problems grad relativ egal und die Suche nach "AxisGroup.bSync" wird wieder relevant. Jemand eine Idee wie ich das Versenden des Synctelegrammes des Motionantriebs auf andere Weise erhalten kann?
 
Hallo,
was verwendest du genau für eine V3.5 Steuerug. Das sollte eigentlich nicht notwendig sein.
Du setzt eine zyklische Taskk auf mit z.b 4ms und stellst das im CANopenManager ein... die Cycle Period muss zum Motion Task Zyklus passen. (+ wie immer: die FB's nur in dieser Task aufrufen)
Das war's schon, wenn deine SPS "echtzeifähig" genug ist geht das so.

Wenn nicht wäre vielleicht SoftMotionLight eine Option. (Ebene ohne CNC und CAMing nur Ptp mt PLCopen fb's)

Grüße
 

Anhänge

  • Sync4ms.jpg
    Sync4ms.jpg
    158 KB · Aufrufe: 24
Zuletzt bearbeitet:
Alles klar. Das hilft mir. Ich verwende einen Lenze 3200c ipc mit intel Atom. Der sollte Echtzeitfähig genug sein. Ich war mir nicht sicher warum genau AxisGroup.bSync verwendet wurde, das Programm wurde vor Jahren von extern in 2.3 geschrieben.
 
Zurück
Oben