Ich möchte zur Laufzeit einen Task erzeugen.
Die Funktionen aus der SysLibTask.lib benutze ich dazu:
PROGRAM PLC_PRG
VAR
xInit: BOOL;
id: UDINT;
END_VAR
:
IF NOT xInit THEN
xInit := TRUE;
id := SysTaskCreate('Task1',20,10,SysIECGetFctPointer(INDEXOF(Task_PLC)),0);
END_IF
:
:
PROGRAM Task_PLC
VAR
hdl: UDINT;
END_VAR
hdl := SysTaskGetCurrent(TRUE);
j := j+1;
SysTaskEnd(0,hdl);
j ist eine globale Variable. Diese wird auch mit SysTaskCreate einmal inkrementiert. Danach nicht mehr.
id = hdl = 3 in meinem Fall.
Was mache ich falsch? Was fehlt noch?
Leider finde ich in den Beispielen von 3S nichts.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
der Baustein, dessen Funktionspointer, der Task beim generieren mitgegeben wurde, wird von CoDeSys einmal aufgerufen, deshalb der einmalige Inkrement.
In dem Baustein muss das Handling der Task (Schleife, Unterbrechung, Beenden) selbst programmiert werden.
Folgender Code zählt zumindest die Schleife hoch
WHILE (TRUE) DO
j:= j+1;
SysTaskSleep(200);
END_WHILE
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2011-01-27
Originally created by: blackenslaver666
Hi.
Ich kenne jetzt die Lib nicht, habe mir aber mal ein PDF angeguckt. Die Beschreibung der FUN "SysTaskEnd" ist für mich nicht eindeutig. Ich nehme mal an, dass du mit deinem Init die Task generieren willst, die dann zyklisch mit dem Intervall laufen soll. Ich denke das passiert auch, aber eben nur 1x weil j nur einmal inkrementiert wird. Ich denke "SysTaskEnd" stoppt darauf die Task wieder nachdem sie 1x abgearbeitet wurde. Daher keine Änderung mehr vom Zähler j. Würde den FUN-Aufruf mal auskommentieren zum Test. Denn bei einer zyklischen Task muss man ja auch keine FUN zum "Beenden" aufrufen.
Btw. was spricht dagegen in der Task-Konfig gleich eine zyklische Task anzulegen? Geht's dir hier nur um die Ãœbung?
Gruß Andy
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo!
Ich möchte zur Laufzeit einen Task erzeugen.
Die Funktionen aus der SysLibTask.lib benutze ich dazu:
PROGRAM PLC_PRG
VAR
xInit: BOOL;
id: UDINT;
END_VAR
:
IF NOT xInit THEN
xInit := TRUE;
id := SysTaskCreate('Task1',20,10,SysIECGetFctPointer(INDEXOF(Task_PLC)),0);
END_IF
:
:
PROGRAM Task_PLC
VAR
hdl: UDINT;
END_VAR
hdl := SysTaskGetCurrent(TRUE);
j := j+1;
SysTaskEnd(0,hdl);
j ist eine globale Variable. Diese wird auch mit SysTaskCreate einmal inkrementiert. Danach nicht mehr.
id = hdl = 3 in meinem Fall.
Was mache ich falsch? Was fehlt noch?
Leider finde ich in den Beispielen von 3S nichts.
Ich würde mich freuen, wenn sich schon kein User meldet, ich wenigstens eine Antwort von 3S bekomme. Oder muss ich mich direkt an den Support wenden?
Hallo,
der Baustein, dessen Funktionspointer, der Task beim generieren mitgegeben wurde, wird von CoDeSys einmal aufgerufen, deshalb der einmalige Inkrement.
In dem Baustein muss das Handling der Task (Schleife, Unterbrechung, Beenden) selbst programmiert werden.
Folgender Code zählt zumindest die Schleife hoch
WHILE (TRUE) DO
j:= j+1;
SysTaskSleep(200);
END_WHILE
Originally created by: blackenslaver666
Hi.
Ich kenne jetzt die Lib nicht, habe mir aber mal ein PDF angeguckt. Die Beschreibung der FUN "SysTaskEnd" ist für mich nicht eindeutig. Ich nehme mal an, dass du mit deinem Init die Task generieren willst, die dann zyklisch mit dem Intervall laufen soll. Ich denke das passiert auch, aber eben nur 1x weil j nur einmal inkrementiert wird. Ich denke "SysTaskEnd" stoppt darauf die Task wieder nachdem sie 1x abgearbeitet wurde. Daher keine Änderung mehr vom Zähler j. Würde den FUN-Aufruf mal auskommentieren zum Test. Denn bei einer zyklischen Task muss man ja auch keine FUN zum "Beenden" aufrufen.
Btw. was spricht dagegen in der Task-Konfig gleich eine zyklische Task anzulegen? Geht's dir hier nur um die Ãœbung?
Gruß Andy