FB_[IEDName]Client
This block contains a state machine, the basic states of which are used in every Client example.
The block instance is required for connection management and data exchange.
Syntax
Declaration:
FUNCTION_BLOCK FB_[IEDName]Client
VAR_INPUT
fbConnection : FB_iec61850ClientClass;
END_VAR
VAR
_bAbort : BOOL;
_bDisconnect : BOOL;
_bConnect : BOOL;
_bReconnect : BOOL := TRUE;
_bReadAllData : BOOL := TRUE;
state : BYTE;
eState : E_AsyncEnvironmentState;
bBusy : BOOL;
bSuccess : BOOL;
ipResult : I_AsyncServiceResultClass;
sLastErrorResult : T_MaxString;
fbAbortReason : FB_ServiceErrorClass := (stError:=SUCCESS_EVENT);
sLastAbortReason : T_MaxString;
nInvokeID : UDINT;
eServiceError : E_AcsiServiceError;
nServiceError : UDINT;
nCmdError : UDINT;
sObjReference : T_AcsiObjectReference;
sCtrlReference : T_AcsiObjectReference;
bGetServerDirectory : BOOL := TRUE;
bGetLogicalDeviceDirectory: BOOL := TRUE;
bGetLogicalNodeDirectory : BOOL := TRUE;
bGetAllServerValues : BOOL := TRUE;
bGetAllServerValues : BOOL := TRUE;
bGetAllDataValues_LLN0_ST : BOOL := TRUE;
bGetDataValues_LLN0_ST_Beh: BOOL := TRUE;
END_VAR
fbConnection.Execute();
eState:= fbConnection.eState;
CASE state OF
0:
IF _bAbort THEN
_bAbort:= FALSE;
bSuccess:= fbConnection.AbortReq(ipReason:=fbAbortReason, ipSink:=0, ipResult=>ipResult);
state:= SEL(bSuccess, 100, 1);
ELSIF eState = E_AsyncEnvironmentState.Idle AND (_bConnect OR _bReconnect) THEN
_bConnect:= FALSE;
bGetAllServerValues:= SEL(_bReadAllData, bGetAllServerValues, TRUE);
bSuccess:= fbConnection.AssociateReq(ipSink:=0, ipResult=>ipResult);
state:= SEL(bSuccess, 100, 1);
ELSIF eState = E_AsyncEnvironmentState.Established AND _bDisconnect THEN
_bDisconnect:= FALSE;
bSuccess:= fbConnection.ReleaseReq(ipSink:=0, ipResult=>ipResult);
state:= SEL(bSuccess, 100, 1);
ELSIF eState = E_AsyncEnvironmentState.Established THEN
state:= 10;
END_IF
_bConnect:= FALSE;
_bDisconnect:= FALSE;
1:
IF ipResult <> 0 THEN
ipResult.Execute();
IF NOT (bBusy:=ipResult.IsBusy()) THEN
state:= SEL(ipResult.IsCompleted(), 100, 0);
END_IF
END_IF
10:
IF bGetServerDirectory THEN
bGetServerDirectory:= FALSE;
bSuccess:= fbConnection.GetServerDirectoryReq(ipServer:=fb[IEDName], eClass:=E_AcsiServerDirectoryClass.LogicalDevice, hUser:=0, ipSink:=0, nInvokeID=>nInvokeID, ipResult=>ipResult);
state:= SEL(bSuccess, 100, 11);
ELSIF bGetLogicalDeviceDirectory THEN
bGetLogicalDeviceDirectory:= FALSE;
bSuccess:= fbConnection.GetLogicalDeviceDirectoryReq(ipLogicalDevice:=fb[IEDName].IEDLD1, hUser:=0, ipSink:=0, nInvokeID=>nInvokeID, ipResult=>ipResult);
state:= SEL(bSuccess, 100, 11);
ELSIF bGetLogicalNodeDirectory THEN
bGetLogicalNodeDirectory:= FALSE;
bSuccess:= fbConnection.GetLogicalNodeDirectoryReq(ipLogicalNode:=fb[IEDName].IEDLD1.LLN0, eClass:=E_AcsiLogicalNodeClass.DataSet, hUser:=0, ipSink:=0, nInvokeID=>nInvokeID, ipResult=>ipResult);
state:= SEL(bSuccess, 100, 11);
ELSIF bGetAllServerValues THEN
bGetAllServerValues:= FALSE;
bSuccess:= fbConnection.GetAllServerValuesReq(ipServer:=fb[IEDName], hUser:=0, ipSink:=0, nInvokeID=>nInvokeID, ipResult=>ipResult);
state:= SEL(bSuccess, 100, 11);
ELSIF bGetAllDataValues_LLN0_ST THEN
bGetAllDataValues_LLN0_ST:= FALSE;
bSuccess:= fbConnection.GetAllDataValuesReq(ipLogicalNode:=fb[IEDName].IEDLD1.LLN0, eFc:=E_AcsiFc.ST_, hUser:=0, ipSink:=0, nInvokeID=>nInvokeID, ipResult=>ipResult);
state:= SEL(bSuccess, 100, 11);
ELSIF bGetDataValues_LLN0_ST_Beh THEN
bGetDataValues_LLN0_ST_Beh:= FALSE;
bSuccess:= fbConnection.GetDataValuesReq(ipData:=fb[IEDName].IEDLD1.LLN0.Beh, eFc:=E_AcsiFc.ST_, hUser:=0, ipSink:=0, nInvokeID=>nInvokeID, ipResult=>ipResult);
state:= SEL(bSuccess, 100, 11);
ELSE
state:= 0;
END_IF
11:
IF ipResult <> 0 THEN
ipResult.Execute();
IF NOT (bBusy:=ipResult.IsBusy()) THEN
state:= SEL(ipResult.IsCompleted(), 100, 0);
END_IF
END_IF
100:
state:= 0;
IF ipResult <> 0 THEN
nCmdError:= nCmdError + 1;
sLastErrorResult:= ipResult.Dump();
END_IF
END_CASE