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. |
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
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
Déclaration
VAR
END_VAR
Programme
xDone := THIS^.xDoneLocal;
Déclaration
VAR
END_VAR
Programme
THIS^.xDoneLocal := xDone;
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