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. |
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
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
Declaración
VAR
END_VAR
Programa
xDone := THIS^.xDoneLocal;
Declaración
VAR
END_VAR
Programa
THIS^.xDoneLocal := xDone;
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