Exemple de programme

 

Exemple de programme

Présentation

L'exemple suivant montre comment implémenter le programme dans votre application.

Étape

Action

1

Créez un projet vide dans EcoStruxure Machine Expert Logic Builder.

2

Ajoutez un contrôleur Schneider Electric à l'aide de la commande Ajouter un appareil.

3

Double-cliquez sur le gestionnaire de bibliothèques dans l'arborescence Outils.

4

Ajoutez les bibliothèques AsyncManager et SysTime dans l'éditeur du gestionnaire de bibliothèques à l'aide de la commande Ajouter une bibliothèque.

5

Ajoutez un POU de type programme nommé SR_AsyncTest à l'application à l'aide de la commande Ajouter un objet.

6

Ajoutez un appel du POU SR_AsyncTest à la tâche créée par défaut.

7

Ajoutez un POU de type bloc fonction nommé FB_AsyncTest à l'application à l'aide de la commande Ajouter un objet.

Le bloc fonction doit implémenter l'interface SE_Async.IF_Async.

FB_AsyncTest

Déclaration

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

Programme

// No implementation for this example

FB_AsyncTest.Job

Déclaration

METHOD Job : BOOL

VAR
   udiStart : UDINT;
END_VAR

Programme

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

Déclaration

VAR
END_VAR

Programme

xDone := THIS^.xDoneLocal;

FB_AsyncTest.xDone.Set

Déclaration

VAR
END_VAR

Programme

THIS^.xDoneLocal := xDone;

SR_AsyncTest

Déclaration

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

Programme

(* 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