Attribut 'TcCallAfterOutputUpdate'

Das Attribut-Pragma TcCallAfterOutputUpdate bewirkt, dass das IO-Update vor dem SPS-Zyklus stattfindet und nicht wie es standardmäßig eingestellt ist, nach dem SPS-Programm.

Attribut 'TcCallAfterOutputUpdate' 1:
Standard-Aufruf einer SPS-Task.
Attribut 'TcCallAfterOutputUpdate' 2:
Aufruf einer SPS-Task mit Attribut TcCallAfterOutputUpdate.

Diese Funktionalität kann für Projekte mit stark schwankenden Zykluszeiten eingesetzt werden. Bei Projekten mit stark schwankenden Zykluszeiten werden die Ausgänge, da sie nach dem SPS-Zyklus geschrieben werden, mal früher (kurze SPS-Zykluszeit) und mal später (lange SPS-Zykluszeit) geschrieben. Diese Schwankungen verursachen einen Jitter in den Ausgängen. Der Nachteil besteht darin, dass durch das Attribut nicht ganz so schnell reagiert werden kann und immer ein Zyklus verloren geht. Sie müssen sich entscheiden, ob Sie schnell auf einen Eingang reagieren wollen (Standardeinstellung) oder ob sie lieber ein deterministisches Verhalten der Ausgänge haben wollen (setzen des Attributes).

Syntax: {attribute 'TcCallAfterOutputUpdate'}

Einfügeort: Dieses Attribut muss zu allen Programm POUs hinzugefügt werden, die nach dem Output Update aufgerufen werden sollen.

Beispiel:

Um das Verhalten zu verdeutlichen, brauchen Sie eine digitale Ausgangsklemme, beispielsweise eine EL2008 und ein Oszilloskop.

Schreiben Sie ein kleines SPS-Programm und verlinken Sie die Variable bOut mit einem digitalen Ausgang:

bOut:=not bOut;

Das SPS-Programm ist sehr einfach und verursacht keine Schwankungen. Der Puls wird auf dem Oszilloskop wie folgt dargestellt:

Attribut 'TcCallAfterOutputUpdate' 3:
Puls eines digitalen Ausgangs ohne Last.

Erweitern Sie nun das SPS-Programm um eine For-Schleife, um eine Programmlast zu erzeugen. Die verwendete mathematische Funktion spielt keine Rolle und soll nur eine Last erzeugen:

bOut:=not bOut;

IF bOut THEN
    For loop:=1 to 2000 do
        lrTest:=SIN(INT_TO_LREAL(loop)*3.14);
    END_FOR
END_IF

Wann immer der Ausgang auf TRUE gesetzt wird, wird die Schleife durchlaufen und eine Last erzeugt. Dadurch wird mehr Zeit für die Ausführung der SPS benötigt und der Ausgang später als sonst geschrieben. Beim nächsten Zyklus wird der Ausgang wieder auf FALSE gesetzt, die Schleife wird nicht durchlaufen und der Ausgang wird schneller auf FALSE gesetzt, da das SPS-Programm ohne For-Schleife wieder schneller fertig ist. Das Ergebnis ist, dass der Puls sehr viel kürzer ist.

Attribut 'TcCallAfterOutputUpdate' 4:
Verkürzter Puls eines digitalen Ausgangs mit Last.

Wenn die For-Schleife statt dem TRUE beim FALSE aufgerufen wird, wird das Ergebnis invertiert.

bOut:=not bOut;

IF not bOut THEN
    For loop:=1 to 2000 do
        lrTest:=SIN(INT_TO_LREAL(loop)*3.14);
    END_FOR
END_IF
Attribut 'TcCallAfterOutputUpdate' 5:
Invertierte Darstellung eines digitalen Ausgangs.

Mit dem Attribut-Pragma TcCallAfterOutputUpdate ist der Puls konstant und ist unabhängig davon, wie lange die For-Schleife benötigt oder ob sie aufgerufen wird. Das Ganze funktioniert nur dann, wenn die SPS-Task nicht überschritten wird. Achten Sie also beim Reproduzieren des Beispiels auf die Überschreitungszähler der Task.

SPS-Programm mit unterschiedlichen Laufzeiten erkennen

Um SPS-Programme mit unterschiedlichen Laufzeiten zu erkennen, muss das SPS-Programm ergänzt werden. Im Online-View sind unterschiedliche Laufzeiten nicht erkennbar, da immer ein Mittelwert über mehrere Zyklen gebildet wird. Daher sind Ausreißer nur zu erkennen, wenn diese über der Taskzeit liegen. Liegen die Ausreißer noch innerhalb der Taskzeit, sind diese nicht ohne weiteres zu sehen.

Hierfür verwenden wir dann die Systemvariablen: PlcTaskSystemInfo

VAR
    bOut : BOOL;
    PlcTaskSystemInfo : PlcTaskSystemInfo;
    udiValue : ARRAY[0..19] of UDINT;
    Cnt : INT;
END_VAR

Program:
bOut:=not bOut;

IF bOut THEN
    For loop:=1 to 2000 do
        lrTest:=SIN(INT_TO_LREAL(loop)*3.14);
    END_FOR
END_IF

PlcTaskSystemInfo:=_TaskInfo[1];

udiValue[Cnt]:= PlcTaskSystemInfo.LastExecTime;
cnt:=cnt+1;
IF Cnt >19 THEN
        Cnt:=0;
END_IF

Mit dieser Programmerweiterung sieht man, dass das SPS-Programm mit For-Schleife 7,7 ms und ohne For-Schleife 1,1 ms benötigt. Die Angabe ist 100 ns pro Digit.

Attribut 'TcCallAfterOutputUpdate' 6:
Ermittlung unterschiedlicher Lautzeiten beim SPS-Programm.

Die Messung deckt sich mit den Anzeigen auf dem Oszilloskop, auf denen erkennbar ist, dass ein Puls mal 6,5 ms länger bzw. 6,5 ms kürzer ist. Sie können die Bearbeitungszeit der For-Schleife messen (Bearbeitungszeit im SPS-Programm messen). Das Ergebnis dieser Messung wird sich mit den beobachtet Werten durch die Programmerweiterung decken, mit einer gewissen Ungenauigkeit und Jitter.