Beispiel
So kann die Verwendung einzelner Funktionen aussehen. In diesem Beispiel wird der ApplicationSpecificTag per Write geschrieben und anschließend per Read Methode ausgelesen und überprüft.
Der folgende FB ist Teil des IoLink Beispielprojekts. Weitere Informationen finden Sie im Kapitel Beispiele.
FUNCTION_BLOCK FB_Sample_03_IolSlave
VAR_INPUT
bExecute : BOOL := FALSE;
sApplicationTag : STRING(32) := '';
END_VAR
VAR_OUTPUT
bBusy : BOOL := FALSE;
bDone : BOOL := FALSE;
bError : BOOL := FALSE;
nAdsError : E_AdsErr := E_AdsErr.NOERR;
nIolError : E_IolError := E_IolError.NoError;
sErrorTxt : STRING(255) := '';
END_VAR
VAR
bExecuteOld : BOOL;
nState : INT := 0;
fbIolSlave : FB_IolSlave;
bInitDone : BOOL := FALSE;
hr : HRESULT;
sApplicationTagRead : STRING(32) := ''
END_VAR
////
// Init
//
IF NOT bInitDone THEN
bInitDone := TRUE;
fbIolSlave.MasterAoeNetId := F_CreateAmsNetId(GVL_IO.sTerm2AmsNetId);
fbIolSlave.Port := GVL_IO.nTerm2EPI1008;
fbIolSlave.Name := 'EPI1008';
END_IF
////
// Execute/Busy State Machine
//
IF bExecute AND NOT bExecuteOld AND NOT bBusy THEN
bBusy := TRUE;
nState := 10; // WRITE
ELSIF NOT bExecute THEN
bBusy := FALSE;
bError := FALSE;
bDone := FALSE;
nAdsError := E_AdsErr.NOERR;
nIolError := E_IolError.NoError;
sErrorTxt := '';
END_IF
bExecuteOld := bExecute;
////
// FB State Machine
//
CASE nState OF
// IDLE
0:;
// WRITE
10:
hr := fbIolSlave.Write(16#0018, 0, ADR(sApplicationTag), 32);
IF NOT F_IolIsBusy(hr) THEN
IF FAILED(hr) THEN
bBusy := FALSE;
bError := TRUE;
sErrorTxt := fbIolSlave.ErrorTxt;
nAdsError := F_IolGetAdsError(hr);
nIolError := F_IolGetIolError(hr);
nState := 0; // IDLE;
ELSE
nState := 20; // READ;
END_IF
END_IF
// READ
20:
hr := fbIolSlave.Read(16#0018, 16#00, ADR(sApplicationTagRead), 32);
IF NOT F_IolIsBusy(hr) THEN
IF FAILED(hr) THEN
bBusy := FALSE;
bError := TRUE;
sErrorTxt := fbIolSlave.ErrorTxt;
nAdsError := F_IolGetAdsError(hr);
nIolError := F_IolGetIolError(hr);
nState := 0; // IDLE;
ELSE
nState := 30; // CHECK;
END_IF
END_IF
// CHECK
30:
IF sApplicationTag <> sApplicationTagRead THEN
bBusy := FALSE;
bError := TRUE;
sErrorTxt := 'sApplicationTag and sApplicationTagRead are not equal!';
ELSE
bBusy := FALSE;
bDone := TRUE;
nState := 0;
END_IF
END_CASE
////
// call FBs
//
fbIolSlave();