Ejemplo de programa

 

Ejemplo de programa

Descripción general

En el siguiente ejemplo se presenta cómo implementarlo en la aplicación del usuario.

Paso

Acción

1

Cree un proyecto vacío en EcoStruxure Machine Expert Logic Builder.

2

Añada cualquier controlador de Schneider Electric mediante el comando Añadir dispositivo.

3

Haga doble clic en el Administrador de bibliotecas en el árbol Herramientas.

4

Añada las bibliotecas AsyncManager y SysTime en el editor del administrador de bibliotecas mediante el comando Agregar biblioteca.

5

Añada una POU de tipo Programa con el nombre SR_AsyncTest a la aplicación mediante el comando Agregar objeto.

6

Añada una llamada de la POU SR_AsyncTest a la tarea creada de manera predeterminada.

7

Añada una POU de tipo Bloque de funciones con el nombre FB_AsyncTest a la aplicación mediante el comando Agregar objeto.

El bloque de funciones debe implementar la interfaz SE_Async.IF_Async.

FB_AsyncTest

Declaración

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

Programa

// No implementation for this example

FB_AsyncTest.Job

Declaración

METHOD Job : BOOL

VAR
   udiStart : UDINT;
END_VAR

Programa

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

Declaración

VAR
END_VAR

Programa

xDone := THIS^.xDoneLocal;

FB_AsyncTest.xDone.Set

Declaración

VAR
END_VAR

Programa

THIS^.xDoneLocal := xDone;

SR_AsyncTest

Declaración

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

Programa

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