Client - Report Control Blocks (Unbuffered, Buffered)

Dieses Beispiel zeigt die Verwendung der Berichtssteuerblockinstanzen für gepufferte und ungepufferte Reports (Unbuffered/Buffered Report Control Blocks: URCB, BRCB). Dazu gehört das Aktivieren und Deaktivieren von Reports oder das Aktivieren der Generalabfrage (GI).

Download TwinCAT XAE Project (*.zip): Sample03.zip

Das hier beschriebene Beispiel nutzt die Statemachine, welche in dem Kapitel „Allgemeine Client - Projektstruktur“ beschrieben ist. Die States: 0,1,11 und 100 sind identisch zu der dort beschriebenen Statemachine. Andere States wurden für das Beispiel modifiziert oder auch neue States hinzugefügt.

Die Report Control Blocks (RCBs) konfigurieren und steuern das Versenden der gepufferten oder ungepufferten Reportmeldungen. Die Konfiguration und Steuerung der Reports erfolgt über Schreib-/Lesezugriffe auf die entsprechenden Attributwerte eines Report Control Blocks. Einige Attributwerte konfigurieren z. B. den Inhalt der im Report enthaltenen Information, andere Attributwerte wiederum aktivieren oder deaktivieren das Versenden der Reports. Es ist also theoretisch möglich nur mithilfe der Client-Methoden: „GetDataValuesReq“ und „SetDataValuesReq“ einen RCB zu konfigurieren und zu steuern. Dies erfordert eine genauere Kenntnis der Funktionsweise der RCBs da nicht auf jedes Attribut zur jeder Zeit zugegriffen werden darf. Einige Attributwerte erlauben nur einen Lesezugriff, andere wiederum auch einen Schreibzugriff. Einige Attributwerte erlauben einen Schreibzugriff nur dann, wenn sich der RCB in einem bestimmten Zustand befindet. Die Befehle zur Generalabfrage (GI) dürfen nur ausgeführt werden, wenn sich der RCB im aktivierten Zustand befindet. Um die Handhabung zu vereinfachen, bietet die TwinCAT IEC 61850 Implementierung noch weitere Möglichkeiten die RCBs zu konfigurieren und zu steuern. Im Folgenden werden alle verfügbaren Möglichkeiten (Methoden) kurz beschrieben.

Grundsätzlich werden die RCB-Attribute mit Initialwerten, die in TwinCAT Telecontrol Configurator für TrgOps, OptFlds, IntgPd, RptID, DatSet usw. vorkonfiguriert wurden, nach dem Download des SPS-Programms (SPS läuft noch nicht oder kein Bootprojekt aktiv) initialisiert. Wenn die Konfiguration aus einer ICD-Datei stammt, dann übernimmt TwinCAT Telecontrol Configurator die Initialwerte aus der ICD-Datei. Die Client-Projekte sind so konstruiert, dass sie nach dem Start der SPS zuerst eine Verbindung zum Server aufbauen und dann alle Server-Daten in den Client einlesen. Danach befinden sich auf der Client-Seite die Datenwerte, die auch auf dem Server vorhanden sind. Wenn die Server-Daten von den Initialwerten auf der Client-Seite abweichen, dann werden sie mit den Server-Daten überschrieben. Dazu gehören auch die Attribute der RCBs. Das Einlesen aller Werte wird in den Client-Projekten über zwei booleschen Variablen gesteuert: „bGetAllServerValues“ und „_bReadAllData“. Wenn „_bReadAllData“ TRUE ist dann werden alle Server-Daten immer einmalig nach der Herstellung oder Wiederherstellung der Verbindung eingelesen. Über eine steigende Flanke an „bGetAllServerValues“ können auch zum beliebigen Zeitpunkt die Werte erneut eingelesen werden. Sind beide booleschen Variablen auf FALSE gesetzt, werden die Daten nicht abgeglichen. Dies hängt von der Applikation ab.
Grundsätzlich ist festzuhalten, dass es sinnvoll ist die Client-Daten mit dem Server nach dem Verbindungsaufbau abzugleichen. Die Initialwerte, die im TwinCAT Telecontrol Configurator konfiguriert wurden, sind aber nicht verloren. Die Applikation kann auf diese Werte weiterhin über die Config-Eigenschaften der Datenattribute zugreifen. Jedes Datenattribut besitzt eine Eigenschaft: eConfig oder iConfig oder nConfig, bConfig (abhängig vom Basistyp des Datenattributes) usw. mit dem ursprünglichen Initialwert. In diesem Beispielprojekt werden unter anderem auch Initialwerte, die im TwinCAT Telecontrol Configurator konfiguriert wurden bei der Konfiguration und Aktivierung der RCBs verwendet.

Die in diesem Beispiel verwendeten RCB-Instanzen hängen an der Instanz des Logischen-Knoten: LLN0. Dort befinden sich auch z.B. die vom TwinCAT Telecontrol Configurator exportierten Konfigurationswerte für Report-Triggeroptionen (TrgOps) oder optionalen Report-Datenfelder (OptFlds).

FUNCTION_BLOCK FB_LN_IED_LD1_LLN0 EXTENDS FB_AcsiCommonLogicalNodeClass
VAR_INPUT
    NamPlt: FB_DO_IED_LD1_LLN0_NamPlt := (sClass:='LPL', bLinkResult:=THIS^.AddDataToContainer(ipData:=NamPlt));
    Beh: FB_DO_IED_LD1_LLN0_Beh := (sClass:='ENS', bLinkResult:=THIS^.AddDataToContainer(ipData:=Beh));
    Health: FB_DO_IED_LD1_LLN0_Health := (sClass:='ENS', bLinkResult:=THIS^.AddDataToContainer(ipData:=Health));
    Mod_: FB_DO_IED_LD1_LLN0_Mod := (sObjectName:='Mod', sClass:='ENC', bLinkResult:=THIS^.AddDataToContainer(ipData:=Mod_));
    
    DS1: FB_DS_IED_LD1_LLN0_DS1 := (bLinkResult:=THIS^.AddDataSetToContainer(ipDataSet:=DS1));
    DS2: FB_DS_IED_LD1_LLN0_DS2 := (bLinkResult:=THIS^.AddDataSetToContainer(ipDataSet:=DS2));
    DS3: FB_DS_IED_LD1_LLN0_DS3 := (bLinkResult:=THIS^.AddDataSetToContainer(ipDataSet:=DS3));
    
    urcb101: FB_ScsmUrCBImplClass := (RptID:=(sValue:='IEDLD1/LLN0.urcb101'),
                                    DatSet:=(sValue:='IEDLD1/LLN0.DS1'),
                                    ConfRev:=(nValue:=1),
                                    OptFlds:=(SequenceNumber:=TRUE, ReportTimeStamp:=TRUE, ReasonForInclusion:=TRUE, DataSetName:=TRUE, DataReference:=TRUE, BufferOverflow:=FALSE, EntryID:=FALSE, ConfRevision:=TRUE),
                                    TrgOps:=(DataChange:=TRUE, QualityChange:=TRUE, DataUpdate:=FALSE, Integrity:=TRUE, GeneralInterrogation:=TRUE),
                                    IntgPd:=(nValue:=2000),
                                    bLinkResult:=THIS^.AddUnbufferedReportControlBlockToContainer(ipUnbufferedReportControlBlock:=urcb101));
    urcb201: FB_ScsmUrCBImplClass := (RptID:=(sValue:='IEDLD1/LLN0.urcb201'),
                                    DatSet:=(sValue:='IEDLD1/LLN0.DS2'), 
                                    ConfRev:=(nValue:=1),
                                    OptFlds:=(SequenceNumber:=TRUE, ReportTimeStamp:=TRUE, ReasonForInclusion:=TRUE, DataSetName:=TRUE, DataReference:=FALSE, BufferOverflow:=FALSE, EntryID:=FALSE, ConfRevision:=TRUE),
                                    TrgOps:=(DataChange:=TRUE, QualityChange:=TRUE, DataUpdate:=TRUE, Integrity:=TRUE, GeneralInterrogation:=TRUE),
                                    IntgPd:=(nValue:=5000),
                                    bLinkResult:=THIS^.AddUnbufferedReportControlBlockToContainer(ipUnbufferedReportControlBlock:=urcb201));
    urcb301: FB_ScsmUrCBImplClass := (RptID:=(sValue:='IEDLD1/LLN0.urcb301'),
                                    DatSet:=(sValue:='IEDLD1/LLN0.DS3'),
                                    ConfRev:=(nValue:=1), OptFlds:=(SequenceNumber:=TRUE, ReportTimeStamp:=TRUE, ReasonForInclusion:=TRUE, DataSetName:=TRUE, DataReference:=FALSE, BufferOverflow:=FALSE, EntryID:=FALSE, ConfRevision:=TRUE),
                                    TrgOps:=(DataChange:=TRUE, QualityChange:=TRUE, DataUpdate:=TRUE, Integrity:=TRUE, GeneralInterrogation:=TRUE),
                                    IntgPd:=(nValue:=5000),
                                    bLinkResult:=THIS^.AddUnbufferedReportControlBlockToContainer(ipUnbufferedReportControlBlock:=urcb301));
    brcb101: FB_ScsmBrCBImplClass := (RptID:=(sValue:='IEDLD1/LLN0.brcb101'),
                                    DatSet:=(sValue:='IEDLD1/LLN0.DS1'),
                                    ConfRev:=(nValue:=1),
                                    OptFlds:=(SequenceNumber:=TRUE, ReportTimeStamp:=TRUE, ReasonForInclusion:=TRUE, DataSetName:=TRUE, DataReference:=TRUE, BufferOverflow:=TRUE, EntryID:=TRUE, ConfRevision:=TRUE),
                                    TrgOps:=(DataChange:=TRUE, QualityChange:=TRUE, DataUpdate:=FALSE, Integrity:=TRUE, GeneralInterrogation:=TRUE),
                                    IntgPd:=(nValue:=2000),
                                    bLinkResult:=THIS^.AddBufferedReportControlBlockToContainer(ipBufferedReportControlBlock:=brcb101));
    brcb201: FB_ScsmBrCBImplClass := (RptID:=(sValue:='IEDLD1/LLN0.brcb201'),
                                    DatSet:=(sValue:='IEDLD1/LLN0.DS2'),
                                    ConfRev:=(nValue:=1), OptFlds:=(SequenceNumber:=TRUE, ReportTimeStamp:=TRUE, ReasonForInclusion:=TRUE, DataSetName:=TRUE, DataReference:=FALSE, BufferOverflow:=TRUE, EntryID:=TRUE, ConfRevision:=TRUE),
                                    TrgOps:=(DataChange:=TRUE, QualityChange:=TRUE, DataUpdate:=TRUE, Integrity:=TRUE, GeneralInterrogation:=TRUE),
                                    IntgPd:=(nValue:=5000),
                                    bLinkResult:=THIS^.AddBufferedReportControlBlockToContainer(ipBufferedReportControlBlock:=brcb201));
    brcb301: FB_ScsmBrCBImplClass := (RptID:=(sValue:='IEDLD1/LLN0.brcb301'),
                                    DatSet:=(sValue:='IEDLD1/LLN0.DS3'),
                                    ConfRev:=(nValue:=1),
                                    OptFlds:=(SequenceNumber:=TRUE, ReportTimeStamp:=TRUE, ReasonForInclusion:=TRUE, DataSetName:=TRUE, DataReference:=FALSE, BufferOverflow:=TRUE, EntryID:=TRUE, ConfRevision:=TRUE),
                                    TrgOps:=(DataChange:=TRUE, QualityChange:=TRUE, DataUpdate:=TRUE, Integrity:=TRUE, GeneralInterrogation:=TRUE),
                                    IntgPd:=(nValue:=5000),
                                    bLinkResult:=THIS^.AddBufferedReportControlBlockToContainer(ipBufferedReportControlBlock:=brcb301));
END_VAR
VAR
END_VAR

Report-Konfiguration/-Steuerung mit den Methoden: GetDataValuesReq, SetDataValuesReq

Dies sind die Basismethoden um die RCBs zu konfigurieren und zu steuern. Sie bieten die volle Kontrolle über das Verhalten des RCBs, erfordern aber genauere Kenntnis der Funktionsweise der RCBs und mehr Programmieraufwand. Sie müssen eventuell eine komplexere Zustandsmaschine selbst implementieren in der Sie mehrere Schreib-/Lesezugriffe auf diverse RCB-Attributwerte mit Hilfe dieser Methoden durchführen. Verwenden Sie diese Methoden z. B. dann, wenn Sie ein Verhalten benötigen, welches dem Standard nicht entspricht. In diesem Beispiel wird auf die Verwendung dieser Methoden zur Konfiguration und Steuerung der RCBs nicht weiter näher eingegangen. Folgende Schritte sind aber z. B. notwendig, um das Versenden der Reports eines ungepufferten RCBs zu aktivieren:

Folgende Schritte sind z. B. notwendig, um das Versenden der Reports eines ungepufferten RCBs zu deaktivieren:

Report-Konfiguration/-Steuerung mit den Methoden: GetUrCBValuesReq, SetUrCBValuesReq, GetBrCBValuesReq, SetBrCBValuesReq

Diese Methoden ermöglichen das Lesen aller oder das Schreiben eines oder mehreren Attributwerte mit einem einzigen Methodenaufruf. Die Methoden: „GetUrCBValuesReq“ oder “GetBrCBValuesReq“ lesen alle Attributwerte eines RCBs. In diesem Fall werden beim Erfolg alle Attributwerte eines RCBs vom Server zum Client übertragen und in das TwinCAT IEC 61850-Datenmodell kopiert.

Die Methoden: „SetUrCBValuesReq“ und „SetBrCBValuesReq“ erlauben das Schreiben von einem oder mehreren Attributwerten eines RCBs. Beim Aktivieren/Deaktivieren der Reports spielt die Reihenfolge, in der die Attributwerte geschrieben werden, eine wichtige Rolle. Die meisten RCB-Konfigurationswerte können nur geschrieben werden, wenn die Reports nicht aktiv sind. Bei ungepufferten Reports muss z. B. der Attributwert „Resv“ zuerst auf „TRUE“ gesetzt werden, bevor der Attributwert „RptEna“ auf „TRUE“ gesetzt werden kann (um die Reports zu aktivieren). Beim Deaktivieren der Reports müssen diese Attributwerte in der umgekehrten Reihenfolge auf „FALSE“ gesetzt werden. D.h. zuerst „RptEna“ und dann „Resv“. Der Set-Methodenparameter: „stSet“ bestimmt welche Attributwerte geschrieben werden sollen. Die neuen zu schreibenden Werte werden zuerst in das Datenmodell reingeschrieben, dann die entsprechenden Attribute über den „stSet“-Parameter ausgewählt und die Set-Methode aufgerufen. Beim Erfolg werden die Daten vom IEC 61850 Client-Datenmodell zum Server übertragen.

Report-Konfiguration/-Steuerung mit den Methoden des RCB-Client-Objekts

Die einfachste Art die gepufferten oder ungepufferten Reports zu konfigurieren und zu steuern ist die Verwendung des Client-Funktionsbausteins unterhalb der Berichtssteuerblockinstanz. Der Client-Funktionsbaustein besitzt Eigenschaften, um den RCB zu konfigurieren und Methoden, um die Übertragung der Reports zu aktivieren oder zu deaktivieren. Im Bild unten zeigt z. B. das IntelliSense die verfügbaren Methoden und Eigenschaften bei einem gepufferten RCB:

Client - Report Control Blocks (Unbuffered, Buffered) 1:

Einige Methoden und Eigenschaften beim ungepufferten RCB:

Client - Report Control Blocks (Unbuffered, Buffered) 2:

Folgende Tabelle listet die wichtigsten Methoden und Eigenschaften des Client-Funktionsbausteins an der Berichtssteuerblockinstanz. Der Client-Funktionsbaustein arbeitet, wenn nicht anders konfiguriert mit vordefinierten Standardwerten für Triggeroptionen, optionalen Datenfeldern und max. Zeit zwischen den Integrity Reports. Die Standardwerte können durch Beschreiben der entsprechenden Eigenschaften bei jeder Client-Instanz individuell geändert werden. Die neuen Werte werden vor dem Aktivieren des Reports, wenn sie sich von den der Server-Seite unterscheiden, zuerst zum Server übertragen und erst dann wird der Report aktiviert.

Methode/Eigenschaft

Beschreibung

Initialwert

EnableReq

Aktiviert das Versenden der Reports

-

DisableReq

Deaktiviert (stoppt) das Versenden der Reports

-

GIReq

Aktiviert den Befehl zur Generalabfrage

-

PurgeBufReq (nur bei gepufferten RCBs)

Aktiviert den Befehl zum Zurücksetzen des Puffers

-

ResyncReq (nur bei gepufferten RCBs)

Aktiviert den Befehl zur Resynchronisation der gepufferten Daten

-

Clear

Setzt den Funktionsbaustein zurück

-

cOptFlds

Konfiguriert die im Report enthaltenen Datenfelder

Ungepufferte RCBs: Alle Datenfelder aktiviert außer der „DataReference“, „BufferOverflow“ und „EntryID“.

Gepufferte RCBs: Alle Datenfelder aktiviert außer der „DataReference“

cTrgOps

Konfiguriert die Triggeroptionen für einen Report

Alle aktiviert („DataUpdate“, „DataChange“, „QualityChange“, „GeneralInterrogation“, „Integrity“)

iResvTms

OPTIONAL: Konfiguriert die Zeit für die Reservierung des RCBs für einen bestimmten Client.

60 falls vorhanden

nBufTm

Max. Report-Pufferzeit in Millisekunden

0

nIntgPd

Max. Zeit zwischen den Integrity-Reports in Millisekunden

5000

sRptID

Report-ID

Leerstring. Ein neuer Wert, wenn gesetzt, wird nur dann zum Server übertragen, wenn er kein Leerstring ist und wenn er sich von dem aktuellen Serverwert unterscheidet.

Beim Aktivieren einer Methode wird intern zuerst der aktuelle Status des RCBs vom Server abgefragt. Als nächstes werden dann, abhängig von der ausgewählten Methode, einige Eigenschaften zum Server übertragen. Die eingestellten Werte der Eigenschaften werden zum Server nur dann übertragen, wenn sich der Wert in der Eigenschaft zu dem jeweiligen Wert des entsprechenden Attributes im Datenmodel unterscheidet. Zum Schluss werden intern die Statusinformationen erneut vom Server abgefragt. Einige Methoden benötigen weitere Parameter. Die Methode „EnableReq“ benötigt z. B. den Schnittstellenzeiger auf die Verbindungsinstanz und das DataSet.

Der Client-Funktionsbaustein besitzt eine strukturierte Ausgangsvariable mit dem Namen: „stInfo“. Diese Variable enthält RCB-Statusinformationen und Informationen über den zuletzt empfangenen Report. Diese Statusinformationen werden aber nur dann aktualisiert wenn auch der Client-Funktionsbaustein zur Konfiguration und Aktivierung der Reports verwendet wurde. Der Client-Funktionsbaustein aktualisiert seine Statusinformationen nicht wenn die anderen, oben beschriebenen Methoden (SetUrCBValuesReq, SetBrCBValuesReq oder SetDataValuesReq, usw.) zur Konfiguration oder Aktivierung der Reports verwendet werden.

Client - Report Control Blocks (Unbuffered, Buffered) 3:

Im Online-Mode können die Statusinformationen des Client-Funktionsbausteins zur einfachen Diagnose verwendet werden.

Parameterliste zur Konfiguration der Standardwerte des RCB-Client-Objekts

Die Standardwerte aller Client-Instanzen können systemweit, falls es nötig ist durch Änderung in der Parameterliste: Param_Scsm (in der Tc3_iec61850_8_1 SPS-Bibliothek) geändert werden.

VAR_GLOBAL CONSTANT
   cBrCB_OptFlds   : ST_AcsiOptionalFields:=(SequenceNumber:=1, ReportTimeStamp:=1, ReasonForInclusion:=1, DataSetName:=1, DataReference:=0, BufferOverflow:=1, EntryID:=1, ConfRevision:=1, Segmentation:=0);
   cBrCB_TrgOps    : ST_AcsiTriggerConditions:=(DataChange:=1, QualityChange:=1, DataUpdate:=1, Integrity:=1, GeneralInterrogation:=1);
   cBrCB_IntgPd    : DWORD:=5000;

   cUrCB_OptFlds   : ST_AcsiOptionalFields:=(SequenceNumber:=1, ReportTimeStamp:=1, ReasonForInclusion:=1, DataSetName:=1, DataReference:=0, BufferOverflow:=0, EntryID:=0, ConfRevision:=1, Segmentation:=0);
   cUrCB_TrgOps    : ST_AcsiTriggerConditions:=(DataChange:=1, QualityChange:=1, DataUpdate:=1, Integrity:=1, GeneralInterrogation:=1);
   cUrCB_IntgPd    : DWORD:=5000;
   cBrCB_iResvTms  : INT(-1..3600):=60;
END_VAR

Beispielprojekt

Der ungepufferte „urcb101“ und der gepufferte RCB „brcb101“ kann im Beispielprojekt auf zwei Arten gesteuert werden. Einmal mit Hilfe der Methoden: „GetUrCBValuesReq“, „GetBrCBValuesReq“, „SetUrCBValuesReq“ und „SetBrCBValuesReq“. Bei der anderen Möglichkeit handelt es sich um die Methoden am Client-Funktionsbaustein unterhalb der Berichtssteuerblockinstanz. Die weiter unten beschriebenen booleschen und Enum-Variablen finden Sie in der Implementierung des Funktionsbausteins: „FB_IEDClient“. Im Projektarchiv befindet sich auch eine ICD-Datei. Diese Datei beschreibt das im Beispielprojekt verwendete IEC 61850 Datenmodel. Sie können diese Datei z. B. in einer Drittherstellersoftware verwenden und einen Server simulieren.

Test mit Get-/Set-Methoden

Eine steigende Flanke an der booleschen Variablen: „bGetUrCBValues_urcb101“ oder „bGetBrCBValues_brcb101“ aktiviert das Lesen aller Attributwerte des RCB: „urcb101“ bzw. „brcb101“. Durch eine Wertänderung an der Aufzählungsvariablen „eSetUrCBValues_urcb101_Resv“ und „eSetUrCBValues_urcb101_RptEna“ oder „eSetBrCBValues_brcb101_RptEna“ kann der boolesche Wert der Datenattribute „Resv“ oder „RptEna“ auf „True“ oder „False“ gesetzt werden. Im Idealfall, wenn alle anderen RCB-Attributwerte bereits vorkonfiguriert und diese Werte sich bereits auf der Serverseite befinden, kann der RCB: „urcb101“ auf folgende Weise aktiviert werden:
Der Wert „Enable“ geschrieben in die Variable: „eSetUrCBValues_urcb101_Resv“ beschreibt das Attribut: „Resv“ mit dem Wert „TRUE“. Der Wert „Enable“ geschrieben in die Variable: „eSetUrCBValues_urcb101_RptEna“ beschreibt das Attribut: „RptEna“ mit dem Wert „TRUE“. Danach ist die Übertragung der ungepufferten Reports von „urcb101“ aktiviert.

Der RCB: „brcb101“ kann auf folgende Weise aktiviert werden:
Der Wert „Enable“ geschrieben in die Variablen: „eSetBrCBValues_brcb101_RptEna“ beschreibt das Attribut: „RptEna“ mit dem Wert „TRUE“. Danach ist die Übertragung der gepufferten Reports von „brcb101“ aktiviert.


     (*===================================================================================================================================*)
     (* Write "IEDLD1/LLN0.urcb101.Resv" data attribute value: True|False *)
     ELSIF eSetUrCBValues_urcb101_Resv <> E_CtlBool.None THEN (* Example => execute SetUrCBValuesReq() command *)
         memset(ADR(stSet_urcb), 0, SIZEOF(stSet_urcb)); (* Clear all URCB attribute selection flags *)
         stSet_urcb.Resv:= TRUE; (* Select URCB->Resv attribute to be written *)
         fbIED.IEDLD1.LLN0.urcb101.Resv.bValue:= SEL(eSetUrCBValues_urcb101_Resv = E_CtlBool.Enable, FALSE, TRUE); (* Set new data attribute value to be written *)
         bSuccess:= fbConnection.SetUrCBValuesReq(ipUrCB:=fbIED.IEDLD1.LLN0.urcb101, stSet:=stSet_urcb, hUser:=0, ipSink:=0, nInvokeID=>nInvokeID, ipResult=>ipResult); (* Activation of command execution *)
         state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
         eSetUrCBValues_urcb101_Resv:= E_CtlBool.None; (* Reset enum value to recognize next write request *)

     (*===================================================================================================================================*)
     (* Write "IEDLD1/LLN0.urcb101.RptEna" data attribute value: True|False *)
     ELSIF eSetUrCBValues_urcb101_RptEna <> E_CtlBool.None THEN (* Example => execute SetUrCBValuesReq() command *)
         memset(ADR(stSet_urcb), 0, SIZEOF(stSet_urcb)); (* Clear all URCB attribute selection flags *)
         stSet_urcb.RptEna:= TRUE; (* Select URCB->RptEna attribute to be written *)
         fbIED.IEDLD1.LLN0.urcb101.RptEna.bValue:= SEL(eSetUrCBValues_urcb101_RptEna = E_CtlBool.Enable, FALSE, TRUE); (* Set new data attribute value to be written *)
         bSuccess:= fbConnection.SetUrCBValuesReq(ipUrCB:=fbIED.IEDLD1.LLN0.urcb101, stSet:=stSet_urcb, hUser:=0, ipSink:=0, nInvokeID=>nInvokeID, ipResult=>ipResult); (* Activation of command execution *)
         state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
         eSetUrCBValues_urcb101_RptEna:= E_CtlBool.None; (* Reset enum value to recognize next write request *)



     (*==================================================================================================================================*)
     (* Write "IEDLD1/LLN0.brcb101.RptEna" data attribute value *)
     ELSIF eSetBrCBValues_brcb101_RptEna <> E_CtlBool.None THEN (* Example => execute SetBrCBValuesReq() command *)
         memset(ADR(stSet_brcb), 0, SIZEOF(stSet_brcb)); (* Clear all BRCB attribute selection flags *)
         stSet_brcb.RptEna:= TRUE; (* Select BRCB->RptEna attribute to be written *)
         fbIED.IEDLD1.LLN0.brcb101.RptEna.bValue:= SEL(eSetBrCBValues_brcb101_RptEna = E_CtlBool.Enable, FALSE, TRUE); (* Set new data attribute value to be written *)
         bSuccess:= fbConnection.SetBrCBValuesReq(ipBrCB:=fbIED.IEDLD1.LLN0.brcb101, stSet:=stSet_brcb, hUser:=0, ipSink:=0, nInvokeID=>nInvokeID, ipResult=>ipResult); (* Activation of command execution *)
         state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
         eSetBrCBValues_brcb101_RptEna:= E_CtlBool.None; (* Reset enum value to recognize next write request *)

Um die Übertragung der ungepufferten Reports zu stoppen, muss zuerst der Wert „Disable“ in die Variable: „eSetUrCBValues_urcb101_RptEna“ und dann in die Variable: „eSetUrCBValues_urcb101_Resv“ geschrieben werden. Dies setzt die Werte der Datenattribute „RptEna“ und „Resv“ auf FALSE.

Um die Übertragung der gepufferten Reports zu stoppen, muss der Wert „Disable“ in die Variable „eSetBrCBValues_brcb101_RptEna“ geschrieben werden. Dies setzt den Wert des Datenattributes „RptEna“ auf FALSE.

Test mit Client-Methoden an der Berichtssteuerblockinstanz

Um sämtliche Zustände eines RCBs zu berücksichtigen, wird hier ein Enum zur Aktivierung von „urcb101“ bzw. „brcb101“ Steuerbefehlen verwendet. Sobald das Enum „eControl_IEDLD1_LLN0_urcb101“ oder „eControl_IEDLD1_LLN0_brcb101“ nicht „E_AcsiCtlReport.None“ ist, wird der entsprechende Befehl am RCB aktiviert.

Anhand des „ipResult“-Ausgangs des Funktionsbausteins kann der Zustand der Abarbeitung des letzten Befehls abgefragt werden. Da die Abarbeitung der Methoden länger als einen Zyklus benötigt, wird die Statemachine in den State 11 versetzt. Dort muss die Methode „Execute“ des Schnittstellenzeigers „ipResult“ so lange aufgerufen werden bis „ipResult.IsBusy()“ den Wert „FALSE“ liefert. Falls dieser sich in der Bearbeitung der Funktionalität befindet, wird „IsBusy()“ als „TRUE“ zurückgegeben und die Statemachine des verweilt weiterhin im State 11. Sobald der Befehl erfolgreich abgearbeitet wurde, wird die Statemachine in den State 0 versetzt. Die Instanzen „urcb101“ und „brcb101“ werden in diesem Beispiel mit den Werten für „TrgOps“, „OptFlds“ und „IntgPd“ aktiviert, die im TwinCAT Telecontrol Configurator konfiguriert wurden.


(*=======================================================================================================================================*)
(* Control unbuffered reports using "IEDLD1/LLN0.urcb101.Client" function block instance *)
ELSIF eControl_IEDLD1_LLN0_urcb101 <> E_AcsiCtlReport.None THEN
    IF eControl_IEDLD1_LLN0_urcb101 = E_AcsiCtlReport.Enable THEN (* Example => enable reporting *)
        
        (* Changing default properties of "Client" function block configures reporting behaviour and content of report message data.
           The "Client" function block writes the new property values to the server and enables RCB.
           In this example we use configuration values that were defined in the TwinCAT Telecontrol Configurator to control "urcb101".*)
        
        (* Configures "RptID" (report ID) to be used in report message *)
        fbIED.IEDLD1.LLN0.urcb101.Client.sRptID:= fbIED.IEDLD1.LLN0.urcb101.RptID.sConfig;(* => "IEDLD1/.LLN0.urcb101" *)
        
        (* Configures "TrgOps" (trigger options) to be used to trigger new report messages *)
        fbIED.IEDLD1.LLN0.urcb101.Client.cTrgOps:= fbIED.IEDLD1.LLN0.urcb101.TrgOps.cConfig;(* => All enabled except "DataUpdate" *)
        
        (* Configures "OptFlds" (optional fields) to be used in report message *)
        fbIED.IEDLD1.LLN0.urcb101.Client.cOptFlds:= fbIED.IEDLD1.LLN0.urcb101.OptFlds.cConfig;(* => All enabled except "BufferOverflow" and "EntryID" *)
        
        (* Configures "IntgPd" (period in milliseconds used to generate integrity report) *)
        fbIED.IEDLD1.LLN0.urcb101.Client.nIntgPd:= fbIED.IEDLD1.LLN0.urcb101.IntgPd.nConfig;(* => 2000ms *)
        
        (* Configures "BufTm" (max. report message buffer time in milliseconds) *)
        fbIED.IEDLD1.LLN0.urcb101.Client.nBufTm:= fbIED.IEDLD1.LLN0.urcb101.BufTm.nConfig;(* => 0ms *)
        
        (* Write properties and enable RCB *)
        bSuccess:= fbIED.IEDLD1.LLN0.urcb101.Client.EnableReq(ipClient:=fbConnection, ipDataSet:=fbIED.IEDLD1.LLN0.DS1, ipResult=>ipResult); (* Activation of command execution *)
        state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_urcb101 = E_AcsiCtlReport.Disable THEN (* Example => disable reporting *)
        bSuccess:= fbIED.IEDLD1.LLN0.urcb101.Client.DisableReq(ipResult=>ipResult); (* Activation of command execution *)
        state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_urcb101 = E_AcsiCtlReport.GI THEN (* Example => execute general interrogation *)
        bSuccess:= fbIED.IEDLD1.LLN0.urcb101.Client.GIReq(ipResult=>ipResult); (* Activation of command execution *)
        state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    END_IF
    eControl_IEDLD1_LLN0_urcb101:= E_AcsiCtlReport.None; (* Reset enum value to recognize next write request *)


(*=======================================================================================================================================*)
(* Control buffered reports using "IEDLD1/LLN0.brcb101.Client" function block instance *)
ELSIF eControl_IEDLD1_LLN0_brcb101 <> E_AcsiCtlReport.None THEN
    IF eControl_IEDLD1_LLN0_brcb101 = E_AcsiCtlReport.Enable THEN (* Example => enable reporting using *)
        (*
          Changing default properties of "Client" function block configures reporting behaviour and content of report message data.
          The "Client" function block writes the new property values to the server and enables RCB.
          In this example we use configuration values that were defined in the TwinCAT Telecontrol Configurator to control "brcb101".
        *)
        
        (* Configures "RptID" to be used in report message *)
        fbIED.IEDLD1.LLN0.brcb101.Client.sRptID:= fbIED.IEDLD1.LLN0.brcb101.RptID.sConfig;(* => "IEDLD1/LLN0.brcb101" *)
        
        (* Configures "TrgOps" (trigger options) to be used to trigger new report messages *)
        fbIED.IEDLD1.LLN0.brcb101.Client.cTrgOps:= fbIED.IEDLD1.LLN0.brcb101.TrgOps.cConfig;(* => All enabled except "DataUpdate" *)
        
        (* Configures "OptFlds" (option fields) to be used in report message *)
        fbIED.IEDLD1.LLN0.brcb101.Client.cOptFlds:= fbIED.IEDLD1.LLN0.brcb101.OptFlds.cConfig;(* => All enabled *)
        
        (* Configures "IntgPd" (period in milliseconds used to generate integrity report) *)
        fbIED.IEDLD1.LLN0.brcb101.Client.nIntgPd:= fbIED.IEDLD1.LLN0.brcb101.IntgPd.nConfig;(* => 2000ms *)
        
        (* Configures "BufTm" (max. report message buffer time in milliseconds) *)
        fbIED.IEDLD1.LLN0.brcb101.Client.nBufTm:= fbIED.IEDLD1.LLN0.brcb101.BufTm.nConfig;(* => 0ms *)
        
        (* Write properties and enable RCB *)
        bSuccess:= fbIED.IEDLD1.LLN0.brcb101.Client.EnableReq(ipClient:=fbConnection, ipDataSet:=fbIED.IEDLD1.LLN0.DS1, ipResult=>ipResult); (* Activation of command execution *)
        state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb101 = E_AcsiCtlReport.Disable THEN (* Example => disable reporting *)
        bSuccess:= fbIED.IEDLD1.LLN0.brcb101.Client.DisableReq(ipResult=>ipResult); (* Activation of command execution *)
        state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb101 = E_AcsiCtlReport.GI THEN (* Example => execute general interrogation *)
        bSuccess:= fbIED.IEDLD1.LLN0.brcb101.Client.GIreq(ipResult=>ipResult); (* Activation of command execution *)
        state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb101 = E_AcsiCtlReport.PurgeBuf THEN (* Example => execute purge buffer *)
        bSuccess:= fbIED.IEDLD1.LLN0.brcb101.Client.PurgeBufReq(ipClient:=fbConnection, ipResult=>ipResult); (* Activation of command execution *)
        state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb101 = E_AcsiCtlReport.Resync THEN (* Example => execute resync *)
        bSuccess:= fbIED.IEDLD1.LLN0.brcb101.Client.ResyncReq(ipClient:=fbConnection, nEntryID:=Last_Rx_brcb101_nEntryID, ipResult=>ipResult); (* Activation of command execution *)
        state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    END_IF
    eControl_IEDLD1_LLN0_brcb101:= E_AcsiCtlReport.None;(* Reset enum value to recognize next write request *)

Zu Demonstrationszwecken werden die Instanzen „urcb201“ und „brcb201“ dagegen nicht mit den im TwinCAT Telecontrol Configurator konfigurierten und exportierten Werten für „TrgOps“, „OptFlds“, „IntgPd“ usw. aktiviert. Stattdessen werden bei der Aktivierung des Reports die Standardwerte der „Client“-Instanz verwendet.


(*=======================================================================================================================================*)
(* Control unbuffered reports using "IEDLD1/LLN0.urcb201.Client" function block instance *)
ELSIF eControl_IEDLD1_LLN0_urcb201 <> E_AcsiCtlReport.None THEN
    IF eControl_IEDLD1_LLN0_urcb201 = E_AcsiCtlReport.Enable THEN (* Example => enable reporting *)
       (*
         Changing default properties of "Client" function block configures reporting behaviour and content of report message data (optional).
         The "Client" function block writes the new property values to the server and enables RCB.
         In this example we use the standard configuration values ​​of the function block "Client" to control the "urcb201":
         "fbIED.IEDLD1.LLN0.urcb201.Client.sRptID":= Empty string. Property "sRptID" is written if <> '' and differs from server value.
         "fbIED.IEDLD1.LLN0.urcb201.Client.cTrgOps":= All trigger options are enabled
         "fbIED.IEDLD1.LLN0.urcb201.Client.cOptFlds":= All options are enabled except "DataReference", "BufferOverflow" and "EntryID"
         "fbIED.IEDLD1.LLN0.urcb201.Client.nIntgPd":= Set to 5000ms
         "fbIED.IEDLD1.LLN0.urcb201.Client.nBufTm":= Set to 0ms
        *)
       (* Write properties and enable RCB *)
        bSuccess:= fbIED.IEDLD1.LLN0.urcb201.Client.EnableReq(ipClient:=fbConnection, ipDataSet:=fbIED.IEDLD1.LLN0.DS2, ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_urcb201 = E_AcsiCtlReport.Disable THEN (* Example => disable reporting *)
       bSuccess:= fbIED.IEDLD1.LLN0.urcb201.Client.DisableReq(ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_urcb201 = E_AcsiCtlReport.GI THEN (* Example => execute general interrogation *)
       bSuccess:= fbIED.IEDLD1.LLN0.urcb201.Client.GIReq(ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    END_IF
    eControl_IEDLD1_LLN0_urcb201:= E_AcsiCtlReport.None; (* Reset enum value to recognize next write request *)


(*=======================================================================================================================================*)
(* Control buffered reports using "IEDLD1/LLN0.brcb201.Client" function block instance *)
ELSIF eControl_IEDLD1_LLN0_brcb201 <> E_AcsiCtlReport.None THEN
    IF eControl_IEDLD1_LLN0_brcb201 = E_AcsiCtlReport.Enable THEN (* Example => enable reporting *)
        
       (*
         Changing default properties of "Client" function block configures reporting behaviour and content of report message data (optional).
         The "Client" function block writes the new property values to the server and enables RCB.
         In this example we use the standard configuration values ​​of the function block "Client" to control the "brcb201":
         "fbIED.IEDLD1.LLN0.brcb201.Client.sRptID":= Empty string. Property "sRptID" is only written if <> '' and differs from server value
         "fbIED.IEDLD1.LLN0.brcb201.Client.cTrgOps":= All trigger options are enabled
         "fbIED.IEDLD1.LLN0.brcb201.Client.cOptFlds":= All options are enabled except "DataReference"
         "fbIED.IEDLD1.LLN0.brcb201.Client.nIntgPd":= Set to 5000ms
         "fbIED.IEDLD1.LLN0.brcb201.Client.nBufTm":= Set to 0ms
       *)
        
       (* Write properties and enable RCB *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb201.Client.EnableReq(ipClient:=fbConnection, ipDataSet:=fbIED.IEDLD1.LLN0.DS2, ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb201 = E_AcsiCtlReport.Disable THEN (* Example => disable reporting *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb201.Client.DisableReq(ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb201 = E_AcsiCtlReport.GI THEN (* Example => execute general interrogation *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb201.Client.GIreq(ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb201 = E_AcsiCtlReport.PurgeBuf THEN (* Example => execute purge buffer *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb201.Client.PurgeBufReq(ipClient:=fbConnection, ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb201 = E_AcsiCtlReport.Resync THEN (* Example => execute resync *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb201.Client.ResyncReq(ipClient:=fbConnection, nEntryID:=Last_Rx_brcb201_nEntryID, ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    END_IF
    eControl_IEDLD1_LLN0_brcb201:= E_AcsiCtlReport.None; (* Reset enum value to recognize next write request *)

Die Instanzen „urcb301“ und „brcb301“ werden wiederum mit benutzerdefinierten Werten für „TrgOps“, „OptFlds“ und „IntgPd“ aktiviert.


(*=======================================================================================================================================*)
(* Control unbuffered reports using "IEDLD1/LLN0.urcb301.Client" function block instance *)
ELSIF eControl_IEDLD1_LLN0_urcb301 <> E_AcsiCtlReport.None THEN
    IF eControl_IEDLD1_LLN0_urcb301 = E_AcsiCtlReport.Enable THEN (* Example => enable reporting *)
        
       (*
         Changing default properties of "Client" function block configures reporting behaviour and content of report message data.
         The "Client" function block writes the new property values to the server and enables RCB.
         In this example we use configuration values that were defined by application/user to control the "urcb301".
       *)
        
       (* Configures "RptID" (report ID) to be used in report message *)
        fbIED.IEDLD1.LLN0.urcb301.Client.sRptID:= 'IEDLD1/LLN0.RP.urcb301';
        
       (* Configures "TrgOps" (trigger options) to be used to trigger new report messages *)
       usrTrgOps.DataChange:= TRUE;
       usrTrgOps.DataUpdate:= FALSE;
       usrTrgOps.QualityChange:= FALSE;
       usrTrgOps.Integrity:= TRUE;
       usrTrgOps.GeneralInterrogation:= TRUE;
       fbIED.IEDLD1.LLN0.urcb301.Client.cTrgOps:= usrTrgOps;
        
       (* Configures "OptFlds" (option fields) to be used in report message *)
       usrOptFlds.ConfRevision:= TRUE;
       usrOptFlds.DataReference:= FALSE;
       usrOptFlds.DataSetName:= FALSE;
       usrOptFlds.ReasonForInclusion:= TRUE;
       usrOptFlds.ReportTimeStamp:= FALSE;
       usrOptFlds.SequenceNumber:= TRUE;
       usrOptFlds.BufferOverflow:= FALSE;
       usrOptFlds.EntryID:= FALSE;
       fbIED.IEDLD1.LLN0.urcb301.Client.cOptFlds:= usrOptFlds;
        
       (* Configures "IntgPd" (period in milliseconds used to generate integrity report) *)
       fbIED.IEDLD1.LLN0.urcb301.Client.nIntgPd:= 1000;
        
       (* Configures "BufTm" (max. report message buffer time in milliseconds) *)
       fbIED.IEDLD1.LLN0.urcb301.Client.nBufTm:= 500;
        
       (* Write properties and enable RCB *)
       bSuccess:= fbIED.IEDLD1.LLN0.urcb301.Client.EnableReq(ipClient:=fbConnection, ipDataSet:=fbIED.IEDLD1.LLN0.DS3, ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_urcb301 = E_AcsiCtlReport.Disable THEN (* Example => disable reporting *)
       bSuccess:= fbIED.IEDLD1.LLN0.urcb301.Client.DisableReq(ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_urcb301 = E_AcsiCtlReport.GI THEN (* Example => execute general interrogation *)
       bSuccess:= fbIED.IEDLD1.LLN0.urcb301.Client.GIReq(ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    END_IF
    eControl_IEDLD1_LLN0_urcb301:= E_AcsiCtlReport.None; (* Reset enum value to recognize next write request *)


(*=======================================================================================================================================*)
(* Control buffered reports using "IEDLD1/LLN0.brcb301.Client" function block instance *)
ELSIF eControl_IEDLD1_LLN0_brcb301 <> E_AcsiCtlReport.None THEN
    IF eControl_IEDLD1_LLN0_brcb301 = E_AcsiCtlReport.Enable THEN (* Example => enable reporting using *)
        
       (*
         Changing default properties of "Client" function block configures reporting behaviour and content of report message data.
         The "Client" function block writes the new property values to the server and enables RCB.
         In this example we use configuration values that were defined by application/user to control the "brcb301".
        *)
        
       (* Configures "RptID" (report ID) to be used in report message *)
       fbIED.IEDLD1.LLN0.brcb301.Client.sRptID:= 'IEDLD1/LLN0.BR.brcb301';
        
       (* Configures "TrgOps" (trigger options) to be used to trigger new report messages *)
       usrTrgOps.DataChange:= TRUE;
       usrTrgOps.DataUpdate:= FALSE;
       usrTrgOps.QualityChange:= FALSE;
       usrTrgOps.Integrity:= TRUE;
       usrTrgOps.GeneralInterrogation:= TRUE;
       fbIED.IEDLD1.LLN0.brcb301.Client.cTrgOps:= usrTrgOps;
        
       (* Configures "OptFlds" (option fields) to be used in report message *)
       usrOptFlds.ConfRevision:= TRUE;
       usrOptFlds.DataReference:= FALSE;
       usrOptFlds.DataSetName:= FALSE;
       usrOptFlds.ReasonForInclusion:= TRUE;
       usrOptFlds.ReportTimeStamp:= FALSE;
       usrOptFlds.SequenceNumber:= TRUE;
       usrOptFlds.BufferOverflow:= TRUE;
       usrOptFlds.EntryID:= TRUE;
       fbIED.IEDLD1.LLN0.brcb301.Client.cOptFlds:= usrOptFlds;

       (* Configures "IntgPd" (period in milliseconds used to generate integrity report) *)
       fbIED.IEDLD1.LLN0.brcb301.Client.nIntgPd:= 10000;

       (* Configures "BufTm" (max. report message buffer time in milliseconds) *)
       fbIED.IEDLD1.LLN0.brcb301.Client.nBufTm:= 500;

       (* Write properties and enable RCB *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb301.Client.EnableReq(ipClient:=fbConnection, ipDataSet:=fbIED.IEDLD1.LLN0.DS3, ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb301 = E_AcsiCtlReport.Disable THEN (* Example => disable reporting *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb301.Client.DisableReq(ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb301 = E_AcsiCtlReport.GI THEN (* Example => execute general interrogation *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb301.Client.GIreq(ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb301 = E_AcsiCtlReport.PurgeBuf THEN (* Example => execute purge buffer *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb301.Client.PurgeBufReq(ipClient:=fbConnection, ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    ELSIF eControl_IEDLD1_LLN0_brcb301 = E_AcsiCtlReport.Resync THEN (* Example => execute resync *)
       bSuccess:= fbIED.IEDLD1.LLN0.brcb301.Client.ResyncReq(ipClient:=fbConnection, nEntryID:=Last_Rx_brcb301_nEntryID, ipResult=>ipResult); (* Activation of command execution *)
       state:= SEL(bSuccess, 100, 11); (* If command activation succeeded then wait for command completion else report an error *)
    END_IF
    eControl_IEDLD1_LLN0_brcb301:= E_AcsiCtlReport.None; (* Reset enum value to recognize next write request *)

Client - Report Control Blocks (Unbuffered, Buffered) 4:

Dies ist nur eine exemplarische Implementierung der Report Control Block-Funktionalität in der TwinCAT SPS.