FB_[IEDName]Client

Dieser Baustein beinhaltet eine Statemachine, von der die grundlegenden Zustände in jedem Client-Beispiel genutzt werden.

Die Bausteininstanz wird für das Verbindungsmanagement und den Datenaustausch benötigt.

Vollständige Beschreibung

Syntax

Deklaration:

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