Programmbeispiel

Überblick

Das folgende Beispiel zeigt, wie Sie die AsyncManager in Ihrer Anwendung implementieren.

Führen Sie folgende vorbereitenden Schritte aus:

Schritt

Aktion

1

Erstellen Sie ein leeres Projekt in EcoStruxure Machine Expert Logic Builder

2

Fügen Sie mit dem Befehl Gerät hinzufügen eine Steuerung hinzu.

3

Doppelklicken Sie in der Tools-Baumstruktur auf den Bibliotheksverwalter.

4

Fügen Sie die Bibliotheken AsyncManager und SysTime im Bibliotheksverwalter mit dem Befehl Bibliothek hinzufügen hinzu.

5

Fügen Sie eine POU des Typs Programm mit dem Namen SR_AsyncTest der Anwendung mit dem Befehl Objekt hinzufügen hinzu.

6

Fügen Sie der standardmäßig erstellten Task einen Aufruf der POU SR_AsyncTest hinzu.

7

Fügen Sie der Anwendung über den Befehl Objekt hinzufügen eine POU des Typs Funktionsbaustein mit dem Namen FB_AsyncTest hinzu und implementieren Sie die Schnittstelle SE_Async.IF_Async.

FB_AsyncTest

Deklaration

FUNCTION_BLOCK FB_AsyncTest IMPLEMENTS SE_Async.IF_Async
VAR
   timPreset  : TIME := T#200MS;
   timElapsed : TIME;
   xDoneLocal : BOOL;
END_VAR

Programm

// No implementation for this example 

FB_AsyncTest.Job

Deklaration

METHOD Job : BOOL

VAR
   udiStart : UDINT;
END_VAR

Programm

// Just an example simulating time consuming program code
udiStart := SysTimeCore.SysTimeGetMs();
REPEAT
   THIS^.timElapsed := UDINT_TO_TIME(SysTimeCore.SysTimeGetMs() - udiStart);
UNTIL THIS^.timElapsed >= THIS^.timPreset
END_REPEAT

FB_AsyncTest.xDone.Get

Deklaration

VAR
END_VAR

Programm

xDone := THIS^.xDoneLocal;

FB_AsyncTest.xDone.Set

Deklaration

VAR
END_VAR

Programm

THIS^.xDoneLocal := xDone;

SR_AsyncTest

Deklaration

PROGRAM SR_AsyncTest
VAR
   xStartAsyncExecution : BOOL;
   xErrAsyncStart       : BOOL;
   etResultAsyncStart   : SE_Async.ET_Result;
   uiExecCounter        : UINT;
   uiErrCounter         : UINT;
   uiWaitCounter        : UINT;
   fbAsyncTest          : FB_AsyncTest;
   xInitAsyncComplete   : BOOL;
   xInitAsyncDone       : BOOL;
   xInitAsyncError      : BOOL;
   etInitAsyncResult    : SE_Async.ET_Result;
   xResetAsyncInitErr   : BOOL;
   iState               : INT;
END_VAR

Programm

(* Initialization of the AsyncManager *)
IF NOT xInitAsyncComplete THEN
   IF NOT xInitAsyncError THEN
      SE_Async.G_ifAsyncMgr.Init(
         q_xDone=> xInitAsyncDone,
         q_xError=> xInitAsyncError,
         q_etResult=> etInitAsyncResult );
      IF xInitAsyncDone THEN
         xInitAsyncComplete := TRUE;
      END_IF
   ELSIF xResetAsyncInitErr THEN
      xResetAsyncInitErr := FALSE;
      xInitAsyncError := FALSE;
   END_IF
   RETURN;
END_IF

(* after successful initialization async manager can be used to outsource time consuming functions*)
CASE iState OF
   0:
      IF xStartAsyncExecution THEN
         xStartAsyncExecution := FALSE;
         (* Pass the execution of the program part contained in fbAsyncTest.Job to the additional task for asynchronous execution *)
         SE_Async.G_ifAsyncMgr.Start(
            i_ifAsync:= fbAsyncTest, 
            q_xError=> xErrAsyncStart, 
            q_etResult=> etResultAsyncStart );
         IF xErrAsyncStart THEN
            // an error was detected while passing the method fbAsyncTest.Job
            uiErrCounter := uiErrCounter + 1;
         ELSE
            uiWaitCounter := 0;
            iState := 10;
         END_IF
   END_IF
   10:
      IF fbAsyncTest.xDone THEN
         // the method fbAsyncTest.Job was executed
         uiExecCounter := uiExecCounter + 1;
         iState := 0;
      END_IF
      uiWaitCounter := uiWaitCounter + 1;
END_CASE