SV-Publisher/-Subscriber nach UCA 61850-9-2 Light Edition - Übertragung abgetasteter Messwerte

Dieses Beispiel zeigt die TwinCAT IEC 61850 Implementierung der Übertragung von abgetasteten digitalisierten Messwerten mit Hilfe der SV-Nachrichten (Sampled-Value Messages) nach UCA (Utility Communications Architecture) 61850-9-2LE (Light Edition) [1].

Die Light Edition (9-2LE) ist kein Standard, sondern ein technischer Implementierungsleifaden für den digitalen Datenaustausch. Dieser Leitfaden soll die Interoperabilität zwischen Geräten verschiedener Hersteller sicherstellen und definiert eine Teilmenge der IEC 61850-9-2 Norm. Die Implementierung dieser Teilmenge soll zur schnelleren Markteinführung des Standards beitragen.

Systemvoraussetzung

TwinCAT TF6510 IEC 61850 Telecontrol v3.3.99.0 oder höher.

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

Referenzen

[1] IEC 61850-9-2LE (Light Edition) Implementation Guideline for Digital Interface to Instrument Transformers using IEC 61850-9-2, UCA International Users Group, www.ucaiug.org.

Allgemeine Information zu diesem Beispielprojekt

Beim 9-2LE handelt es sich um ein UCA-Profil, bei dem der Datensatz (ASDU) der SV-Nachricht (APDU) auf maximal 4 Spannungswerte und 4 Stromwerte begrenzt ist (4 Ströme und 4 Spannungen der Phase A, B, C und des Neutralleiters (N)). Jede ASDU enthält die 4 dreiphasigen Strom- und Spannungsmesswerte. Eine SV-Nachricht (APDU) kann entweder 1 oder 8 Datensätze (ASDUs) enthalten. Zu jedem Strom- und Spannungs-Messwert wird in der ASDU auch die Quality-Information mit übertragen. Bild unten zeigt eine vereinfachte Darstellung der SV-Nachricht innerhalb eines Ethernet-Frames.

SV-Publisher/-Subscriber nach UCA 61850-9-2 Light Edition - Übertragung abgetasteter Messwerte 1:

Das Beispiel besteht aus zwei separaten TwinCAT IEC 61850 Projekten. Nach dem Auspacken des Zip-Archives finden Sie im Unterordner |Sample14|Publisher ein TwinCAT IEC 61850 Server (SV-Publisher) und im Unterordner |Sample14|Subscriber ein TwinCAT IEC 61850 Client (SV-Subscriber) Projekt. Beide Projekte sind aufeinander abgestimmt.

Die IP-Adresse des Servers muss im Code der beiden Projekte angepasst werden. Der Client wird zum Server eine Verbindung aufbauen, wenn Sie die Projekte auf zwei per LAN verbundene TwinCAT-Zielsysteme runterladen, aktivieren und starten. Für die SV-Übertragung ist die Konfiguration der IP-Adresse und das Vorhandensein der Client-Server-Verbindung aber nicht zwingend notwendig. Die SV-Kommunikation erfolgt mittels eines Publisher/Subscriber-Modells. Der SV-Kommunikations-Stack ist für maximale Geschwindigkeit direkt auf die Data-Link-Schicht (Layer 2) abgebildet.

Im Projektbaum unter dem Zweig I/O-Device finden Sie eine Netzwerkadapterinstanz mit dem Namen „GSE (RT-Ethernet Adapter)“. Diese Adapterinstanz muss entsprechend konfiguriert werden, d.h. die I/O-Konfiguration muss an die vorhandene Hardware und auf die Zielplattform, auf der das Projekt laufen soll, angepasst werden. Eine erneute I/O-Konfiguration ist auch dann nötig, wenn Sie die Zielplattform wechseln. Diese Konfiguration muss manuell in TwinCAT XAE vorgenommen werden. Zusätzlich zu der I/O-Konfiguration des Netzwerkadapters muss ein Link zwischen dem Netzwerkadapter und den SPS-Bausteinen für die SV-Kommunikation hergestellt werden. Mit dem Link können die vom Netzwerkadapter empfangenen SV-Nachrichten an die Instanz des SV-Subscriber-Funktionsbausteins weitergeleitet werden. In umgekehrter Richtung kann die Instanz des SV-Publisher-Funktionsbausteins die zu sendenden SV-Nachrichten an den Netzwerkadapter weiterleiten. Hier finden Sie weitere Informationen zum Thema: RT – Ethernet Adapter Konfiguration.

Das Datenmodell der Merging Unit

Nach 9-2LE benötigt das Datenmodell 4 Instanzen des logischen Knoten: TCTR (Stromwandler) und 4 Instanzen des logischen Knoten: TVTR (Spannungswandler). Im Beispielprojekt sind es folgende LNs:

Logischer Knoten

Typ

Beschreibung

InnATCTR1

TCTR

Stromwandler Phase A

InnBTCTR2

TCTR

Stromwandler Phase B

InnCTCTR3

TCTR

Stromwandler Phase C

InnNTCTR4

TCTR

Stromwandler Neutralleiter N

UnnATVTR1

TVTR

Spannungswandler Phase A

UnnBTVTR2

TVTR

Spannungswandler Phase B

UnnCTVTR3

TVTR

Spannungswandler Phase C

UnnNTVTR4

TVTR

Spannungswandler Neutralleiter N

Der 9-2LE Leitfaden definiert den Datensatz: „PhsMeas1“. Dieser Datensatz legt fest, welche Attribute aus dem Datenmodell als abgetastete Werte in der ASDU und dann in der SV-Nachricht (APDU) übertragen werden.

PhsMeas1 Dataset-Member

CDC

FC

InnATCTR1.AmpSv

SAV

MX

InnBTCTR2.AmpSv

SAV

MX

InnCTCTR3.AmpSv

SAV

MX

InnNTCTR4.AmpSv

SAV

MX

InnATVTR1.VolSv

SAV

MX

InnBTVTR2.VolSv

SAV

MX

InnCTVTR3.VolSv

SAV

MX

InnNTVTR4.VolSv

SAV

MX

Die Dataset-Member: „AmpSv“ und „VolSv“ sollen folgende Pflicht-Attribute besitzen:

Attribut

Typ

Beschreibung

instMag.i

INT32

Abgetasteter Messwert (Spannung oder Strom)

q

Quality

Qualitty-Flags inklusive des zusätzlichen Derived-Flags.

Außerdem definiert der Leitfaden Skalierungsfaktoren für Strom und Spannung. Die Strom- und Spannungswerte müssen mit dem jeweiligen Faktor skaliert und als ganze Zahlen übertragen werden. Stromfaktor: 1000 (LSB: 1mA). Spannungsfaktor: 100 (LSB: 10mV).

SV-Kontrollsteuerblöcke

Das 9-2LE Dokument definiert zwei SV-Kontrollsteuerblöcke: „MSVCB01“ (80 Abtastwerte pro Periode) und „MSVCB02“ (256 Abtastwerte pro Periode). Mindestens einer dieser Blöcke muss implementiert werden. Beim „MSVCB01“ wird in einer SV-Nachricht nur eine ASDU und beim „MSVCB02“ acht ASDUs übertragen. Das Beispielprojekt implementiert beide Kontrollsteuerblöcke. Die Kontrollsteuerblock-Instanzen finden Sie im LLN0-Knoten.


MSVCB01: FB_GseMsvCBImplClass := (MsvID:=(sValue:='xxxxMUnn01'), DatSet:=(sValue:='IEDMUnn/LLN0.PhsMeas1'), ConfRev:=(nValue:=1), SmpRate:=(nValue:=80), OptFlds:=(RefreshTime:=TRUE), DstAddress:=(sAddr:='01-0C-CD-04-00-00', nPRIORITY:=4, nVID:=16#000, nAPPID:=16#4000), NoASDU:=(nValue:=1), bLinkResult:=THIS^.AddMulticastSampledValueControlBlockToContainer(ipMulticastSampledValueControlBlock:=MSVCB01));

MSVCB02: FB_GseMsvCBImplClass := (MsvID:=(sValue:='xxxxMUnn02'), DatSet:=(sValue:='IEDMUnn/LLN0.PhsMeas1'), ConfRev:=(nValue:=1), SmpRate:=(nValue:=256), OptFlds:=(RefreshTime:=TRUE), DstAddress:=(sAddr:='01-0C-CD-04-00-01', nPRIORITY:=4, nVID:=16#000, nAPPID:=16#4001), NoASDU:=(nValue:=8), bLinkResult:=THIS^.AddMulticastSampledValueControlBlockToContainer(ipMulticastSampledValueControlBlock:=MSVCB02));

Theoretisch kann jede SV-Nachricht (APDU) bis zu 8 ASDUs aus verschiedenen Quellen zusammenfassen. In diesem Fall wird jede ASDU durch ihre eindeutige Kennung („MsvID“) identifiziert. Der Leitfaden empfiehlt die Verwendung einer APPID („nAPPID“) mit dem Wert: 0x4000 und die Verwendung von Multicast-Adressen („DstAddress“) aus dem Wertebereich: „01:0C:CD:04:xx:xx“. Die Konfigurationsversion („ConfRev“) soll immer den Wert: 1 haben.

Der SV-Subscriber empfängt, filtert und analysiert nur Nachrichten, die dem jeweiligen Abonnenten zugeordnet sind.

SV-Taskkonfiguration

Die SV-Nachrichten werden im Beispielprojekt durch zwei separate SPS-Tasks verarbeitet. Task: „PlcTaskSV01“ verarbeitet die Daten des Kontrollsteuerblocks: „MSVCB01“ und Task: „PlcTaskSV02“ die Daten des Kontrollsteuerblocks: “MSVCB02“.

Die Kontrollblöcke senden die SV-Nachrichten in genau definierten Zeitabständen t. Der Zeitintervall t. ist abhängig von der Frequenz des Messsignals (Netzfrequenz) und der Anzahl der Samples Per Period (SPP).

Berechnung des Zeitintervalls für „MSVCB01“:
Netzfrequenz f: 50 Hz und SPP: 80

t = 1/(f*SPP) = 1/(50*80) = 0,00025 s = 250 µs

In diesem Fall wird alle 250 µs eine SV-Nachricht (APDU mit einer ASDU) gesendet. D.h. insgesamt 4000 Frames/Sekunde.

Berechnung des Zeitintervalls für „MSVCB02“:
Netzfrequenz f: 50 Hz und SPP: 256

t = 1/(f*SPP) = 1/(50*256) = 0,000078125 s = 78,125 µs

In diesem Fall wird aber nur alle 625 µs eine SV-Nachricht gesendet, weil jede SV-Nachricht 8 ASDUs beinhaltet (die Messwerte in den ASDUs haben gleiche Quellen). D.h. insgesamt 1600 Frames/Sekunde.

Im Beispiel ist die TwinCAT Basetime für alle SPS-Tasks auf den Wert: 125 µs vorkonfiguriert. Dies ermöglicht uns eine Simulation der SV-Übertragung der Abtastwerte der dreiphasigen Spannungen/Ströme im 50 Hz Netz. Der „Cycle ticks“-Multiplikator der SPS-Task: „PlcTaskSV01“ hat den Wert: 2 und sie wird dadurch alle 250 µs aufgerufen. Der „Cycle tics“-Multiplikator der SPS-Task: „PlcTaskSV02“ hat den Wert: 5 und sie wird dadurch alle 625 µs aufgerufen. Dies entspricht der 9-2LE-Anforderung für „MSVCB01“ und „MSVCB02“, um die SPP-Werte 80 bzw. 256 zu erfüllen (50Hz Netzfrequenz). Jeder Kontrollblock sendet periodisch exakt eine SV-Nachricht in eigenem Task-Zyklus.

Die SPS-Task: „PlcTask“ mit 10 ms Zykluszeit ist verantwortlich für die Verarbeitung der Client-Server Kommunikation.

Spezielle SV-Datenstrukturen und SV-Funktionsbausteine

Der TwinCAT Telecontrol Configurator generiert neben dem IED-Datenmodell, auch die, für die SV-Implementierung benötigten strukturierten Datentypen und Funktionsbausteine. Die SV-Datenstrukturen werden im Projektbaum: „\DUTs\{IEDName}\Sampled Values“ und die SV-Funktionsbausteine im Projektbaum: „\POUs\{IEDName}\Sampled Values“ gespeichert. Die strukturierten Datentypen und Funktionsbausteine werden benötigt, um die abgetasteten Messwerte, die zuerst im TwinCAT SPS-Datenformat vorliegen (SV-Publisher), ins Datenformat zu konvertieren, der in der SV-Nachricht übertragen werden soll. In umgekehrter Richtung werden die, in der SV-Nachricht empfangenen Daten, ins TwinCAT SPS-Datenformat konvertiert (SV-Subscriber). In der IEC 61850-9-2 Norm wurden dafür spezielle Encoding-Regeln für die IEC 61850-7-2 Basistypen festgelegt. Grundsätzlich werden nur einfache Basistypen in der SV-Nachricht kodiert. D.h. auch bei den konstruierten Datentypen (CDC’s): „VolSv“ und „AmpSv“ im Datensatz: „PhsMeas1“ werden in der SV-Nachricht nur die Daten der Attribute „i“ und „q“ kodiert. Im Folgenden werden die generierten SV-Datenstrukturen und SV-Funktionsbausteine kurz beschrieben. Der Einfachheit halber wird dies nur am Beispiel der „MSVCB01“ Kontrollsteuerblock-Implementierung gemacht.

Die generierten SV-Datenstrukturen haben folgende Namens-Prefixe: „ST_SVDATA_“, „ST_SVASDU_“, „ST_SVAPDU_“ und „ST_SVBUFFER_“ (nur im SV-Subscriber-Projekt).

Das Type-Encoding, Byte-Alignment und die Byte-Reihenfolge der Membervariablen in der Datenstruktur: „ST_SVDATA_IED_MUnn_LLN0_PhsMeas1“ entspricht exakt dem Aufbau der Daten vom Datensatz: „PhsMeas1“ und dem Format wie dieser Datensatz im Netzwerk übertragen wird. D.h. die Daten in dieser Struktur haben 1 Byte-Alignment und Netzwerk-Byte-Reihenfolge (big-endian). Die Datentypen sind nach den Encoding-Regeln aus IEC 61850-7-2 Norm in SV-Datentypen bereits konvertiert.

(* SV dataset values buffer type (IEC 61850 big endian network byte order) *)
{attribute 'pack_mode' := '1'}
TYPE ST_SVDATA_IED_MUnn_LLN0_PhsMeas1 : 
STRUCT
    IED_MUnn_InnATCTR1_AmpSv_instMag_i: T_OCTET4;
    IED_MUnn_InnATCTR1_AmpSv_q: T_OCTET4;
    IED_MUnn_InnBTCTR2_AmpSv_instMag_i: T_OCTET4;
    IED_MUnn_InnBTCTR2_AmpSv_q: T_OCTET4;
    IED_MUnn_InnCTCTR3_AmpSv_instMag_i: T_OCTET4;
    IED_MUnn_InnCTCTR3_AmpSv_q: T_OCTET4;
    IED_MUnn_InnNTCTR4_AmpSv_instMag_i: T_OCTET4;
    IED_MUnn_InnNTCTR4_AmpSv_q: T_OCTET4;
    IED_MUnn_UnnATVTR1_VolSv_instMag_i: T_OCTET4;
    IED_MUnn_UnnATVTR1_VolSv_q: T_OCTET4;
    IED_MUnn_UnnBTVTR2_VolSv_instMag_i: T_OCTET4;
    IED_MUnn_UnnBTVTR2_VolSv_q: T_OCTET4;
    IED_MUnn_UnnCTVTR3_VolSv_instMag_i: T_OCTET4;
    IED_MUnn_UnnCTVTR3_VolSv_q: T_OCTET4;
    IED_MUnn_UnnNTVTR4_VolSv_instMag_i: T_OCTET4;
    IED_MUnn_UnnNTVTR4_VolSv_q: T_OCTET4;
END_STRUCT
END_TYPE

Die Membervariablen in Datenstruktur: „ST_SVASDU_IED_MUnn_LLN0_MSVCB01“ haben den Encoding-Type, das Byte-Alignment und die Byte-Reihenfolge, die dem Typ, Alignment und der Byte-Reihenfolge der Daten in TwinCAT-SPS bzw. dem TwinCAT IEC 61850 Datenformat entsprechen. D.h. die Daten in dieser Struktur haben 8-Byte-Alignment und Host-Byte-Reihenfolge (little-endian). Neben einigen zusätzlichen Variablen wie: „nSmpCnt“ (sample counter), „eSmpSynch“ (synchronization type) und „tRefrTm“ (refresh time stamp) entsprechen die restlichen Membervariablen dem Aufbau der Daten im Datensatz: „PhsMeas1“.

(* SV ASDU data type (TwinCAT PLC little endian host byte order) *)
TYPE ST_SVASDU_IED_MUnn_LLN0_MSVCB01 : 
STRUCT
    nSmpCnt: UINT; (* Sample counter *)
    eSmpSynch: E_GseSvSmpSynch; (* Synchronization type: 0..2 *)
    tRefrTm: T_UtcTime; (* Sample refresh time stamp (optional) *)
    
    IED_MUnn_InnATCTR1_AmpSv_instMag_i: DINT;
    IED_MUnn_InnATCTR1_AmpSv_q: ST_AcsiQuality;
    IED_MUnn_InnBTCTR2_AmpSv_instMag_i: DINT;
    IED_MUnn_InnBTCTR2_AmpSv_q: ST_AcsiQuality;
    IED_MUnn_InnCTCTR3_AmpSv_instMag_i: DINT;
    IED_MUnn_InnCTCTR3_AmpSv_q: ST_AcsiQuality;
    IED_MUnn_InnNTCTR4_AmpSv_instMag_i: DINT;
    IED_MUnn_InnNTCTR4_AmpSv_q: ST_AcsiQuality;
    IED_MUnn_UnnATVTR1_VolSv_instMag_i: DINT;
    IED_MUnn_UnnATVTR1_VolSv_q: ST_AcsiQuality;
    IED_MUnn_UnnBTVTR2_VolSv_instMag_i: DINT;
    IED_MUnn_UnnBTVTR2_VolSv_q: ST_AcsiQuality;
    IED_MUnn_UnnCTVTR3_VolSv_instMag_i: DINT;
    IED_MUnn_UnnCTVTR3_VolSv_q: ST_AcsiQuality;
    IED_MUnn_UnnNTVTR4_VolSv_instMag_i: DINT;
    IED_MUnn_UnnNTVTR4_VolSv_q: ST_AcsiQuality;
END_STRUCT
END_TYPE

Die Membervariablen in der Datenstruktur: „ST_SVAPDU_IED_MUnn_LLN0_MSVCB01“ sind Instanzen der „ST_SVASDU_“-Datenstruktur in TwinCAT SPS-Datenformat (little-endian, Host-Byte-Reihenfolge).

(* SV APDU data type (TwinCAT PLC little endian host byte order) *)
TYPE ST_SVAPDU_IED_MUnn_LLN0_MSVCB01 : 
STRUCT
    Asdu1: ST_SVASDU_IED_MUnn_LLN0_MSVCB01; (* SV ASDU *)
END_STRUCT
END_TYPE

Type-Encoding und Data-Mapping

Die Funktionsbausteine mit dem Namens-Prefix: „FB_SVTXASDU_“, „FB_SVTXAPDU_“, „FB_SVRXASDU_“ und „FB_SVRXAPDU_“ sind für das Type-Encoding und Mapping der Daten verantwortlich. Jedes Mal, wenn im SV-Publisher die „Update()“-Methode aufgerufen wurde (weitere Infos dazu finden Sie weiter unten in dieser dieser Dokumentation), wird im Funktionsbaustein: „FB_SVTXAPDU_IED_MUnn_LLN0_MSVCB01“ die Methode: „OnSvPublisherHostToNet()“ aufgerufen. In dieser Methode werden die Daten vom TwinCAT-SPS Host-Format ins SV-Netzwerkformat konvertiert, bevor sie als SV-Nachricht verschickt werden.

SV-Publisher/-Subscriber nach UCA 61850-9-2 Light Edition - Übertragung abgetasteter Messwerte 2:

Um die Konvertierung durchzuführen werden im Implementierungscode der Methode: „OnSvPublisherHostToNet()“ Methoden verwendet, die in der Basisklasse: „FB_GseSvApduClass“ bereits implementiert sind (siehe Beispiel unten).

(* Converts SV publisher data to be sent from host (little-endian) to network (big-endian) byte order *)
METHOD FINAL OnSvPublisherHostToNet
VAR_INPUT
    ipAdapter: I_GseAdapterClass; (* Network adapter interface pointer *)
    ipApdu: I_GseSvApduClass; (* APDU object interface pointer *)
END_VAR
Asdu1.nSmpCnt:= TxData.Asdu1.nSmpCnt; (* Set sample counter *)
Asdu1.eSmpSynch:= TxData.Asdu1.eSmpSynch; (* Set synchronization type: 0..2 *)
Asdu1.tRefrTm:= TxData.Asdu1.tRefrTm; (* Set refresh time stamp (optional) *)

(* Convert SV data to be sent from host byte order to network byte order *)
HostToNetInt32(in:=TxData.Asdu1.IED_MUnn_InnATCTR1_AmpSv_instMag_i, out:=Asdu1.Values.IED_MUnn_InnATCTR1_AmpSv_instMag_i);
HostToNetQuality(in:=TxData.Asdu1.IED_MUnn_InnATCTR1_AmpSv_q, out:=Asdu1.Values.IED_MUnn_InnATCTR1_AmpSv_q);
HostToNetInt32(in:=TxData.Asdu1.IED_MUnn_InnBTCTR2_AmpSv_instMag_i, out:=Asdu1.Values.IED_MUnn_InnBTCTR2_AmpSv_instMag_i);
HostToNetQuality(in:=TxData.Asdu1.IED_MUnn_InnBTCTR2_AmpSv_q, out:=Asdu1.Values.IED_MUnn_InnBTCTR2_AmpSv_q);
HostToNetInt32(in:=TxData.Asdu1.IED_MUnn_InnCTCTR3_AmpSv_instMag_i, out:=Asdu1.Values.IED_MUnn_InnCTCTR3_AmpSv_instMag_i);
HostToNetQuality(in:=TxData.Asdu1.IED_MUnn_InnCTCTR3_AmpSv_q, out:=Asdu1.Values.IED_MUnn_InnCTCTR3_AmpSv_q);
HostToNetInt32(in:=TxData.Asdu1.IED_MUnn_InnNTCTR4_AmpSv_instMag_i, out:=Asdu1.Values.IED_MUnn_InnNTCTR4_AmpSv_instMag_i);
HostToNetQuality(in:=TxData.Asdu1.IED_MUnn_InnNTCTR4_AmpSv_q, out:=Asdu1.Values.IED_MUnn_InnNTCTR4_AmpSv_q);
HostToNetInt32(in:=TxData.Asdu1.IED_MUnn_UnnATVTR1_VolSv_instMag_i, out:=Asdu1.Values.IED_MUnn_UnnATVTR1_VolSv_instMag_i);
HostToNetQuality(in:=TxData.Asdu1.IED_MUnn_UnnATVTR1_VolSv_q, out:=Asdu1.Values.IED_MUnn_UnnATVTR1_VolSv_q);
HostToNetInt32(in:=TxData.Asdu1.IED_MUnn_UnnBTVTR2_VolSv_instMag_i, out:=Asdu1.Values.IED_MUnn_UnnBTVTR2_VolSv_instMag_i);
HostToNetQuality(in:=TxData.Asdu1.IED_MUnn_UnnBTVTR2_VolSv_q, out:=Asdu1.Values.IED_MUnn_UnnBTVTR2_VolSv_q);
HostToNetInt32(in:=TxData.Asdu1.IED_MUnn_UnnCTVTR3_VolSv_instMag_i, out:=Asdu1.Values.IED_MUnn_UnnCTVTR3_VolSv_instMag_i);
HostToNetQuality(in:=TxData.Asdu1.IED_MUnn_UnnCTVTR3_VolSv_q, out:=Asdu1.Values.IED_MUnn_UnnCTVTR3_VolSv_q);
HostToNetInt32(in:=TxData.Asdu1.IED_MUnn_UnnNTVTR4_VolSv_instMag_i, out:=Asdu1.Values.IED_MUnn_UnnNTVTR4_VolSv_instMag_i);
HostToNetQuality(in:=TxData.Asdu1.IED_MUnn_UnnNTVTR4_VolSv_q, out:=Asdu1.Values.IED_MUnn_UnnNTVTR4_VolSv_q);

Jedes Mal, wenn der SV-Subscriber eine neue SV-Nachricht empfängt, wird im Funktionsbaustein: „FB_SVRXAPDU_IED_MUnn_LLN0_MSVCB01“ die Methode: „OnSvSubscriberNetToHost()“ aufgerufen. In dieser Methode werden die empfangenen Daten vom SV-Netzwerkformat ins TwinCAT-SPS Host bzw. TwinCAT IEC 61850 Datenformat konvertiert. Nach der Konvertierung wird im SV-Subscriber die Event-Ereignismethode: „OnSvUpdate()“ aufgerufen (weitere Infos dazu finden Sie weiter unten in dieser Dokumentation).

SV-Publisher/-Subscriber nach UCA 61850-9-2 Light Edition - Übertragung abgetasteter Messwerte 3:

Um die Konvertierung durchzuführen werden im Implementierungscode der Methode: „OnSvSubscriberNetToHost()“ Methoden verwendet, die in der Basisklasse: „FB_GseSvApduClass“ bereits implementiert sind (siehe Beispielcode unten).

(* Converts received SV subscriber data from network (big-endian) to host (little-endian) byte order *)
METHOD FINAL OnSvSubscriberNetToHost
VAR_INPUT
    ipAdapter: I_GseAdapterClass; (* Network adapter interface pointer *)
    ipApdu: I_GseSvApduClass; (* APDU object interface pointer *)
END_VAR
RxData.Asdu1.nSmpCnt:= Asdu1.nSmpCnt; (* Get sample counter *)
RxData.Asdu1.eSmpSynch:= Asdu1.eSmpSynch; (* Get synchronization type: 0..2 *)
RxData.Asdu1.tRefrTm:= Asdu1.tRefrTm; (* Get refresh time stamp (optional) *)

(* Convert received SV data from network byte order to host byte order *)
NetToHostInt32(in:=Asdu1.Values.IED_MUnn_InnATCTR1_AmpSv_instMag_i, out:=RxData.Asdu1.IED_MUnn_InnATCTR1_AmpSv_instMag_i);
NetToHostQuality(in:=Asdu1.Values.IED_MUnn_InnATCTR1_AmpSv_q, out:=RxData.Asdu1.IED_MUnn_InnATCTR1_AmpSv_q);
NetToHostInt32(in:=Asdu1.Values.IED_MUnn_InnBTCTR2_AmpSv_instMag_i, out:=RxData.Asdu1.IED_MUnn_InnBTCTR2_AmpSv_instMag_i);
NetToHostQuality(in:=Asdu1.Values.IED_MUnn_InnBTCTR2_AmpSv_q, out:=RxData.Asdu1.IED_MUnn_InnBTCTR2_AmpSv_q);
NetToHostInt32(in:=Asdu1.Values.IED_MUnn_InnCTCTR3_AmpSv_instMag_i, out:=RxData.Asdu1.IED_MUnn_InnCTCTR3_AmpSv_instMag_i);
NetToHostQuality(in:=Asdu1.Values.IED_MUnn_InnCTCTR3_AmpSv_q, out:=RxData.Asdu1.IED_MUnn_InnCTCTR3_AmpSv_q);
NetToHostInt32(in:=Asdu1.Values.IED_MUnn_InnNTCTR4_AmpSv_instMag_i, out:=RxData.Asdu1.IED_MUnn_InnNTCTR4_AmpSv_instMag_i);
NetToHostQuality(in:=Asdu1.Values.IED_MUnn_InnNTCTR4_AmpSv_q, out:=RxData.Asdu1.IED_MUnn_InnNTCTR4_AmpSv_q);
NetToHostInt32(in:=Asdu1.Values.IED_MUnn_UnnATVTR1_VolSv_instMag_i, out:=RxData.Asdu1.IED_MUnn_UnnATVTR1_VolSv_instMag_i);
NetToHostQuality(in:=Asdu1.Values.IED_MUnn_UnnATVTR1_VolSv_q, out:=RxData.Asdu1.IED_MUnn_UnnATVTR1_VolSv_q);
NetToHostInt32(in:=Asdu1.Values.IED_MUnn_UnnBTVTR2_VolSv_instMag_i, out:=RxData.Asdu1.IED_MUnn_UnnBTVTR2_VolSv_instMag_i);
NetToHostQuality(in:=Asdu1.Values.IED_MUnn_UnnBTVTR2_VolSv_q, out:=RxData.Asdu1.IED_MUnn_UnnBTVTR2_VolSv_q);
NetToHostInt32(in:=Asdu1.Values.IED_MUnn_UnnCTVTR3_VolSv_instMag_i, out:=RxData.Asdu1.IED_MUnn_UnnCTVTR3_VolSv_instMag_i);
NetToHostQuality(in:=Asdu1.Values.IED_MUnn_UnnCTVTR3_VolSv_q, out:=RxData.Asdu1.IED_MUnn_UnnCTVTR3_VolSv_q);
NetToHostInt32(in:=Asdu1.Values.IED_MUnn_UnnNTVTR4_VolSv_instMag_i, out:=RxData.Asdu1.IED_MUnn_UnnNTVTR4_VolSv_instMag_i);
NetToHostQuality(in:=Asdu1.Values.IED_MUnn_UnnNTVTR4_VolSv_q, out:=RxData.Asdu1.IED_MUnn_UnnNTVTR4_VolSv_q);

SV-Publisher-Funktionsbaustein

In der globalen Variablenliste: TcTelecontrol finden Sie eine IED-Datenmodell-Bausteininstanz: „fbIED“ und zwei SV-Publisher-Bausteininstanzen. Das Programm: „P_IEC61850SV01“ wird von „PlcTaskSV01“ aufgerufen. „P_IEC61850SV01“ ruft wiederum den SV-Publisher Baustein: „fbIED_MUnn_MSVCB01SvPublisher“ auf, der für das Versenden der SV-Nachrichten zuständig ist. Der zweite SV-Publisher-Baustein: „fbIED_MUnn_MSVCB02SvPublisher“ wird von „PlcTaskSV02“ und dem Programm: „P_IEC61850SV02“ aufgerufen.

VAR_GLOBAL
    …
    (* IED data model *)
    fbIED: FB_IED_IED;
    (* Sampled values publisher *)
    fbIED_MUnn_MSVCB01SvPublisher: FB_IED_MUnn_MSVCB01SvPublisher := (fbAdapter:=(ipIED:=fbIED, settings:=(eDispatchMode:=E_GseDispatchMode.NonPromiscuous)));
    fbIED_MUnn_MSVCB02SvPublisher: FB_IED_MUnn_MSVCB02SvPublisher := (fbAdapter:=(ipIED:=fbIED, settings:=(eDispatchMode:=E_GseDispatchMode.NonPromiscuous)));
    …
END_VAR

In der Beispielimplementierung wird der SV-Publishing-Prozess bei beiden SV-Steuerungskontrollblocks nach dem Start der SPS automatisch gestartet. Eine steigende Flanke an der „bStop“-Variablen stoppt den Publishing-Prozess. Für die SV-Übertragung werden simulierte Strom- und Spannungs-Messwerte von dem Funktionsbaustein: „FB_GseSvPhsMeasGeneratorClass“ generiert. Wenn die SV-Übertragung über eine steigende Flanke an der „bStart“-Variablen gestartet wurde (das passiert automatisch nach dem Start der SPS) und die „bUpdate“-Variable den Wert TRUE hat dann werden in der Methode: SvSimulation() neue Messwerte für Strom und Spannung der drei Phasen A, B und C generiert und „fbApdu1.TxData“ zugewiesen. Die Strom- und Spannungs-Werte des Neutralleiters (N) werden aus der Summe der Messwerte der Phasen A, B und C errechnet. Siehe unten die Beispielcode-Implementierung des MSVCB01-Publishers.

(* Sampled values publisher *)
FUNCTION_BLOCK FB_IED_MUnn_MSVCB01SvPublisher IMPLEMENTS I_GseLinkStatusEventSink
VAR_INPUT
    fbAdapter: FB_GseAdapterClass := (ipLinkStatus:=THIS^); (* GSE network adapter *)
    fbApdu1: FB_SVTXAPDU_IED_MUnn_LLN0_MSVCB01; (* SV publisher APDU *)
END_VAR
VAR
    eLinkStatus: E_GseLinkStatus; (* Network adapter link status *)
    bSuccess: BOOL;
    ipError: I_ServiceErrorClass;
    bStart: BOOL := TRUE; (* Rising edge starts publishing of SV data *)
    bStop: BOOL; (* Rising edge stops publishing of SV data *)
    bUpdate: BOOL := TRUE; (* Enable/disable cyclic update of published SV data. Default: TRUE (enabled) *)
    bUpdateOnce: BOOL; (* Rising edge updates published SV data only once *)
    
    bSynch: BOOL := TRUE; (* Rising edge at this input resets the sample counter to 0 *)
    nSynch: UDINT; (* Increments every time sampling is synchronized *)
    nSmpCnt: UINT; (* Sample counter *)
    eSmpSynch: E_GseSvSmpSynch := E_GseSvSmpSynch.Local; (* Synchronization type: 0..2 *)
    tRefrTm: T_UtcTime; (* Sample refresh time stamp (optional) *)
    qMeasure: ST_AcsiQuality := (Derived:=TRUE); (* SV quality bits *)
    bSimulation: BOOL := TRUE; (* Enable/disable SV test signal function generator. Default: TRUE (enabled) *)
    
    fbGenerator1: FB_GseSvPhsMeasGeneratorClass := (
        nOversampleFactor:=1, (* Sets oversampling factor. Default: 1 (no oversampling) *)
        AmpA:=(fFrequency:=50.0, fAmplitude:=100, fPhi:=0),
        AmpB:=(fFrequency:=50.0, fAmplitude:=100, fPhi:=-120),
        AmpC:=(fFrequency:=50.0, fAmplitude:=100, fPhi:=-240),
        VolA:=(fFrequency:=50.0, fAmplitude:=230 * SQRT(2), fPhi:=0),
        VolB:=(fFrequency:=50.0, fAmplitude:=230 * SQRT(2), fPhi:=-120),
        VolC:=(fFrequency:=50.0, fAmplitude:=230 * SQRT(2), fPhi:=-240)); (* SV test signal function generator for PhsMeas1 dataset according to UCA 61850-9-2LE specification *)
END_VAR
bSuccess:= fbAdapter.Execute(ipError=>ipError); (* Execute network adapter *)

IF bStart THEN (* Start publishing of SV data *)
    bStart:= FALSE;
    fbGenerator1.Config(); (* Configure SV test signal function generator *)
    bSuccess:= fbIED.IEDMUnn.LLN0.MSVCB01.Publisher.Start(ipAdapter:=fbAdapter, ipApdu:=fbApdu1, ipError=>ipError);
ELSIF bStop THEN (* Stop publishing of SV data *)
    bStop:= FALSE;
    bSuccess:= fbIED.IEDMUnn.LLN0.MSVCB01.Publisher.Stop(ipError=>ipError);
ELSIF bUpdate OR_ELSE bUpdateOnce THEN (* Update published SV data *)
    bUpdateOnce:= FALSE;
    SvSimulation(); (* Create test signal SV data *)
    bSuccess:= fbIED.IEDMUnn.LLN0.MSVCB01.Publisher.Update(ipError=>ipError);
ELSE (* Execute publisher SvCB's *)
    bSuccess:= fbIED.IEDMUnn.LLN0.MSVCB01.Publisher.Execute(ipError=>ipError);
END_IF

SV-Publisher SvSimulation()-Methode

(* Create SV test data. The data will be sent the next time when the publisher's Update() method is called *)
METHOD PRIVATE SvSimulation
VAR
END_VAR
fbApdu1.bSimulation:= bSimulation; (* Example => Sets SV ethernet header simulation flag *)
qMeasure.Test:= bSimulation; (* Example => Sets "Quality.Test" bit to TRUE if simulation enabled *)
qMeasure.Validity1:= NOT qMeasure.Validity1; (* Example => Toggle some "Quality.Validity" bits *)

IF bSynch THEN
    bSynch:= FALSE;
    nSmpCnt:= 0; (* Example => Set sample counter to 0 *)
    fbGenerator1.Reset(); (* Reset SV test signal function generator *)
    nSynch:= nSynch + 1;
ELSE
    nSmpCnt:= nSmpCnt + 1; (* Increment sample counter *)
END_IF

IF bSimulation THEN
    fbGenerator1.Call(); (* Call SV test signal function generator for new data *)
END_IF

fbApdu1.TxData.Asdu1.nSmpCnt:= nSmpCnt; (* Set sample counter *)
fbApdu1.TxData.Asdu1.eSmpSynch:= eSmpSynch; (* Set synchronization type: 0..2 *)
(* Hint: The time stamp will only be sent if "RefreshTime" parameter in the "OptFlds" of the SV publisher control block is set to TRUE *)
fbApdu1.TxData.Asdu1.tRefrTm:= tRefrTm; (* Set sample refresh time stamp (optional) *)

(* Include the following to simulate IEC 61850 9-2LE values. This only works if the rest of the datamodel complies with the standard.*)
fbApdu1.TxData.Asdu1.IED_MUnn_InnATCTR1_AmpSv_instMag_i:= SEL(bSimulation, 0, TO_DINT(fbGenerator1.AmpA.fSignal));
fbApdu1.TxData.Asdu1.IED_MUnn_InnATCTR1_AmpSv_q:= qMeasure;
fbApdu1.TxData.Asdu1.IED_MUnn_InnBTCTR2_AmpSv_instMag_i:= SEL(bSimulation, 0, TO_DINT(fbGenerator1.AmpB.fSignal));
fbApdu1.TxData.Asdu1.IED_MUnn_InnBTCTR2_AmpSv_q:= qMeasure;
fbApdu1.TxData.Asdu1.IED_MUnn_InnCTCTR3_AmpSv_instMag_i:= SEL(bSimulation, 0, TO_DINT(fbGenerator1.AmpC.fSignal));
fbApdu1.TxData.Asdu1.IED_MUnn_InnCTCTR3_AmpSv_q:= qMeasure;
fbApdu1.TxData.Asdu1.IED_MUnn_InnNTCTR4_AmpSv_instMag_i:= SEL(bSimulation, 0, TO_DINT(fbGenerator1.AmpA.fSignal + fbGenerator1.AmpB.fSignal + fbGenerator1.AmpC.fSignal));
fbApdu1.TxData.Asdu1.IED_MUnn_InnNTCTR4_AmpSv_q:= qMeasure;
fbApdu1.TxData.Asdu1.IED_MUnn_UnnATVTR1_VolSv_instMag_i:= SEL(bSimulation, 0, TO_DINT(fbGenerator1.VolA.fSignal));
fbApdu1.TxData.Asdu1.IED_MUnn_UnnATVTR1_VolSv_q:= qMeasure;
fbApdu1.TxData.Asdu1.IED_MUnn_UnnBTVTR2_VolSv_instMag_i:= SEL(bSimulation, 0, TO_DINT(fbGenerator1.VolB.fSignal));
fbApdu1.TxData.Asdu1.IED_MUnn_UnnBTVTR2_VolSv_q:= qMeasure;
fbApdu1.TxData.Asdu1.IED_MUnn_UnnCTVTR3_VolSv_instMag_i:= SEL(bSimulation, 0, TO_DINT(fbGenerator1.VolC.fSignal));
fbApdu1.TxData.Asdu1.IED_MUnn_UnnCTVTR3_VolSv_q:= qMeasure;
fbApdu1.TxData.Asdu1.IED_MUnn_UnnNTVTR4_VolSv_instMag_i:= SEL(bSimulation, 0, TO_DINT(fbGenerator1.VolA.fSignal + fbGenerator1.VolB.fSignal + fbGenerator1.VolC.fSignal));
fbApdu1.TxData.Asdu1.IED_MUnn_UnnNTVTR4_VolSv_q:= qMeasure;

SV-Subscriber Funktionsbaustein

In der globalen Variablenliste: TcTelecontrol finden Sie eine IED-Datenmodell-Bausteininstanz: „fbIED“ und zwei SV-Subscriber-Bausteininstanzen. Das Programm: „P_IEC61850SV01“ wird von „PlcTaskSV01“ aufgerufen. „P_IEC61850SV01“ ruft wiederum den SV-Subscriber Baustein: „fbIED_MUnn_MSVCB01SvSubscriber“ auf, der für das Empfangen der SV-Nachrichten zuständig ist. Der zweite SV-Subscriber-Baustein: „fbIED_MUnn_MSVCB02SvSubscriber“ wird von „PlcTaskSV02“ und dem Programm: „P_IEC61850SV02“ aufgerufen.

VAR_GLOBAL
    …
    (* IED data model *)
    fbIED: FB_IED_IED;
    (* Sampled values subscriber *)
    fbIED_MUnn_MSVCB01SvSubscriber: FB_IED_MUnn_MSVCB01SvSubscriber := (fbAdapter:=(ipIED:=fbIED, settings:=(eDispatchMode:=E_GseDispatchMode.NonPromiscuous)));
    fbIED_MUnn_MSVCB02SvSubscriber: FB_IED_MUnn_MSVCB02SvSubscriber := (fbAdapter:=(ipIED:=fbIED, settings:=(eDispatchMode:=E_GseDispatchMode.NonPromiscuous)));
    …
END_VAR

Der Empfang der SV-Nachrichten wird durch eine steigende Flanke an der „bSubscribe“-Variablen aktiviert. Eine steigende Flanke an der „bUnsubscribe“-Variablen stoppt den SV-Nachrichtenempfang. Im Beispielprojekt werden beide SV-Subscriber-Instanzen beim SPS-Programmstart aktiviert.

Jedes Mal, wenn der SV-Subscriber eine neue SV-Nachricht empfängt, wird im SV-Subscriber-Funktionsbaustein die Ereignismethode: „OnSvUpdate()“ aufgerufen. In unserer Beispielimplementierung werden in dieser Methode die empfangenen SV-Messwerte von „fbApdu1.RxData“ in einen größeren Datenpuffer für spätere Auswertung umkopiert. Was mit den empfangenen Daten geschieht, bleibt der Applikation überlassen. Die Daten müssen aber auf irgendeine Weise gesichert werden, weil sie mit neu empfangenen SV-Daten überschrieben werden.

(* Sampled values subscriber *)
FUNCTION_BLOCK FB_IED_MUnn_MSVCB01SvSubscriber IMPLEMENTS I_GseLinkStatusEventSink, I_GseSvUpdateEventSink
VAR_INPUT
    fbAdapter: FB_GseAdapterClass := (ipLinkStatus:=THIS^); (* GSE network adapter *)
END_VAR
VAR_OUTPUT
    fbApdu1: FB_SVRXAPDU_IED_MUnn_LLN0_MSVCB01 := (ipUpdate:=THIS^); (* SV subscriber APDU *)
    RxBuffer1: ST_SVBUFFER_IED_MUnn_LLN0_MSVCB01; (* SV data buffer *)
END_VAR
VAR
    eLinkStatus: E_GseLinkStatus; (* Network adapter link status *)
    bSuccess: BOOL;
    ipError: I_ServiceErrorClass;
    bSubscribe: BOOL := TRUE; (* Rising edge enables subscriber SvCB's *)
    bUnsubscribe: BOOL; (* Rising edge disables subscriber SvCB's *)
    
    bSynch: BOOL; (* If TRUE => sample counter is 0 *)
    nSynch: UDINT; (* Increments every time sample counter is 0 *)
    nSmpCnt: UINT; (* Sample counter *)
    eSmpSynch: E_GseSvSmpSynch := E_GseSvSmpSynch.None; (* Synchronization type: 0..2 *)
    tRefrTm: T_UtcTime; (* Sample refresh time stamp (optional) *)
    bSimulation: BOOL; (* SV ethernet header simulation flag *)
END_VAR
bSuccess:= fbAdapter.Execute(ipError=>ipError); (* Execute network adapter *)

IF bSubscribe THEN (* Enable subscriber SvCB's *)
    bSubscribe:= FALSE;
    bSuccess:= fbIED.IEDMUnn.LLN0.MSVCB01.Subscriber.Enable(ipAdapter:=fbAdapter, ipApdu:=fbApdu1, ipError=>ipError);
ELSIF bUnsubscribe THEN (* Disable subscriber SvCB's *)
    bUnsubscribe:= FALSE;
    bSuccess:= fbIED.IEDMUnn.LLN0.MSVCB01.Subscriber.Disable(ipError=>ipError);
ELSE (* Execute subscriber SvCB's *)
    bSuccess:= fbIED.IEDMUnn.LLN0.MSVCB01.Subscriber.Execute(ipError=>ipError);
END_IF

SV-Subscriber OnSvUpdate()-Ereignismethode

(* This method receives SV APDU update event notification *)
METHOD FINAL OnSvUpdate
VAR_INPUT
    ipAdapter: I_GseAdapterClass; (* Network adapter interface pointer *)
    ipApdu: I_GseSvApduClass; (* APDU object interface pointer *)
END_VAR
(* Hint: The time stamp will only be sent if "RefreshTime" parameter in the "OptFlds" of the SV publisher control block is set to TRUE *)

(* Find the updated APDU object and process the received data *)
IF fbApdu1.Equals(ipOther:=ipApdu) THEN

    bSimulation:= fbApdu1.bSimulation; (* Get SV ethernet header simulation flag *)
    nSmpCnt:= fbApdu1.RxData.Asdu1.nSmpCnt; (* Get sample counter *)
    eSmpSynch:= fbApdu1.RxData.Asdu1.eSmpSynch; (* Get synchronization type: 0..2 *)
    tRefrTm:= fbApdu1.RxData.Asdu1.tRefrTm; (* Get sample refresh time stamp (optional) *)
    IF nSmpCnt = 0 THEN
        bSynch:= TRUE;
        nSynch:= nSynch + 1;
    END_IF

    RxBuffer1.IED_MUnn_InnATCTR1_AmpSv_instMag_i[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_InnATCTR1_AmpSv_instMag_i;
    RxBuffer1.IED_MUnn_InnATCTR1_AmpSv_q[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_InnATCTR1_AmpSv_q;
    RxBuffer1.IED_MUnn_InnBTCTR2_AmpSv_instMag_i[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_InnBTCTR2_AmpSv_instMag_i;
    RxBuffer1.IED_MUnn_InnBTCTR2_AmpSv_q[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_InnBTCTR2_AmpSv_q;
    RxBuffer1.IED_MUnn_InnCTCTR3_AmpSv_instMag_i[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_InnCTCTR3_AmpSv_instMag_i;
    RxBuffer1.IED_MUnn_InnCTCTR3_AmpSv_q[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_InnCTCTR3_AmpSv_q;
    RxBuffer1.IED_MUnn_InnNTCTR4_AmpSv_instMag_i[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_InnNTCTR4_AmpSv_instMag_i;
    RxBuffer1.IED_MUnn_InnNTCTR4_AmpSv_q[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_InnNTCTR4_AmpSv_q;
    RxBuffer1.IED_MUnn_UnnATVTR1_VolSv_instMag_i[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_UnnATVTR1_VolSv_instMag_i;
    RxBuffer1.IED_MUnn_UnnATVTR1_VolSv_q[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_UnnATVTR1_VolSv_q;
    RxBuffer1.IED_MUnn_UnnBTVTR2_VolSv_instMag_i[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_UnnBTVTR2_VolSv_instMag_i;
    RxBuffer1.IED_MUnn_UnnBTVTR2_VolSv_q[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_UnnBTVTR2_VolSv_q;
    RxBuffer1.IED_MUnn_UnnCTVTR3_VolSv_instMag_i[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_UnnCTVTR3_VolSv_instMag_i;
    RxBuffer1.IED_MUnn_UnnCTVTR3_VolSv_q[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_UnnCTVTR3_VolSv_q;
    RxBuffer1.IED_MUnn_UnnNTVTR4_VolSv_instMag_i[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_UnnNTVTR4_VolSv_instMag_i;
    RxBuffer1.IED_MUnn_UnnNTVTR4_VolSv_q[RxBuffer1.index]:= fbApdu1.RxData.Asdu1.IED_MUnn_UnnNTVTR4_VolSv_q;

    RxBuffer1.index:= SEL(RxBuffer1.index >= cArrayBufferSize_IED_MUnn_LLN0_MSVCB01-1, RxBuffer1.index + 1, 0);
END_IF

Test

Beide Beispielprojekte: Der SV-Publisher und der SV-Subscriber beinhalten zusätzlich ein TwinCAT Measurement Scope-Projekt. Diese Projekte werden von TwinCAT Telecontrol Configurator nicht automatisch erstellt. Sie wurden manuell dem TwinCAT SV-Publisher/-Subscriber SPS-Projekt hinzugefügt. Sobald Sie beide Projekte gestartet haben und der Netzwerkadapter vorher richtig konfiguriert wurde, kann eine Aufzeichnung der gesendeten und empfangenen Daten im Measurement-Scope-Projekt vorgenommen werden. Möglicherweise müssen Sie aber vorher im Measurement-Projekt die TwinCAT Netzwerkadressen (NetID’s) an Ihre tatsächliche Konfiguration anpassen. Mit dem rechten Mausklick im Projektbaum auf „SV Subscriber Measurement/MU01“ klicken und aus dem Kontext-Menu: „Change Target System“ auswählen. Das Gleiche wiederholen Sie auch für „SV Subscriber Measurement/MU02“. Im TwinCAT SV-Publisher Projekt ähnlich vorgehen.

Wenn die Aufzeichnung im Beispielprojekt auf der SV-Publisher-Seite aktiv ist, dann sollten Sie ein Bild, ähnlich wie unten zu sehen bekommen (rein-zoomen, bis Sinuswellen zu sehen sind).

SV-Publisher/-Subscriber nach UCA 61850-9-2 Light Edition - Übertragung abgetasteter Messwerte 4:

Wenn die Aufzeichnung im Beispielprojekt auf der SV-Subscriber-Seite aktiv ist, dann sollten Sie ein Bild, ähnlich wie unten zu sehen bekommen (rein-zoomen, bis Sinuswellen zu sehen sind).

SV-Publisher/-Subscriber nach UCA 61850-9-2 Light Edition - Übertragung abgetasteter Messwerte 5: