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 |
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
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
Deklaration
VAR
END_VAR
Programm
xDone := THIS^.xDoneLocal;
Deklaration
VAR
END_VAR
Programm
THIS^.xDoneLocal := xDone;
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