Programmbeispiel

 

Programmbeispiel

Überblick

Das folgende Beispiel beschreibt die Implementierung in der Anwendung.

Schritt

Aktion

1

Erstellen Sie ein leeres Projekt in EcoStruxure Machine Expert Logic Builder

2

Fügen Sie über den Befehl Gerät hinzufügen eine beliebige Steuerung von Schneider Electric hinzu

3

Doppelklicken Sie auf den Bibliotheksverwalter in der Tools-Baumstruktur

4

Fügen Sie im Bibliotheksverwalter-Editor die Bibliotheken AsyncManager und SysTime über den Befehl Bibliothek hinzufügen hinzu

5

Fügen Sie der Anwendung über den Befehl Objekt hinzufügen eine POU des Typs „Programm“ mit dem Namen SR_AsyncTest 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

Der Funktionsbaustein muss die Schnittstelle SE_Async.IF_Async implementieren

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 occurred 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