Hinweise zur Dokumentation

Diese Beschreibung wendet sich ausschließlich an ausgebildetes Fachpersonal der Steuerungs- und Automatisierungstechnik, das mit den geltenden nationalen Normen vertraut ist.
Zur Installation und Inbetriebnahme der Komponenten ist die Beachtung der nachfolgenden Hinweise und Erklärungen unbedingt notwendig.

Das Fachpersonal hat sicherzustellen, dass die Anwendung bzw. der Einsatz der beschriebenen Produkte alle Sicherheitsanforderungen, einschließlich sämtlicher anwendbaren Gesetze, Vorschriften, Bestimmungen und Normen erfüllt.

Disclaimer

Diese Dokumentation wurde sorgfältig erstellt. Die beschriebenen Produkte werden jedoch ständig weiter entwickelt.
Deshalb ist die Dokumentation nicht in jedem Fall vollständig auf die Übereinstimmung mit den beschriebenen Leistungsdaten, Normen oder sonstigen Merkmalen geprüft.
Falls sie technische oder redaktionelle Fehler enthält, behalten wir uns das Recht vor, Änderungen jederzeit und ohne Ankündigung vorzunehmen.
Aus den Angaben, Abbildungen und Beschreibungen in dieser Dokumentation können keine Ansprüche auf Änderung bereits gelieferter Produkte geltend gemacht werden.

Marken

Beckhoff®, TwinCAT®, EtherCAT®, Safety over EtherCAT®, TwinSAFE®, XFC® und XTS® sind eingetragene und lizenzierte Marken der Beckhoff Automation GmbH.
Die Verwendung anderer in dieser Dokumentation enthaltenen Marken oder Kennzeichen durch Dritte kann zu einer Verletzung von Rechten der Inhaber der entsprechenden Bezeichnungen führen.

Patente

Die EtherCAT Technologie ist patentrechtlich geschützt, insbesondere durch folgende Anmeldungen und Patente:
EP1590927, EP1789857, DE102004044764, DE102007017835
mit den entsprechenden Anmeldungen und Eintragungen in verschiedenen anderen Ländern.

Die TwinCAT Technologie ist patentrechtlich geschützt, insbesondere durch folgende Anmeldungen und Patente:
EP0851348, US6167425 mit den entsprechenden Anmeldungen und Eintragungen in verschiedenen anderen Ländern.

Copyright

© Beckhoff Automation GmbH & Co. KG, Deutschland.
Weitergabe sowie Vervielfältigung dieses Dokuments, Verwertung und Mitteilung seines Inhalts sind verboten, soweit nicht ausdrücklich gestattet.
Zuwiderhandlungen verpflichten zu Schadenersatz. Alle Rechte für den Fall der Patent-, Gebrauchsmuster- oder Geschmacksmustereintragung vorbehalten.


Übersicht

Die Bibliothek TcIEC870_5_101Master.Lib implementiert die Beckhoff Zentralstation (Master) nach der IEC 60870-5-101 Norm.

"High level"-Schnittstelle: IEC 60870-5-101 Zentralstation

Bei dieser Schnittstelle handelt es sich um eine sogenannte "Ein-Baustein-Lösung". Alle Funktionalitäten sind in einem SPS-Baustein gekapselt. Der Baustein implementiert die wichtigsten Dienste und Funktionen. Diese Implementierung ist für über 90% der Anwendungen ausreichend.

Pro: Sehr kleiner SPS-Programmieraufwand um eine Applikation zu erstellen; Alle Dienste wie Generalabfrage, Zählerabfrage, Uhrzeitsynchronisation, Befehlsausführung, spontane Datenübertragung usw. sind bereits in dem Baustein implementiert und werden automatisch ausgeführt; Das Mapping der IEC<->SPS Prozessdaten und das der Datenpunkte wird über Funktionsaufrufe konfiguriert; Der SPS-Programmierer muss nicht sehr gut mit der Protokollnorm vertraut sein;

Contra: Die SPS-Applikation hat nur einen geringen Einfluss auf die Protokollausführung; Kein Einfluss auf die Ausführung der Dienste, diese werden intern automatisch ausgeführt; Zeitstempel werden von dem Baustein automatisch generiert und können nicht verändert (von extern übergeben) werden; Es ist z.B. nur die direkte Befehlsausführung möglich; Schlechtere Performance bei vielen Datenpunkten.

Diese Schnittstelle empfiehlt sich wenn Sie:

  • Mit der Protokollnorm nicht vertraut sind;
  • Eine einfache Applikation mit wenigen Datenpunkten implementieren (<1000);
  • Keine großen Performance-Anforderungen an die Applikation stellen;
  • Keine besondere Befehlsausführung wie Select/Execute oder Daten + Zeitstempel von externen Geräten versenden;
  • Keine Funktionalitäten benötigen, die laut Kompatibilitätsliste nicht unterstützt werden;


Kompatibilitätsliste

TS6500 | TwinCAT PLC Lib: IEC 60870-5-101 Zentralstation (master)

Kompatibilitätsliste nach IEC 60870-5-101

für TwinCAT SPS Bibliothek: IEC 60870-5-101 Zentralstation (master).

Version: 1.1
Datum: 25.03.2011

Hier können Sie die Kompatibilitätsliste öffnen/abspeichern (gezipptes PDF).

Inhaltsverzeichniss:

  • Allgemeine Informationen

    • Projektinformationen

  • Kompatibilität

    • System oder Gerät
    • Netzkonfiguration
    • Physikalische Schicht
    • Verbindungsschicht
    • Anwendungsschicht
    • Auswahl genormter ASDU's
      • Prozessinformation in Überwachungsrichtung
      • Prozessinformation in Steuerungsrichtung
      • Systeminformation in Überwachungsrichtung
      • Systeminformation in Steuerungsrichtung
      • Parameter in Steuerungsrichtung
      • Dateiübermittlung
  • Grundlegende Anwendungsfunktionen
    • Stationsinitialisierung
    • Zyklische Datenübertragung
    • Abrufprozedur
    • Spontane Übertragung,
    • Doppelübertragung
    • Stationsabfrage
    • Uhrzeitsynchronisation
    • Befehlsübertragung
    • Zählerabfrage
    • Laden eines Parameters
    • Parameter für Aktivierung
    • Prüfprozedur
    • Dateiübermittlung
    • Hintergrundabfrage
    • Telegrammlaufzeiterfassung

  • Anhang

    • Beckhoff Support und Service
      • Beckhoff Support
      • Beckhoff Service
      • Beckhoff Firmenzentrale

Allgemeine Informationen

In dieser Kompatibilitätsliste finden Sie die unterstützten Funktionen innerhalb der IEC 870-5-101.

Die Kompatibilität der einzelnen Komponenten muß von allen Beteiligten für das jeweilige Projekt vereinbart werden.

Projektinformationen

Projekt-Nr.: ______________________________________________________________________________

Projekt: ______________________________________________________________________________

Zuständig: ______________________________________________________________________________

Datum: ______________________________________________________________________________

Kompatibilität

Die ausgewählten Parameter sollten in den weißen Kontrollfeldern wie folgt markiert werden:

Funktion oder ASDU wird nicht benutzt
Funktion oder ASDU wird wie genormt benutzt (Vorzugswert)
Funktion oder ASDU wird im Umkehrmodus benutzt
Funktion oder ASDU wird im Regel- und Umkehrmodus benutzt

System oder Gerät

Systemfestlegung
Festlegungen für die Zentralstation (MASTER)
Festlegungen für die Unterstation

Netzkonfiguration

End-End-Konfiguration [en: Point-to-point] | Linienkonfiguration [en: Multipoint-partyline]
Mehrfach-End-End-Konfiguration [en: Multiple point-to-point] | Sternkonfiguration [en: Multipoint-star]

Physikalische Schicht

Übertragungsgeschwindigkeit:

100 bit/s | 2400 bit/s | 56000 bit/s
200 bit/s | 4800 bit/s | 64000 bit/s
300 bit/s | 9600 bit/s |
600 bit/s | 19200 bit/s |
1200 bit/s | 38400 bit/s |

Verbindungsschicht

Nach dieser Anwendungsbezogenen Norm werden ausschließlich Telegrammformat FT 1.2, Einzelzeichen 1

und das feste Zeitüberwachungsintervall benutzt.

Adressfeld der Verbindungsschicht:

Nicht vorhanden (nur symmetrische Übertragung)
Ein Oktett
Zwei Oktette
Strukturiert
Unstrukturiert

Übertragungsprozedur der Verbindungsschicht:

Symmetrische Übertragung
Unsymmetrische Übertragung

Telegrammlänge:

Maximale Länge L 255

Wird unsymetrisch übertragen, werden die folgenden ASDU's als Anwenderdaten mit den angegebenen Übertragungsursachen mit der Datenklasse 2 (niedrige Priorität) zurückgesendet.

Die genormte Zuweisung von ASDU zur Datenklasse 2 wird wie folgt angewendet:
Typkennung | Übertragungsursache

Eine spezielle Zuweisung von ASDU zur Datenklasse 2 wird wie folgt angewendet:
Typkennung | Übertragungsursache

ANMERKUNG: Als Antwort auf eine Anforderung nach Daten der Klasse 2 darf eine Unterstation Daten der Datenklasse 1 übertragen, wenn keine Daten der Datenklasse 2 vorhanden sind (konfigurierbar).

Anwendungsschicht

Übertragungsbetriebsart für Anwendungsdaten

Nach dieser Anwendungsbezogenen Norm wird ausschließlich Betriebsart 1 (niedrigstwertiges Oktett

zuerst) nach 4.10 von IEC 60870-5-4 benutzt.

Gemeinsame Adresse der ASDU

Ein Oktett Zwei Oktette

Adresse des Informationsobjekts

Ein Oktett | Strukturiert
Zwei Oktette | Unstrukturiert
Drei Oktette |

Übertragungsursache

Ein Oktett Zwei Oktette (mit Herkunftsadresse).

Mit 0 vorbesetzt, falls Herkunftsadresse nicht vorhanden.

Auswahl genormter ASDU

Prozessinformation in Überwachungsrichtung

<1> := Einzelmeldung | M_SP_NA_1
<2> := Einzelmeldung mit Zeitmarke | M_SP_TA_1
<3> := Doppelmeldung | M_DP_NA_1
<4> := Doppelmeldung mit Zeitmarke | M_DP_TA_1
<5> := Stufenstellungsmeldung | M_ST_NA_1
<6> := Stufenstellungsmeldung mit Zeitmarke | M_ST_TA_1
<7> := Bitmuster von 32 bit | M_BO_NA_1
<8> := Bitmuster von 32 bit mit Zeitmarke | M_BO_TA_1
<9> := Messwert, normierter Wert | M_ME_NA_1
<10> := Messwert, normierter Wert mit Zeitmarke | M_ME_TA_1
<11> := Messwert, skalierter Wert | M_ME_NB_1
<12> := Messwert, skalierter Wert mit Zeitmarke | M_ME_TB_1
<13> := Messwert, verkürzte Gleitkommazahl | M_ME_NC_1
<14> := Messwert, verkürzte Gleitkommazahl mit Zeitmarke | M_ME_TC_1
<15> := Zählwerte | M_IT_NA_1
<16> := Zählwerte mit Zeitmarke | M_IT_TA_1
<17> := Schutzereignis mit Zeitmarke | M_EP_TA_1
<18> := Geblockte Anregungen des Schutzes mit Zeitmarke | M_EP_TB_1
<19> := Geblockte Auslösungen des Schutzes mit Zeitmarke | M_EP_TC_1
<20> := Geblockte Einzelmeldungen mit Zustandsanzeige | M_PS_NA_1
<21> := Messwert, normierter Wert ohne Qualitätskennung | M_ME_ND_1
<30> := Einzelmeldung mit Zeitmarke CP56Time2a | M_SP_TB_1
<31> := Doppelmeldung mit Zeitmarke CP56Time2a | M_DP_TB_1
<32> := Stufenstellungsmeldung mit Zeitmarke CP56Time2a | M_ST_TB_1
<33> := Bitmuster von 32 bit mit Zeitmarke CP56Time2a | M_BO_TB_1
<34> := Messwert, normierter Wert mit Zeitmarke CP56Time2a | M_ME_TD_1
<35> := Messwert, skalierter Wert mit Zeitmarke CP56Time2a | M_ME_TE_1
<36> := Messwert, verkürzte Gleitkommazahl mit Zeitmarke CP56Time2a | M_ME_TF_1
<37> := Zählwerte mit Zeitmarke CP56Time2a | M_IT_TB_1
<38> := Schutzereignis mit Zeitmarke CP56Time2a | M_EP_TD_1
<39> := Geblockte Anregungen des Schutzes mit Zeitmarke CP56Time2a | M_EP_TE_1
<40> := Geblockte Auslösungen des Schutzes mit Zeitmarke CP56Time2a | M_EP_TF_1

Prozessinformation in Steuerungsrichtung

<45> := Einzelbefehl | C_SC_NA_1
<46> := Doppelbefehl | C_DC_NA_1
<47> := Stufenstellbefehl | C_RC_NA_1
<48> := Sollwert-Stellbefehl, normierter Wert | C_SE_NA_1
<49> := Sollwert-Stellbefehl, skalierter Wert | C_SE_NB_1
<50> := Sollwert-Stellbefehl, verkürzte Gleitkommazahl | C_SE_NC_1
<51> := Bitmuster von 32 bit | C_BO_NA_1
<58> := Einzelbefehl mit Zeitmarke CP56Time2a | C_SC_TA_1
<59> := Doppelbefehl mit Zeitmarke CP56Time2a | C_DC_TA_1
<60> := Stufenstellbefehl mit Zeitmarke CP56Time2a | C_RC_TA_1
<61> := Sollwert-Stellbefehl, normierter Wert mit Zeitmarke CP56Time2a | C_SE_TA_1
<62> := Sollwert-Stellbefehl, skalierter Wert mit Zeitmarke CP56Time2a | C_SE_TB_1
<63> := Sollwert-Stellbefehl, verkürzte Gleitkommazahl mit Zeitmarke CP56Time2a | C_SE_TC_1
<64> := Bitmuster von 32 bit mit Zeitmarke CP56Time2a | C_BO_TA_1

Systeminformation in Überwachungsrichtung

<70> := Initialisierungsende M_EI_NA_1

Systeminformation in Steuerungsrichtung

<100>:= (Stations-)Abfragebefehl | C_IC_NA_1
<101>:= Zählerabfragebefehl | C_CI_NA_1
<102>:= Abfragebefehl (Lesebefehl) | C_RD_NA_1
<103>:= Uhrzeit-Synchronisationsbefehl | C_CS_NA_1
<104>:= Prüfbefehl | C_TS_NA_1
<105>:= Prozess-Rücksetzbefehl | C_RP_NA_1
<106>:= Befehl zur Telegrammlaufzeit-Erfassung | C_CD_NA_1
<107>:= Prüfbefehl mit Zeitstempel CP56Time2a | C_TS_TA_1

Parameter in Steuerungsrichtung

<110>:= Parameter für Messwerte, normierter Wert | P_ME_NA_1
<111>:= Parameter für Messwerte, skalierter Wert | P_ME_NB_1
<112>:= Parameter für Messwerte, verkürzte Gleitkommazahl | P_ME_NC_1
<113>:= Parameter für Aktivierung | P_AC_NA_1

Dateiübermittlung

<120>:= Datei bereit | F_FR_NA_1
<121>:= Abschnitt bereit | F_SR_NA_1
<122>:= Abfrage Dateiverzeichnis, -auswahl, -abfrage, Abschnittsabfrage | F_SC_NA_1
<123>:= Letzter Abschnitt, letztes Segment | F_LS_NA_1
<124>:= Dateibestätigung, Abschnittsbestätigung | F_AF_NA_1
<125>:= Segment | F_SG_NA_1
<126>:= Dateiverzeichnis [leer oder X , nur in Überwachungsrichtung verfügbar (regulär)] | F_DR_TA_1

Zuweisungen der Übertragungsursachen zu den Typkennungen (stationsbezogene Parameter)

Markierung der Kombination Typkennung / Übertragungsursache mit:

Schattiert | Funktion oder ASDU wird nicht benötigt
Leer | Funktion oder ASDU wird nicht angewendet
 | Nur in der Normrichtung angewendet
 | Nur in der Umkehrrichtung angewendet
 | In beiden Richtungen angewendet

Übertragungsursachen

Nummer | Übertragungsursache
<0> | Not used
<1> | Periodic, cyclic
<2> | Background scan
<3> | Spontaneous
<4> | Initialized
<5> | Request or requested
<6> | Activation (ACT)
<7> | Activation confirmation (ACTCON)
<8> | Deactivation (DEACT)
<9> | Deactivation confirmation (DEACTCON)
<10> | Activation termination (ACTTERM)
<11> | Return information caused by a remote command
<12> | Return information caused by a local command
<13> | File transfer
<20..36> | General interrogation
<37..41> | Counter interrogation
<44> | Unknown type identification
<45> | Unknown cause of transmission
<46> | Unknown address of ASDU
<47> | Unknown information object address

Typkennnung |  | Übertragungsursache
 |  | <1> | <2> | <3> | <4> | <5> | <6> | <7> | <8> | <9> | <10> | <11> | <12> | <13> | <20..36> | <37..41> | <44> | <45> | <46> | <47>
 |  | p e r / c y c | b a c k | s p o n t | i n i t | r e q | a c t | a c t c o n | d e a c t | d e a c t c o n | a c t t e r m | r e t r e m | r e t l o c | f i l e | i n r o | r e q c o | u n k n o w n t y p e | u n k n o w n C O T | u n k n o w n C A A | u n k n o w n I O A
<1> | M_SP_NA_1 |  | X | X |  |  |  |  |  |  |  | X |  |  | X |  |  |  |  |
<2> | M_SP_TA_1 |  |  | X |  |  |  |  |  |  |  | X |  |  |  |  |  |  |  |
<3> | M_DP_NA_1 |  | X | X |  |  |  |  |  |  |  | X |  |  | X |  |  |  |  |
<4> | M_DP_TA_1 |  |  | X |  |  |  |  |  |  |  | X |  |  |  |  |  |  |  |
<5> | M_ST_NA_1 |  | X | X |  |  |  |  |  |  |  | X |  |  | X |  |  |  |  |
<6> | M_ST_TA_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<7> | M_BO_NA_1 |  | X | X |  |  |  |  |  |  |  |  |  |  | X |  |  |  |  |
<8> | M_BO_TA_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<9> | M_ME_NA_1 | X | X | X |  |  |  |  |  |  |  |  |  |  | X |  |  |  |  |
<10> | M_ME_TA_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<11> | M_ME_NB_1 | X | X | X |  |  |  |  |  |  |  |  |  |  | X |  |  |  |  |
<12> | M_ME_TB_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<13> | M_ME_NC_1 | X | X | X |  |  |  |  |  |  |  |  |  |  | X |  |  |  |  |
<14> | M_ME_TC_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<15> | M_IT_NA_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  | X |  |  |  |
<16> | M_IT_TA_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  | X |  |  |  |
<17> | M_EP_TA_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<18> | M_EP_TB_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<19> | M_EP_TC_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<20> | M_PS_NA_1 |  | X | X |  |  |  |  |  |  |  | X |  |  | X |  |  |  |  |
<21> | M_ME_ND_1 | X | X | X |  |  |  |  |  |  |  |  |  |  | X |  |  |  |  |
<30> | M_SP_TB_1 |  |  | X |  |  |  |  |  |  |  | X |  |  |  |  |  |  |  |
<31> | M_DP_TB_1 |  |  | X |  |  |  |  |  |  |  | X |  |  |  |  |  |  |  |
<32> | M_ST_TB_1 |  |  | X |  |  |  |  |  |  |  | X |  |  |  |  |  |  |  |
<33> | M_BO_TB_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<34> | M_ME_TD_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<35> | M_ME_TE_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<36> | M_ME_TF_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<37> | M_IT_TB_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  | X |  |  |  |
<38> | M_EP_TD_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<39> | M_EP_TE_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<40> | M_EP_TF_1 |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<45> | C_SC_NA_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<46> | C_DC_NA_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<47> | C_RC_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<48> | C_SE_NA_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<49> | C_SE_NB_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<50> | C_SE_NC_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<51> | C_BO_NA_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<58> | C_SC_TA_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<59> | C_DC_TA_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<60> | C_RC_TA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<61> | C_SE_TA_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<62> | C_SE_TB_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<63> | C_SE_TC_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<64> | C_BO_TA_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<70> | M_EI_NA_1 |  |  |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<100> | C_IC_NA_1 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<101> | C_CI_NA_1 |  |  |  |  |  | X | X |  |  | X |  |  |  |  |  | X | X | X | X
<102> | C_RD_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<103> | C_CS_NA_1 |  |  | X |  |  | X | X |  |  |  |  |  |  |  |  | X | X | X | X
<104> | C_TS_NA_1 |  |  |  |  |  | X | X |  |  |  |  |  |  |  |  | X | X | X | X
<105> | C_RP_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<106> | C_CD_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<107> | C_TS_TA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
<110> | P_ME_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<111> | P_ME_NB_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<112> | P_ME_NC_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<113> | P_AC_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<120> | F_FR_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<121> | F_SR_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<122> | F_SC_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<123> | F_LS_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<124> | F_AF_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<125> | F_SG_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<126> | F_DR_TA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |

Grundlegende Anwendungsfunktionen

Stationsinitialisierung

Remote initialzation

Zyklische Datenübertragung

Zyklische Datenübertragung

Abrufprozedur

Abrufprozedur

Spontane Übertragung

Spontane Übertragung

Doppelübertragung von Informationsobjekten mit der Übertragungsursache spontan

Die folgenden Typkennungen dürfen nacheinander in Folge eines einzigen Zustandswechsels eines Informa-

tionsobjekts, übertragen werden. Die einzelnen Adressen der Informationsobjekte, die für die Doppelübertra-

gung vorgesehen sind, werden in einer projektbezogenen Liste festgelegt.

Einzelmeldung M_SP_NA_1, M_SP_TA_1, M_SP_TB_1 und M_SP_NA_1
Doppelmeldung M_DP_NA_1, M_DP_TA_1 und M_DP_TB_1
Stufenstellungsmeldung M_ST_NA_1, M_ST_TA_1 und M_ST_TB_1
Bitmuster von 32 bit M_BO_NA_1, M_BO_TA_1 und M_BO_TB_1
Messwert, normierter Wert M_ME_NA_1, M_ME_TA_1, M_ME_ND_1 und M_ME_TD_1
Messwert, skalierter Wert M_ME_NB_1, M_ME_TB_1 und M_ME_TE_1
Messwert, verkürzte Gleitkommazahl M_ME_NC_1, M_ME_TC_1 und M_ME_TF_1

Stationsabfrage

Global
Gruppe 1
Gruppe 2
Gruppe 3
Gruppe 4
Gruppe 5
Gruppe 6
Gruppe 7
Gruppe 8
Gruppe 9
Gruppe 10
Gruppe 11
Gruppe 12
Gruppe 13
Gruppe 14
Gruppe 15
Gruppe 16

Die Zuweisung der Adressen der Informationsobjekte zu jeder einzelnen Gruppe muss in einer getrennten Tabelle festgelegt werden .

Uhrzeitsynchronisation

Uhrzeitsynchronisation

Befehlsübertragung

Direkte Befehlsübertragung
Direkte Sollwert-Befehlsübertragung
Befehl .Anwahl und Ausführung
Sollwertbefehl .Anwahl und Ausführung
C_SE ACTTERM angewendet
Keine zusätzliche Festlegung
Kurze Befehlsausführungsdauer (Ausführungsdauer durch einen Systemparameter in Unterstation bestimmt)
Lange Befehlsausführungsdauer (Ausführungsdauer durch einen Systemparameter in Unterstation bestimmt)
Dauerbefehl
Überwachung der maximalen Verzögerung von Befehlen und Sollwertbefehlen in Befehlsrichtung
Maximal zulässige Verzögerung von Befehlen und Sollwertbefehlen

Übertragung von Zählwerten

Zählerabfrage
Zähler umspeichern ohne Rücksetzen
Zähler umspeichern mit Rücksetzen
Zähler rücksetzen
Allgemeine Zählerabfrage
Zählerabfrage Gruppe 1
Zählerabfrage Gruppe 2
Zählerabfrage Gruppe 3
Zählerabfrage Gruppe 4
Modus A: Örtliches Umspeichern mit spontaner Übertragung
Modus B: Örtliches Umspeichern mit Zählerabfrage
Modus C: Umspeichern und Übertragen durch Zähler-Abfrage bei Umspeichern und Übertragen durch Zählerabfragebefehle
Modus D: Umspeichern durch Zähler-Abfragebefehl, umgespeicherte Werte werden spontan übertragen

Laden eines Parameters

Schwellenwert
Glättungsfaktor
Unterer Grenzwert für Messwertübertragung
Oberer Grenzwert für Messwertübertragung

Parameter für Aktivierung

Act/deact der zyklischen oder periodischen Übertragung des adressierten Objekts

Prüfprozedur

Prüfprozedur

Dateiübermittlung

Dateiübermittlung in Überwachungsrichtung:

Transparente Datei
Übermittlung von Ereignisfolgen
Übermittlung von Störfalldaten aus Schutzeinrichtungen
Übermittlung von Folgen aufgezeichneter Analogwerte

Dateiübermittlung in Steuerungsrichtung

Transparente Datei

Hintergrundabfrage

Hintergrundabfrage

Telegrammlaufzeit-Erfassung

Telegrammlaufzeit-Erfassung

Anhang

Beckhoff Support und Service

Beckhoff und seine weltweiten Partnerfirmen bieten einen umfassenden Support und Service, der eine schnelle und kompetente Unterstützung bei allen Fragen zu Beckhoff Produkten und Systemlösungen zur Verfügung stellt.

Der Beckhoff Support und Service steht ihnen weltweit zur Verfügung und ist über Telefon, Fax oder E-Mail erreichbar. Die Kontaktadressen ihres Landes entnehmen Sie bitte der Liste der Beckhoff Niederlassungen und Partnerfirmen.

Beckhoff Support

Der Support bietet Ihnen einen umfangreichen technischen Support, der Sie nicht nur bei dem Einsatz einzelner Beckhoff Produkte, sondern auch bei weiteren umfassenden Dienstleistungen unterstützt:

  • Weltweiter Support;
  • Planung, Programmierung und Inbetriebnahme komplexer Automatisierungssysteme;
  • Umfangreiches Schulungsprogramm für Beckhoff Systemkomponenten;

Hotline: + 49 (0) 5246/963-157
Fax: + 49 (0) 5246/963-9157
E-Mail: support@beckhoff.com

Beckhoff Service

Das Beckhoff Service Center unterstützt Sie rund um den After-Sales-Service:

  • Vor-Ort-Service;
  • Reparaturservice;
  • Ersatzteilservice;
  • Hotline-Service

Hotline: + 49 (0) 5246/963-460
Fax: + 49 (0) 5246/963-479
E-Mail: service@beckhoff.com

Weitere Support- und Service-Adressen entnehmen Sie bitte unseren Internetseiten, unter http://www.beckhoff.de. Dort finden Sie auch Dokumentation zu Beckhoff Komponenten.

Beckhoff Firmenzentrale

Beckhoff Automation
Eiserstr. 5
33415 Verl
Germany

Telefon: + 49 (0) 5246/963-0
Fax: + 49 (0) 5246/963-198
E-Mail: info@beckhoff.de
Web: www.beckhoff.de


Quick Start

Einfache Projekte mit kompletten Sourcen finden Sie hier: IEC60870-5-101 Zentralstation.

Kompatibilitätsliste finden Sie hier: Interoperability check list

Übersicht der Fehlercodes finden Sie hier: Fehlercodes

Eine ausführliche Anleitung zur Implementierung der Zentralstation in der SPS finden Sie hier: TUTORIAL

Kurzanleitung

Applikationsobjekt-Datenbank

Die Applikationsobjekt-Datenbank der Zentralstation muss mit der Funktion: F_iecCreateTableHnd als Hash-Tabelle konfiguriert werden. Die einzelnen Arrayelemente werden dabei als Hash-Tabelle untereinander verlinkt. Dies ermöglicht u. a. einen schnelleren Zugriff auf die einzelnen Datenpunkte, bringt aber auch einige Nachteile mit sich, die beachtet werden müssen:

  • Die Größe der Applikationsdatenbank (Arraygröße) darf nicht zur Laufzeit (z.B. durch Online-Change) verändert werden. Die Zentralstation stoppt sofort die Ausführung und meldet einen Fehler. Der Grund: Die Verlinkung der Hash-Tabelle passt nicht mehr. Bei Programmänderungen laden Sie am besten das komplette Projekt ins Laufzeitsystem.
  • Auf die einzelnen Array-Elemente darf nicht per Index sondern nur mit Hilfe der speziellen Funktionen zugegriffen werden (z.B.: F_iecAddTableEntry usw. ).
  • Bei einem indizierten Zugriff auf die Tabellenelemente dürfen die internen Konfigurationsparameter nicht beschrieben oder verändert werden. Bei einer Änderung des Typs, der ASDU-Adresse oder der Objektadresse kann der Datenpunkt nicht mehr gefunden werden. Ein Datenpunkt, der umkonfiguriert werden soll wird aus der Tabelle durch den Funktionsaufruf F_iecRemoveTableEntry zuerst entfernt. Danach kann der neue Datenpunkt hinzugefügt werden.

Bei einer Implementierung als lineare Tabelle müsste die Zentralstation bei jeder empfangenen ASDU (Dateneinheit) das komplette Array nach dem passendem Element durchsuchen. Dies würde bei vielen Datenpunkten sehr lange Ausführungszeiten generieren.

Protokollparameter

Die meisten Protokollparameter sind bereits mit Defaultwerten vorbelegt und müssen nicht explizit gesetzt werden.

Systemparameter

Die Systemparameter sind ebenfalls mit Defaultwerten vorbelegt. Während der Inbetriebnahme ist es nützlich die Debug-Ausgabe zu aktivieren (dbgMode) um mögliche Fehler lokalisieren zu können.

Parameter für die zyklische Datenerfassung

Folgende Parameter sind bereits mit Defaultwerten vorkonfiguriert:

  • Initialisierungssequence (besteht aus einem Testbefehl, Uhrzeitsynchronisation, Stationsabfrage und Zählerabfrage);
  • Zyklische Befehle:
    • Testbefehl alle 60s;
    • Uhrzeitsynchronisation alle 60s;
    • Stationsabfrage der Gruppe: Allgemein alle 60s;
    • Zählerabfrage der Gruppe: Allgemein alle 60s;


Einführung: Übersicht

TS6500 | TwinCAT PLC Lib: IEC 60870-5-101 Zentralstation (master)

Einführung (Tutorial)

Die Einführung ist eine Anleitung wie Sie in der TwinCAT SPS eine IEC60870-5-101 Zentralstation (master) implementieren und konfigurieren können.

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro


Einführung: Glossar

Glossar

Begriff | Beschreibung
Unterstation, Slave, Server | Synonyme für eine untergeordnete Station (sie wird überwacht)
Zentralstation, Leitstation, Master, Client | Synonyme für eine übergeordnete Station (Leitstation, sie überwacht andere Stationen)
Steuerungsrichtung | Datenübertragungsrichtung von der Zentralstation zur Unterstation
Überwachungsrichtung | Datenübertragungsrichtung von der Unterstation zur Zentralstation
Applikationsobjekte | IEC-Informationsobjekte in der TwinCAT SPS-Applikation (Single Points, Double Points, Measured Values, Short Floating Point Values usw. )
APDU | Protokolldateneinheit der Anwendungsschicht (application protocol data unit)
APCI | Protokolsteuerinformation der Anwendungsschicht (application protocol control information)
ASDU | Dienstdateneinheit der Anwendungsschicht (application service data unit)
IOA, Addresse des Informationsobjekts | Adresse des Single Points, Double Points usw. (information object address)
Primärstation | Die Primärstation sendet Befehle (Anfragen) an die Sekundärstation und steuert/kontrolliert so die Datenübertragung der Sekundärstation.
Sekundärstation | Die Sekundärstation antwortet auf die Anfragen der Primärstation.
Kombinierte Station | Kombinierte Stationen können die Rolle der Primärstation und Sekundärstation annehmen (symetrische Übertragung, balanced mode).
Symetrische Übertragung (balanced mode) | Beide Stationen können als Primärstation oder Sekundärstation agieren und die Datenübertragung initialisieren.
Unsymetrische Übertragung (unbalanced mode) | Die Datenübetragung wird immer durch die Primärstation initiert und gesteuert. Die Zentralstation agiert immer als Primärstation und die Unterstation als Sekundärstation.


Einführung: Neues Projekt

SPS-Projekt anlegen, SPS-Bibliotheken einbinden

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

  1. Starten Sie TwinCAT PLC Control.
  2. Mit Datei -> Neu legen Sie ein neues SPS-Projekt an. Wählen Sie als Zielsystem PC or CX (x86, ARM).
  3. Als nächstes wird automatisch ein neuer Programmbaustein MAIN angelegt. Wählen Sie als Sprache des Bausteins ST (Strukturierter Text). Bestätigen Sie dies. Nennen Sie den MAIN Programmbaustein in P_MAIN_LowSpeed um.
  4. Fügen Sie ein weiteres Programmbaustein hinzu und nennen diesen P_SerialComm_HighSpeed.
  5. Konfigurieren Sie in der Taskkonfiguration 2 Tasks, eine schnelle (T#1ms) und eine langsame (T#10ms). Ordnen Sie den Programmbaustein P_MAIN_HighSpeed der schnellen Task und den P_MAIN_LowSpeed der langsamen Task (siehe Bild).

  6. Aus dem Menü wählen Sie Fenster -> Bibliotheksverwaltung und dann Einfügen -> Weitere Bibliothek...
  7. Aus der Liste der TwinCAT Bibliotheken wählen Sie TcIEC870_5_101Master.Lib aus und bestätigen dies.


Einführung: Die schnelle SPS-Task

Die schnelle SPS-Task

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro.

Fügen Sie im Deklarationsteil folgenden SPS-Code hinzu:

PROGRAM P_SerialComm_HighSpeed
VAR
     fbSerialLineCtrl        : FB_IEC870_SerialLineCtrl := (
                                Mode            := SERIALLINEMODE_PC_COM_PORT, (*SERIALLINEMODE_KL6_5B_STANDARD *)
                                Baudrate        := 19200,
                                NoDatabits      := 8,
                                Parity          := PARITY_EVEN,
                                Stopbits        := 1,
                                Handshake       := HANDSHAKE_NONE,
                                ContinousMode   := FALSE );

        serial_in               AT%IB4000       : PcComInData;
        serial_out      AT%QB4000       : PcComOutData;

        KL6_in          AT%IB4100       : KL6inData5B;
        KL6_out         AT%QB4100       : KL6outData5B;

        hSerial         : T_HSERIALCTRL;
END_VAR

und im Programmcode:

      fbSerialLineCtrl(       pComIn          := SEL( fbSerialLineCtrl.Mode = SERIALLINEMODE_KL6_5B_STANDARD, ADR( serial_in ), ADR( KL6_in ) ),
                                        pComOut         := SEL( fbSerialLineCtrl.Mode = SERIALLINEMODE_KL6_5B_STANDARD, ADR( serial_out ), ADR( KL6_out ) ),
                                        SizeComIn       := SEL( fbSerialLineCtrl.Mode = SERIALLINEMODE_KL6_5B_STANDARD, SIZEOF( serial_in ), SIZEOF( KL6_in ) ),
                                        hSerial         := hSerial );

Eine zu diesem Beispiel passende TwinCAT System Manager Konfiguration finden Sie auf der Beispiele-Übersichtsseite. DIe Mode-Variable kann dazu verwendet werden um zwischen zwei Kommunikationswegen umzuschalten.

Kommunikation über die standard PC COMx-Schnittstellen

  • In diesem Fall wird der Mode-Parameter auf den Wert: SERIALLINEMODE_PC_COM_PORT gesetzt.
  • Im TwinCAT System Manager werden die serial_in- und serial_out- Variablen mit den entsprechenden IO-Variablen der seriellen Schnittstelle verknüpft.
  • Die Schnittstelle wird und muss im TwinCAT System Manager konfiguriert werden (Baudrate, Parity usw.). Andere Kommunikationsparameter an dem FB_IEC870_SerialLineCtrl-Funktionsbaustein sind in diesem Mode irrelevant.

Kommunikation über die seriellen Beckhoff Busklemmen KL6xxx

  • In diesem Fall wird der Mode-Parameter auf den Wert: SERIALLINEMODE_KL6_5B_STANDARD gesetzt.
  • Im TwinCAT System Manager werden die KL6_in - und KL6_out - Variablen mit den entsprechenden I/O-Variablen der seriellen Klemme KL6xxx verknüpft.
  • Die Schnittstelle wird in der TwinCAT SPS durch die Instanz des FB_IEC870_SerialLineCtrl-Funktionsbausteins konfiguriert. Die Kommunikationsparameter wie Baudrate, Parity usw. sind an diesem Baustein einzustellen.

Kommunikation über die seriellen Beckhoff Busklemmen EL6xxx

PROGRAM P_SerialComm_HighSpeed
VAR
        fbSerialLineCtrl : FB_IEC870_SerialLineCtrl := ( Mode := SERIALLINEMODE_EL6_22B );

        EL6_in AT%IB4100 : EL6inData22B;
        EL6_out AT%QB4100 : EL6outData22B;
        hSerial : T_HSERIALCTRL;
END_VAR

fbSerialLineCtrl( pComIn := ADR( EL6_in ),
                pComOut := ADR( EL6_out ),
                SizeComIn := SIZEOF( EL6_in ),
                hSerial := hSerial );
  • In diesem Fall wird der Mode-Parameter auf den Wert: SERIALLINEMODE_EL6_22B gesetzt.
  • Im TwinCAT System Manager werden die EL6_in - und EL6_out - Variablen mit den entsprechenden I/O-Variablen der seriellen Klemme EL6xxx verknüpft.
  • Die Schnittstelle wird und muss im TwinCAT System Manager konfiguriert werden (Baudrate, Parity usw.). Andere Kommunikationsparameter an dem FB_IEC870_SerialLineCtrl-Funktionsbaustein sind in diesem Mode irrelevant.


Einführung: AODB

Applikationsobjekt-Datenbank der Zentralstation definieren und konfigurieren

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

Applikationsobjekte = Single Points, Double Points, Measured Values, Short Floating Point Values usw.

In diesem Beispiel wurden die Befehle so konfiguriert, dass die Prozessdaten in Steuerungsrichtung (Befehle) im gleichen Speicherbereich aber auf einem anderen Byte-/Bit-Offset wie die Daten der Information in Überwachungsrichtung liegen. Sie können aber auch die Befehle auf den gleichen Byte- Bit-Offset wie die Information in Überwachungsrichtung legen.

Beispiel:
C_SC_NA_1 mit IOA = 10 auf den gleichen Byte- und Bit-Offset wie M_SP_NA_1 mit IOA = 100 (beide Byte-Offset = 100 und Bit-Offset = 0). Bei einer Wertänderung von M_SP_NA_1 wird ein neues C_SC_NA_1-Kommando ausgelöst.

Als Beispiel konfigurieren wir in dem Einführungsprojekt folgende Applikationsobjekte:

ASDU identifier | Objektadresse IOA | Group-Konfigurationsparameter | Basiszeitmultiplikator | SPS-Prozessdatenbereich | Offset Byte | Offset Bit | Prozessdatenbreite in der TwinCAT SPS
M_SP_NA_1 | 100 | Generalabfrage | 0 | Merker | 100 | 0 | 1 Bit
M_SP_TA_1 | 101 | Generalabfrage | 0 | Merker | 100 | 1 | 1 Bit
M_SP_TB_1 | 102 | Generalabfrage | 0 | Merker | 100 | 2 | 1 Bit
M_DP_NA_1 | 200 | Generalabfrage | 0 | Merker | 200 | 0 | 2 Bits
M_DP_TA_1 | 201 | Generalabfrage | 0 | Merker | 200 | 2 | 2 Bits
M_DP_TB_1 | 202 | Generalabfrage | 0 | Merker | 200 | 4 | 2 Bits
M_ST_NA_1 | 300 | Generalabfrage | 0 | Merker | 300 | 0 | 1 Byte
M_ST_TA_1 | 301 | Generalabfrage | 0 | Merker | 301 | 0 | 1 Byte
M_ST_TB_1 | 302 | Generalabfrage | 0 | Merker | 302 | 0 | 1 Byte
M_BO_NA_1 | 400 | Generalabfrage | 0 | Merker | 400 | 0 | 4 Byte
M_BO_TA_1 | 401 | Generalabfrage | 0 | Merker | 404 | 0 | 4 Byte
M_BO_TB_1 | 402 | Generalabfrage | 0 | Merker | 408 | 0 | 4 Byte
M_ME_NA_1 | 500 | Generalabfrage | 0 | Merker | 500 | 0 | 2 Byte
M_ME_TA_1 | 501 | Generalabfrage | 0 | Merker | 502 | 0 | 2 Byte
M_ME_TD_1 | 502 | Generalabfrage | 0 | Merker | 504 | 0 | 2 Byte
M_ME_NB_1 | 600 | Generalabfrage | 0 | Merker | 600 | 0 | 2 Byte
M_ME_TB_1 | 601 | Generalabfrage | 0 | Merker | 602 | 0 | 2 Byte
M_ME_TE_1 | 602 | Generalabfrage | 0 | Merker | 604 | 0 | 2 Byte
M_ME_NC_1 | 700 | Generalabfrage | 0 | Merker | 700 | 0 | 4 Byte
M_ME_TC_1 | 701 | Generalabfrage | 0 | Merker | 704 | 0 | 4 Byte
M_ME_TF_1 | 702 | Generalabfrage | 0 | Merker | 708 | 0 | 4 Byte
M_IT_NA_1 | 800 | Generalzählerabfrage und Mode A (lokal Umspeichern mit Spontanübertragung alle 15s) | 0 | Merker | 800 | 0 | 4 Byte
M_IT_TA_1 | 801 | Generalzählerabfrage und Mode A (lokal Umspeichern mit Spontanübertragung alle 15s) | 0 | Merker | 804 | 0 | 4 Byte
M_IT_TB_1 | 802 | Generalzählerabfrage und Mode A (lokal Umspeichern mit Spontanübertragung alle 15s) | 0 | Merker | 808 | 0 | 4 Byte
Commands |  |  |  |  |  |  |
C_SC_NA_1 | 10 | - | 0 | Merker | 2100 | 0 | 1 Bit
C_SC_NA_1 | 11 | - | 0 | Merker | 2100 | 1 | 1 Bit
C_SC_TA_1 | 12 | - | 0 | Merker | 2100 | 2 | 1 Bit
C_DC_NA_1 | 20 | - | 0 | Merker | 2200 | 0 | 2 Bit
C_DC_NA_1 | 21 | - | 0 | Merker | 2200 | 2 | 2 Bit
C_DC_TA_1 | 22 | - | 0 | Merker | 2200 | 4 | 2 Bit
C_BO_NA_1 | 40 | - | 0 | Merker | 2400 | 0 | 4 Byte
C_BO_NA_1 | 41 | - | 0 | Merker | 2404 | 0 | 4 Byte
C_BO_TA_1 | 42 | - | 0 | Merker | 2408 | 0 | 4 Byte
C_SE_NA_1 | 50 | - | 0 | Merker | 2500 | 0 | 2 Byte
C_SE_NA_1 | 51 | - | 0 | Merker | 2502 | 0 | 2 Byte
C_SE_TA_1 | 52 | - | 0 | Merker | 2504 | 0 | 2 Byte
C_SE_NB_1 | 60 | - | 0 | Merker | 2600 | 0 | 2 Byte
C_SE_NB_1 | 61 | - | 0 | Merker | 2602 | 0 | 2 Byte
C_SE_TB_1 | 62 | - | 0 | Merker | 2604 | 0 | 2 Byte
C_SE_NC_1 | 70 | - | 0 | Merker | 2700 | 0 | 4 Byte
C_SE_NC_1 | 71 | - | 0 | Merker | 2704 | 0 | 4 Byte
C_SE_TC_1 | 72 | - | 0 | Merker | 2708 | 0 | 4 Byte

Datenbankvariable deklarieren

Die Applikationsobjekt-Datenbank ist eine Array-Variable vom Typ ST_IEC870_5_101AODBEntry. Jedes Array-Element entspricht einem Applikationsobjekt. Die Array-Elemente werden aber nicht direkt, sondern nur mit Hilfe der speziell dafür zur Verfügung gestellten Funktionen und ein Datenbank-Handle (Tabellen-Handle) manipuliert. Das Datenbank-Handle muss vor der Benutzung durch einen einmaligen F_iecCreateTableHnd-Funktionsaufruf initialisiert werden. Dabei werden auch die Array-Elemente miteinander als Hash-Tabelle verknüpft. Bei einer grösseren Anzahl der Datenpunkte ermöglicht die Hash-Tabelle einen schnelleren Zugriff auf einen einzelnen Datenpunkt.

Die maximale Anzahl der Applikationsobjekte ist frei wählbar und nur durch den verfügbaren Speicher begrenzt. Sie müssen sich auf eine konstante maximale Anzahl während der SPS-Programmierung festlegen. Zur Laufzeit kann die maximale Anzahl der Applikationsobjekte nicht mehr verändert werden. In unserem Beispiel werden 50 Applikationsobjekte deklariert. Diese Anzahl reicht für die meisten Anwendungen aus. Beachten Sie, dass sehr viele Applikationsobjekte auch entsprechend viel Speicher und Laufzeit benötigen.

Definieren Sie folgende Variablen in P_MAIN_LowSpeed:

PROGRAM P_MAIN_LowSpeed
VAR
     AODB            : ARRAY[0..49] OF ST_IEC870_5_101AODBEntry;
        hTable          : T_HAODBTable;
END_VAR

Applikationsobjekte konfigurieren

Die Konfiguration der gewünschten Applikationsobjekte wird zur Programmlaufzeit durchgeführt. Während der Konfiguration werden unter anderem der Objekt-Typ ( M_SP_NA_1, M_DP_NA_1, M_ST_NA_1 usw.), die gemeinsame ASDU-Adresse, die Objekt-Adresse und weitere Objekt-Parameter festgelegt.

Nach der Initialisierung des Datenbank-Handles ist die Applikationsobjekt-Datenbank (Datenbank-Array) leer und muss mit den gewünschten Daten (Datenpunkten) gefüllt werden. Die konfiguration der Datenpunkte der Zentralstation muss der Konfiguration der Datenpunkte in der Unterstation entsprechen! D.h. in der Zentralstation müssen Datenpunkte vom gleichen Typ, gleicher gemeinsamen ASDU-Adresse und mit der gleichen Informationsobjekt-Adresse wie in der Unterstation konfiguriert werden. Andere Parameter wie z.B. das Mapping-Bereich, Byte-, Bit-Offset können beliebig konfiguriert werden.

Es stehen folgende Funktionen zur Manipulation der Applikationsdatenbank zur Verfügung:

Function | Description
F_iecCreateTableHnd | Initialisiert das Hash-Tabellenhandle
F_iecAddTableEntry | Konfiguriert und fügt einen einen neuen Hash-Tabelleneintrag
F_iecRemoveTableEntry | Entfernt einen Hash-Tabelleneintrag
F_iecLookupTableEntry | Prüft ob ein bestimmter Hash-Tabelleneintrag existiert
F_iecGetPosOfTableEntry | Ermittelt die lineare Position eines Hash-Tabelleneientrags

Das Datenbank-Handle muss an die Funktion per VAR_IN_OUT übergeben werden. Im Regelfall wird die Konfiguration beim SPS-Programmstart einmalig in einer Init-Routine durchgeführt.

Um die Applikationsobjekte beim Programmstart zu konfigurieren wird in P_MAIN_LowSpeed folgender SPS-Code hinzugefügt:

PROGRAM P_MAIN_LowSpeed
VAR
        AODB : ARRAY[0..49] OF ST_IEC870_5_101AODBEntry;
        hTable          : T_HAODBTable;

     init            : BOOL := TRUE;
        initError               : UDINT;
        asduAddr                : UDINT := 7;
END_VAR

      IF init THEN
        init := FALSE;

        initError := F_iecCreateTableHnd( ADR( AODB ), SIZEOF( AODB ), hTable );
        IF initError <> 0 THEN
                ADSLOGSTR( ADSLOG_MSGTYPE_HINT OR ADSLOG_MSGTYPE_LOG,
                        'F_iecCreateTableHnd() error: %s',
                        DWORD_TO_HEXSTR( initError, 8, FALSE ) );
                RETURN;
        END_IF

  (* Monitored Single Points *)
 initError := F_iecAddTableEntry( M_SP_NA_1, asduAddr, 100, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 100, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_SP_NA_1, asduAddr, 101, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 100, 1, 0, hTable );
        initError := F_iecAddTableEntry( M_SP_TB_1, asduAddr, 102, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 100, 2, 0, hTable );
  (* Double Points*)
 initError := F_iecAddTableEntry( M_DP_NA_1, asduAddr, 200, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 200, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_DP_NA_1, asduAddr, 201, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 200, 2, 0, hTable );
        initError := F_iecAddTableEntry( M_DP_TB_1, asduAddr, 202, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 200, 4, 0, hTable );
  (* Regulating step value *)
 initError := F_iecAddTableEntry( M_ST_NA_1, asduAddr, 300, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 300, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_ST_NA_1, asduAddr, 301, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 301, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_ST_TB_1, asduAddr, 302, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 302, 0, 0, hTable );
  (* 32 bit string *)
 initError := F_iecAddTableEntry( M_BO_NA_1, asduAddr, 400, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 400, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_BO_NA_1, asduAddr, 401, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 404, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_BO_TB_1, asduAddr, 402, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 408, 0, 0, hTable );
  (* Measured value, normalized value *)
 initError := F_iecAddTableEntry( M_ME_NA_1, asduAddr, 500, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 500, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_ME_NA_1, asduAddr, 501, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 502, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_ME_TD_1, asduAddr, 502, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 504, 0, 0, hTable );
  (* Mesured value, scaled value *)
 initError := F_iecAddTableEntry( M_ME_NB_1, asduAddr, 600, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 600, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_ME_NB_1, asduAddr, 601, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 602, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_ME_TE_1, asduAddr, 602, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 604, 0, 0, hTable );
  (* Measured value , short floating point value *)
 initError := F_iecAddTableEntry( M_ME_NC_1, asduAddr, 700, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 700, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_ME_NC_1, asduAddr, 701, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 704, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_ME_TF_1, asduAddr, 702, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 708, 0, 0, hTable );
  (* Integrated totals *)
 initError := F_iecAddTableEntry( M_IT_NA_1, asduAddr, 800, IEC870_GRP_REQCOGEN, 0, MAP_AREA_MEMORY, 800, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_IT_NA_1, asduAddr, 801, IEC870_GRP_REQCOGEN, 0, MAP_AREA_MEMORY, 804, 0, 0, hTable );
        initError := F_iecAddTableEntry( M_IT_TB_1, asduAddr, 802, IEC870_GRP_REQCOGEN, 0, MAP_AREA_MEMORY, 808, 0, 0, hTable );

  (* Single commands *)
 initError := F_iecAddTableEntry( C_SC_NA_1, asduAddr, 10, 0, 0, MAP_AREA_MEMORY, 2100, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_SC_NA_1, asduAddr, 11, 0, 0, MAP_AREA_MEMORY, 2100, 1, 0, hTable );
        initError := F_iecAddTableEntry( C_SC_TA_1, asduAddr, 12, 0, 0, MAP_AREA_MEMORY, 2100, 2, 0, hTable );
  (* Double commands *)
 initError := F_iecAddTableEntry( C_DC_NA_1, asduAddr, 20, 0, 0, MAP_AREA_MEMORY, 2200, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_DC_NA_1, asduAddr, 21, 0, 0, MAP_AREA_MEMORY, 2200, 2, 0, hTable );
        initError := F_iecAddTableEntry( C_DC_TA_1, asduAddr, 22, 0, 0, MAP_AREA_MEMORY, 2200, 4, 0, hTable );
  (* 32 bit string commands *)
 initError := F_iecAddTableEntry( C_BO_NA_1, asduAddr, 40, 0, 0, MAP_AREA_MEMORY, 2400, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_BO_NA_1, asduAddr, 41, 0, 0, MAP_AREA_MEMORY, 2404, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_BO_TA_1, asduAddr, 42, 0, 0, MAP_AREA_MEMORY, 2408, 0, 0, hTable );
  (* Set point, normalized values*)
 initError := F_iecAddTableEntry( C_SE_NA_1, asduAddr, 50, 0, 0, MAP_AREA_MEMORY, 2500, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_SE_NA_1, asduAddr, 51, 0, 0, MAP_AREA_MEMORY, 2502, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_SE_TA_1, asduAddr, 52, 0, 0, MAP_AREA_MEMORY, 2504, 0, 0, hTable );
  (* Set point, scaled valuess *)
 initError := F_iecAddTableEntry( C_SE_NB_1, asduAddr, 60, 0, 0, MAP_AREA_MEMORY, 2600, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_SE_NB_1, asduAddr, 61, 0, 0, MAP_AREA_MEMORY, 2602, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_SE_TB_1, asduAddr, 62, 0, 0, MAP_AREA_MEMORY, 2604, 0, 0, hTable );
  (* Set point, short floating point values *)
 initError := F_iecAddTableEntry( C_SE_NC_1, asduAddr, 70, 0, 0, MAP_AREA_MEMORY, 2700, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_SE_NC_1, asduAddr, 71, 0, 0, MAP_AREA_MEMORY, 2704, 0, 0, hTable );
        initError := F_iecAddTableEntry( C_SE_TC_1, asduAddr, 72, 0, 0, MAP_AREA_MEMORY, 2708, 0, 0, hTable );

END_IF


Einführung: Mapping IEC-SPS

Mapping der SPS- und IEC-Prozessdaten

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

Die TwinCAT SPS-Prozessdaten werden zur Programmlaufzeit zyklisch in die IEC-Prozessdaten (Applikationsobjekte) und umgekehrt gemappt (kopiert). Für das Mapping der IEC<->SPS Prozessdaten können bis zu 4 Prozessdatenbereiche (IO-Eingänge, IO-Ausgänge, Merkerbereich, Datenbereich ) als Puffervariablen im SPS-Programm deklariert werden. Die Bytegröße der Puffer ist frei wählbar und kann für jeden Bereich unterschiedlich gewählt werden. Unbenutzte Bereiche müssen nicht unbedingt deklariert werden.

In unserem Einführungsbeispiel deklarieren wir 4 SPS-Prozessdatenbereiche mit jeweils 3000 Bytes:

PROGRAM P_MAIN_LowSpeed
VAR
        AODB    : ARRAY[0..49] OF ST_IEC870_5_101AODBEntry;
        hTable  : T_HAODBTable;

        init    : BOOL := TRUE;
        initError       : UDINT;
        asduAddr        : UDINT := 7;

     inputs AT%IB0   : ARRAY[0..2999] OF BYTE;
        outputs AT%QB0  : ARRAY[0..2999] OF BYTE;
        memory AT%MB0   : ARRAY[0..2999] OF BYTE;
        data            : ARRAY[0..2999] OF BYTE;

END_VAR

Die Zuordnung, wie die Prozessdaten zur Laufzeit gemappt werden sollen, wird während der Konfiguration der Applikationsobjekte mit der F_iecAddTableEntry-Funktion festgelegt.

Siehe auch in: Applikationsobjekte definieren und konfigurieren.

Die Puffervariablen wurden nun als Byte-Arrays deklariert. Um auf die gewünschten Daten besser zugreifen zu können definieren wir die einzelnen Variablen ein zweites Mal und legen diese auf die entsprechenden Byte/Bit-Offsetadressen. Bei einer Änderung im Byte-Array wird die entsprechende einzelne Variable gleichzeitig geändert und umgekehrt. Dies ist aber nicht zwingend notwendig. Sie können direkt auf die Bytes/Bits der Byte-Array-Puffervariablen zugreifen.

VAR_GLOBAL(* Memory offset 0..99 unused *)
  (* Single points *)
 msgSingle_0     AT%MX100.0 : BOOL;
        msgSingle_1     AT%MX100.1 : BOOL;
        msgSingle_2     AT%MX100.2 : BOOL;

  (* Double points *)
        (*      Bit 0..1 = first double point,
                Bit 2..3 = second double point,
                Bit 4..5 = third double point,
                Bit 6..7 = fourth double point *)
        msgDouble_0     AT%MB200        : BYTE;

  (* Regulating step values *)
        msgStep_0               AT%MB300        : BYTE;
        msgStep_1               AT%MB301        : BYTE;
        msgStep_2               AT%MB302        : BYTE;

  (* 32 bit strings *)
 msgBitStr_0     AT%MD400        : DWORD;
        msgBitStr_1     AT%MD404        : DWORD;
        msgBitStr_2     AT%MD408        : DWORD;

  (* Measured values, normalized values *)
 msgNormalized_0         AT%MW500        : WORD;
        msgNormalized_1         AT%MW502        : WORD;
        msgNormalized_2         AT%MW504        : WORD;

  (* Mesured values, scaled values *)
 msgScaled_0     AT%MW600        : INT;
        msgScaled_1     AT%MW602        : INT;
        msgScaled_2     AT%MW604        : INT;

  (* Measured values, short floating point values *)
 msgFloating_0   AT%MD700        : REAL;
        msgFloating_1   AT%MD704        : REAL;
        msgFloating_2   AT%MD708        : REAL;

  (* Integrated totals *)
 msgTotal_0      AT%MD800        : UDINT;
        msgTotal_1      AT%MD804        : UDINT;
        msgTotal_2      AT%MD808        : UDINT;

  (* Single commands *)
 cmdSingle_0     AT%MX2100.0 : BOOL;
        cmdSingle_1     AT%MX2100.1 : BOOL;
        cmdSingle_2     AT%MX2100.2 : BOOL;

  (* Double commands *)
        (*      Bit 0..1 = first double command,
                Bit 2..3 = second double command,
                Bit 4..5 = third double command,
                Bit 6..7 = fourth double command *)
 cmdDouble_0     AT%MB2200       : BYTE;

  (* 32 bit string commands *)
 cmdBitStr_0     AT%MD2400       : DWORD;
        cmdBitStr_1     AT%MD2404       : DWORD;
        cmdBitStr_2     AT%MD2408       : DWORD;

  (* Set point, normalized values *)
 cmdNormalized_0         AT%MW2500       : WORD;
        cmdNormalized_1         AT%MW2502       : WORD;
        cmdNormalized_2         AT%MW2504       : WORD;

  (* Set point, scaled values *)
 cmdScaled_0     AT%MW2600       : INT;
        cmdScaled_1     AT%MW2602       : INT;
        cmdScaled_2     AT%MW2604       : INT;

  (* Set point, short floating point values *)
 cmdFloating_0   AT%MD2700       : REAL;
        cmdFloating_1   AT%MD2704       : REAL;
        cmdFloating_2   AT%MD2708       : REAL;
END_VAR

Mapping der IEC<->SPS Prozessdaten in der Zentralstation

Prozessdaten in Überwachungsrichtung (Slave->Master information)

Beispiel 1

Single point information (M_SP_NA_1) mit der IOA = 100, SPS Merkerbereich, Byteoffset = 100, Bitoffset = 0.

Unterstation -> ... -> Zentralstation FB -> memory[100].0 == msgSingle_0

Beispiel 2

Measured value, short floating point value (M_ME_NC_1) mit der IOA = 700, SPS Merkerbereich, Byteoffset = 700, Bitoffset = 0 (bedeutungslos).

Unterstation -> ... -> Zentralstation FB -> memory[700..703] == msgFloating_0

Prozessdaten in Steuerungsrichtung (Master->Slave commands)

Beispiel 1

Single command state (C_SC_NA_1) mit der IOA = 10, SPS Merkerbereich, Byteoffset = 2100, Bitoffset = 0.

cmdSingle_0 == memory[2100].0 -> Zentralstation FB -> ... -> Unterstation

Beispiel 2

Set point, short floating point value (C_SE_NC_1) mit der IOA = 70, SPS Merkerbereich, Byteoffset = 2700, Bitoffset = 0 (bedeutungslos).

cmdFloating_0 == memory[2700..2703] -> Zentralstation FB -> ... -> Unterstation


Einführung: Instanz des Funktionsbausteins deklarieren

Instanz der IEC60870-5-101 Zentralstation deklarieren und aufrufen

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

Die gesamte Funktionalität einer Zentralstation ist im Funktionsbaustein FB_IEC870_5_101Master gekapselt. Mit einer Instanz kann eine Verbindung zur Unterstation aufgebaut werden. Für eine weitere Verbindung deklarieren Sie eine weitere Instanz des Funktionsbausteins.

Fügen Sie im Deklarationsteil von P_MAIN_LowSpeed folgenden SPS-Code ein:

PROGRAM P_MAIN_LowSpeed
VAR
        AODB            : ARRAY[0..49] OF ST_IEC870_5_101AODBEntry;
        hTable          : T_HAODBTable;

        init            : BOOL := TRUE;
        initError       : UDINT;
        asduAddr                : UDINT := 7;

        inputs AT%IB0   : ARRAY[0..2999] OF BYTE;
        outputs AT%QB0  : ARRAY[0..2999] OF BYTE;
        memory AT%MB0   : ARRAY[0..2999] OF BYTE;
        data            : ARRAY[0..2999] OF BYTE;

     bEnable                 : BOOL := TRUE;
        client          : FB_IEC870_5_101Master;

END_VAR

und im Programmteil wird die Instanz aufgerufen:

IF init THEN
        init := FALSE;
...

ELSE
...
        client(         pAOEntries := ADR( AODB ),
                cbAOEntries := SIZEOF( AODB ),
                pInputs := ADR( inputs ),
                cbInputs := SIZEOF( inputs ),
                pOutputs := ADR( outputs ),
                cbOutputs := SIZEOF( outputs ),
                pMemory := ADR( memory ),
                cbMemory := SIZEOF( memory ),
                pData := ADR( data ),
                cbData := SIZEOF( data ),
                bEnable := bEnable,
                hSerial := P_SerialComm_HighSpeed.hSerial,
                hTable := hTable );
...
END_IF


Einführung: Protokollparameter

IEC60870-5-101-Protokollparameter

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

Über die IEC60870-5-101-Protokollparameter kann das Verhalten der Zentralstation an die Anforderungen des Unterstation angepasst werden. Die meisten Parameter sind mit Defaultwerten vorbelegt, so dass diese nicht verändert werden müssen.

Im unserem Beispiel konfigurieren wir die Verbindungsadresse, die Oktetlänge der Verbidnungsadresse und die Zykluszeit in der die Class 1- und Class 2-Daten gepollt werden sollen.

IF init THEN
        init := FALSE;
...
  (*Configure protocol parameter *)
 client.protPara.linkAddr := 220;(* link address of remote slave *)
 client.protPara.eLinkAddrSize := eIEC870_LinkAddr_TwoOctets; (* link addres octet size *)
 client.protPara.tClass1Poll := T#0ms; (* poll class 1 data with max. speed *)
 client.protPara.tClass2Poll := T#0ms; (* poll class 2 data with max. speed *)
...

ELSE
    client( pInputs := ADR( inputs ),
                cbInputs := SIZEOF( inputs ),
                pOutputs := ADR( outputs ),
...

END_IF

Die Dokumentation aller Übertragungsprotokoll-Parameter finden Sie hier: ST_IEC870_5_101PotocolParams.


Einführung: Systemparameter

Systemparameter

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

Über die Systemparameter wird z.B. die gemeinsame ASDU-Adresse und die Anwenderfunktionen der Zentralstation konfiguriert.

In unserer Einführung konfigurieren wir folgende Systemparameter:

  • Die gemeinsame ASDU-Adresse wird auf 7 gesetzt. (asduAddr);
  • Die Oktetlänge der Übertragungsursache wird auf 2 gesetzt (1 Oktet für COT + 1 Oktet für Quelladresse) (eCOTSize);
  • Die Oktetlänge der gemeinsamen ASDU Adresse wird auf 2 gesetzt (eAsduAddrSize);
  • Die Oktetlänge der Informationsobjektadresse wird auf 3 gesetzt (eObjAddrSize);
  • Das loggen der Debugmeldungen im Application-Log wird aktiviert (dbgMode). Es werden Änderungen im Gerätestatus und Fehlermeldungen der Verbindungsschicht gelogt;

Fügen Sie folgenden SPS-Code in Ihr SPS-Projekt ein:

IF init THEN
        init := FALSE;
...

     client.sysPara.asduAddr := 7;
        client.sysPara.asduFmt.eCOTSize := eIEC870_COT_TwoOctets;(* cause of transfer octet size *)
 client.sysPara.asduFmt.eAsduAddrSize := eIEC870_AsduAddr_TwoOctets;(* common ASDU address octet size *)
 client.sysPara.asduFmt.eObjAddrSize := eIEC870_ObjAddr_ThreeOctets;(* information object address octet size *)
 client.sysPara.dbgMode := IEC870_DEBUGMODE_DEVSTATE OR IEC870_DEBUGMODE_LINKERROR; (* IEC870_DEBUGMODE_ASDU OR IEC870_DEBUGMODE_LINKLAYER *)

...
ELSE
    client( pInputs := ADR( inputs ),
                cbInputs := SIZEOF( inputs ),
                pOutputs := ADR( outputs ),
...

END_IF

Die Dokumentation aller Systemparameter finden Sie hier: ST_IEC870_5_101SystemParams.


Einführung: Initialisierungssequenz

Initialisierungssequence

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

client.acqPara.arrInitSeq[0] := eIEC870_ISTEP_TEST; (* Send test command *)
client.acqPara.arrInitSeq[1] := eIEC870_ISTEP_CLOCK; (* Send clock synchronization command *)
client.acqPara.arrInitSeq[2] := eIEC870_ISTEP_GENRO; (* Send general interrogation command *)
client.acqPara.arrInitSeq[3] := eIEC870_ISTEP_CORO; (* Send counter interrogation command *)
client.acqPara.arrInitSeq[5] := eIEC870_ISTEP_UNUSED; (* not used *)


Einführung: Stationsabfrage

Stationsabfrage

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

Der Stationsabfragebefehl wird von der Zentralstation eingeleitet. Im Kennungsfeld des Befehls ist auch die Gruppe (1 bis 16 oder allgemein) festgelegt. Die Unterstation überträgt die zu dieser Gruppe dazugehörigen Applikationsobjekte mit der Übertragungsursache <20> bis <36> an die Zentralstation. Applikationsobjekte mit Zeitmarken werden ohne Zeitmarken übertragen.

client.acqPara.arrGenro[0].tPollCycle := T#60s;
client.acqPara.arrGenro[0].eQOI := eIEC870_QOI_INROGEN;
client.acqPara.arrGenro[0].bEnable := TRUE;


Einführung: Zählwertübertragung

Zählwertübertragung (counter interrogation)

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

Allgemeines Modell für die Zählwertübertragung:

Die Istwerte werden durch Zähler aufsummiert. Die Istwerte können durch einen Umspeicherbefehl, der entweder von der Zentralstation empfangen oder örtlich (lokal in der Unterstation) erzeugt wird, periodisch in umgespeicherte Werte umgespeichert (kopiert) werden. Nach dem Umspeichern wird der erfasste Wert entweder auf Null zurückgesetzt (Erfassen von Inkrementalwerten) oder der Zähler fährt mit seinem Betrieb fort (Erfassen von Zählerständen).

Applikationsobjekte mit Zählwerten werden Gruppen zugeordnet. Die Gruppen werden einzeln umgespeichert (frozen), zurückgesetzt (reset) oder übertragen. Die Zentralstation sendet Zählwertabfragebefehle an die Unterstation. In einem Kennungsfeld des Befehls (QCC) wird die durchzuführende Aktion (FRZ) und Gruppe (RQT) festgelegt.

Die Zuordnung der Applikationsobjekte zu den einzelnen Gruppen (1 bis 4 oder allgemein) wird während der Konfiguration durch den Group-Flagparameter festgelegt. Es gibt vier Betriebsarten für die Erfassung von Zählerständen und Inkrementalwerten. Zu jeder Betriebsart sind einige Hinweise zur Konfiguration der Systemparameter oder der Applikationsobjekte aufgeführt.

Betriebsart A: Örtlich Umspeichern mit Spontanübertragung

Die Unterstation initiiert intern das Umspeichern oder Umspeichern mit Rücksetzen. Die umgespeicherten Zählwerte werden spontan übertragen, nachdem die Funktion Umspeichern oder Umspeichern mit Rücksetzen durchgeführt wurde. Die Zentralstation gibt in dieser Betriebsart keine Zählwertabfragebefehle aus.

Konfiguration der Systemparameter:

Konfiguration der Applikationsobjekte:

Betriebsart B: Örtliches Umspeichern mit Zählerabfrage

Die Unterstation initiiert intern das Umspeichern oder Umspeichern mit Rücksetzen. Die umgespeicherten Zählwerte werden durch Zählwertabfragebefehle von der Zentralstation abgefragt. In diesem Fall darf die Zentralstation im Befehlskennungsfeld das Umspeichern oder Umspeichern mit Rücksetzen nicht benutzen (FRZ=0). Die Zählwerte werden allgemein oder in Gruppen (groups) 1 bis 4 abgefragt.

Konfiguration der Systemparameter:

Konfiguration der Applikationsobjekte:

Betriebsart C: Zentralstation leitet das Umspeichern, Umspeichern mit Rücksetzen oder Rücksetzen ein

Ein Zählwertabfragebefehl wird periodisch von der Zentralstation an die Unterstation ausgegeben, um das Umspeichern oder (und) Rücksetzen zu steuern. Dieser Befehl hat aber noch keine Übertragung der Zählwerte zur Folge. Erst ein nachfolgender Zählwertabfragebefehl wird von der Zentralstation gesendet um die umgespeicherten Zählwerte einzusammeln. Ähnlich, wie bei der Betriebsart B.

Konfiguration der Systemparameter:

Konfiguration der Applikationsobjekte:

Betriebsart D: Zentralstation leitet das Umspeichern und (oder) Rücksetzen ein und die umgespeicherten Werte werden spontan übertragen

Diese Betriebsart ist eine Kombination des Zählwertbefehls von der Zentralstation wie für Betriebsart C mit einer spontanen Übertragung der Zählwerte wie bei der Betriebsart A.

Konfiguration der Systemparameter:

Konfiguration der Applikationsobjekte:


Einführung: Uhrzeitsynchronisation

TS6500 | TwinCAT PLC Lib: IEC 60870-5-101 Zentralstation (master)

Uhrzeitsynchronisation

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

In Vorbereitung....


Einführung: Test der Kommunikation

Test der Kommunikation

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

Durch das Setzen der bExecuteCmd-Variable auf TRUE wird eine einfache Simulation der Befehle in Steuerungsrichtung aktiviert und mit FALSE deaktiviert. Bei einer aktiven Verbindung wird in unsem Beispiel ein Einzeln-Befehl (C_SC_NA_1, IOA = 10 ) zyklisch alle 10 Sekunden zur Unterstation übertragen.

PROGRAM MAIN
VAR
        ...

        bExecuteCmd : BOOL;
        timer : TON;

        ...
END_VAR

...

(* Simple command simulation *)
timer( IN := bExecuteCmd, PT := T#10s ); (* Send cyclic command *)
IF timer.Q THEN
        timer( IN := FALSE );
        cmdSingle_0 := NOT cmdSingle_0; (* toggle single command ON<->OFF *)

(*      cmdDouble_0 := SEL( cmdDouble_0 = 1, 1, 2 );

        cmdBitStr_0 := cmdBitStr_0 + 1;

        cmdNormalized_0 := cmdNormalized_0 + 2;

        cmdScaled_0 := cmdScaled_0 + 4;

        cmdFloating_0 := cmdFloating_0 + 1.2; *)
END_IF

...


Einführung: Übertragungs-/Kommunikationsfehler

Übertragungs- und Kommunikationsfehler

Hier können Sie die kompletten SPS-Sourcen entpacken: TutorialSample.pro

Die Stationsfehlermeldungen werden in einem FIFO abgelegt. Es können bis zu 10 Fehlermeldungen zwischengespeichert werden. Bei fatalen Kommunikationsfehlern (z.B. Fehler der Verbindungsschicht, die Checksumme des Frames passt nicht) wird die Verbindung unterbrochen und muss neu aufgebaut werden. Fehler in der Applikationsschicht (z.B. der ASDU-Sendepuffer ist wegen zu vieler Frames übergelaufen) werden nur geloggt und führen nicht zum Verbindungsabbruch. Es immer noch möglich auch bei diesen Fehlern die Verbindung aus der Applikation zu unterbrechen. Neben dem Fehler-Code wird auch die Fehlerquelle in der Fehlermeldung abgelegt. Dieses erleichtert die Lokalisierung des Fehlers.

Beispiel

Die anfallenden Fehlermeldungen einer IEC 60870-5-101 Zentralstation können durch folgenden Aufruf ausgelesen werden:

PROGRAM MAIN
VAR
...

        client : FB_IEC870_5_101Master;

...
END_VAR

....

REPEAT
        client.system.device.errors.RemoveError( );
        IF client.system.device.errors.bOk THEN
                ADSLOGSTR( ADSLOG_MSGTYPE_ERROR OR ADSLOG_MSGTYPE_LOG,
                        'IEC60870-5-101 master error: 0x%s',
                        DWORD_TO_HEXSTR( client.system.device.errors.getError.nErrId, 8, FALSE) );
        END_IF
UNTIL NOT client.system.device.errors.bOk
END_REPEAT
...


Einführung: Fehlersuche und Diagnose

Fehlersuche und Diagnose

Debug-Meldungen, die ins Application-Log geschrieben werden erleichtern eine Fehlersuche im System. Zur Zeit können drei Stufen der Debugmeldungen in einer IEC-Applikation aktiviert werden. Diese Meldungen können durch den dbgMode-Systemparameter der Leitstation aktiviert werden (ST_IEC870_5_101SystemParams).

  1. Stationsstatus-Meldungen (dbgMode: IEC870_DEBUGMODE_DEVSTATE);
  2. Hexadezimale Ausgabe der ASDU's (ohne Link-Layer-Control-Header, dbgMode: IEC870_DEBUGMODE_ASDU). Pro Zeile werden 32-ASDU-Datenbytes als hexadezimale Zahlen ausgegeben. Längere ASDU's werden auf mehrere Zeilen verteilt;
  3. Hexadezimale Ausgabe der APDU's (Serial-Port-Telegramme, dbgMode: IEC870_DEBUGMODE_LINKLAYER). Pro Zeile werden 32-APDU-Datenbytes als hexadezimale Zahlen ausgegeben. Ähnlich wie bei 2. werden längere APDU's auf mehrere Zeilen verteilt;

Optional können auch Link-Layer-Fehler ausgegeben werden (dbgMode: IEC870_DEBUGMODE_LINKERROR). Um die aktivierten Debugmeldungen zu sehen starten Sie TwinCAT System Manager und aktivieren Sie die Loggeransicht. Die nachfolgende Grafik zeigt eine Debugausgabe. Die drei unterschiedlichen Typen der Meldungen wurden mit entsprechenden Zahlen markiert.

Weitere Diagnosetools:

  • Portmon for Windows (v3.02, Windows Sysinternals);
  • Diverse Protokoll-Test-Suit-Produkte;


Einführung: Konfiguration der seriellen Schnittstelle

Konfiguration der seriellen Schnittstellen

  • Konfiguration der standard PC COMx-Schnittstellen
  • Konfiguration der seriellen Busklemmen KL6xxx
  • Konfiguration der seriellen Busklemmen EL6xxx

1. Konfiguration der standard PC COMx-Schnittstellen

Die serielle Schnittstelle kann nur in PC/CX-Systemen eingefügt werden.

Mit der rechten Maustaste "E/A Geräte" anklicken. "Gerät anfügen" auswählen. Unter "Verschiedenes" die "Serielle Schnittstelle" auswählen. Anschließend nachfolgende Einstellungen vornehmen.

1.1. Karteireiter Serial Port

Serielle Schnittstelle COM1

1.2. Karteireiter Eigenschaften

Die Option KL6xxx1 Mode (Emulation) anwählen und dann die Kommunikationsparameter einstellen:

Baudrate, hier 19200 Baud, 8 Datenbits, Parity=even, 1 Stoppbit

2. Konfiguration der seriellen Busklemmen KL6xxx

Die Schnittstelle wird in der TwinCAT SPS durch die Instanz des FB_IEC870_SerialLineCtrl-Funktionsbausteins konfiguriert. Die Kommunikationsparameter wie Baudrate, Parity usw. sind an diesem Baustein einzustellen.

3. Konfiguration der seriellen Busklemmen EL6xxx

Die serielle Schnittstelle wird im TwinCAT System Manager Karteireiter CoE-Online (CoE=CanOpen over EtherCAT) eingestellt. Der Karteireiter steht nur bei Online-Zugriff auf die Klemme zur Verfügung, d.h., ist der System Manger nicht mit der Hardware verbunden, können keine Einstellungen verändert werden. Die Einstellungen werden in der Klemme Spannungsausfallsicher abgespeichert. Nach einem Scannen der Klemmen müssen diese Daten nicht neu eingegeben werden. Bei einem Tausch der Klemme werden die Daten aus der neuen Klemme aktiv und müssen demzufolge wieder angepasst werden. Um das zu Verhindern, müssen im Karteireiter Startup die geänderten Daten eingetragen werden. Beim Systemstart werden die Daten aus dem Reiter Startup in die Klemme übertragen. Ein Tausch der Klemme ist somit Problemlos möglich. Nach einem Scannen der Klemmen müssen die Daten im Reiter Startup neu eingegeben werden.

3.1. Karteireiter CoE

(1) Baudrate, hier 19200 Baud

(2) Date frame, 8E1 entspricht 8 Datenbits, Parity=even, 1 Stoppbit

(3) Feature bits -> Enable RTS/CTS = FALSE bei EL6001

Mit einem Doppelklick auf die entsprechende Zeile wird ein Menü geöffnet, in dem die Einstellungen geändert werden können.

3.1.1 RS485 Betriebsmodus

Bei der RS485 Betriebsart werden die Daten in halbduplex Übertragung ausgetauscht. Im RS485 Betriebsmodus werden die Sende- und Empfangsleitungen miteinander verbunden. Dadurch empfängt die Klemme nicht nur die Daten anderer Teilnehmer, sondern auch ihre eigenen Sendedaten. Diese Daten können die Kommunikation stören. Mit der Option "Enable half duplex" im "COM Settings"-Objekt kann dies unterdrückt werden (Index 8000:06).

3.2. Karteireiter Startup

Alle vom Standard abweichende Einstellungen müssen in die Startup Liste eingetragen werden. Beim Systemstart werden die Daten aus dem Reiter Startup in die Klemme übertragen. Ein Tausch der Klemme ist somit Problemlos möglich. Nach einem Scannen der Klemmen müssen die Daten im Reiter Startup neu eingegeben werden.

Baudrate, hier 19200 Baud

Date frame, 8E1 entspricht 8 Datenbits, Parity=even, 1 Stoppbit

Feature bits -> Enable RTS/CTS = FALSE bei EL6001


FB_IEC870_5_101Master

FUNCTION_BLOCK FB_IEC870_5_101Master

Mit einer Instanz des Funktionsbausteins FB_IEC870_5_101Master kann in der TwinCAT SPS eine IEC60870-5-101 Zentralstation (Master) implementiert werden. Pro Instanz des Funktionsbausteins wird eine Verbindung zum Slave aufgebaut. Im Normalfall wird der Datenaustausch automatisch gestartet, nachdem die Verbindung hergestellt wurde. Standardmäßig ist der Funktionsbaustein auch so konfiguriert.

VAR_IN_OUT

VAR_IN_OUT
        hSerial         : T_HSERIALCTRL;
        hTable  : T_HAODBTable;
END_VAR

hTable: Applikationsobjekt-Datenbankhandle (Hash-Tabellenhandle). Das Tabellenhandle muss vor der Benutzung einmalig mit der Funktion F_iecCreateTableHnd initialisiert werden.

VAR_INPUT

VAR_INPUT
        protPara        : ST_IEC870_5_101ProtocolParams :=  := ( eType := eIEC870_101_MASTER );
        sysPara                 : ST_IEC870_5_101SystemParams := ( bEndOfInit := FALSE );
        acqPara                 : ST_IEC870_5_101AcquisitionParams;
        pAOEntries      : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF ST_IEC870_5_101AODBEntry := 0;
        cbAOEntries     : UDINT := 0;
        pInputs                 : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE := 0;
        cbInputs                : UDINT := 0;
        pOutputs                : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE := 0;
        cbOutputs       : UDINT := 0;
        pMemory                 : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE := 0;
        cbMemory                : UDINT := 0;
        pData           : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE := 0;
        cbData          : UDINT := 0;
        bEnable                 : BOOL := TRUE;
END_VAR

protPara: IEC60870-5-101-Protokolparameter.

sysPara: Systemparameter.

acqPara: Parameter für die zyklische Datenerfassung.

pAOEntries: Adresse der Applikationsobjekt-Datenbankvariablen.

cbAOEntries: Bytegröße der Applikationsobjekt-Datenbankvariablen.

pInputs: Adresse des SPS-Prozessdatenbereichs der Eingänge.

cbInputs: Bytegröße des SPS-Prozessdatenbereichs der Eingänge.

pOutputs: Adresse des SPS-Prozessdatenbereichs der Ausgänge.

cbOutputs: Bytegröße des SPS-Prozessdatenbereichs der Ausgänge.

pMamory: Adresse des SPS-Prozessdatenbereichs der Merker.

cbMamory: Bytegröße des SPS-Prozessdatenbereichs der Merker.

pData: Adresse des SPS-Datenbereichs.

cbData: Bytegröße des SPS-Datenbereichs.

bEnable : Aktiviert/Deaktiviert den Funktionsbaustein (Kommunikation und Verbindungen).

Die Adressen können mit dem ADR- und die Bytegrößen mit dem SIZEOF-Operator ermittelt werden.

VAR_OUTPUT

VAR_OUTPUT
        system  : ST_IEC870_5_101ExSystemInterface;
        eState  : E_IEC870_5_101SerialLinkState := eSERIALLINK_DISCONNECTED;
END_VAR

system: System-Interface. Diese Variable dient anderen IEC-Applikationsfunktionen als Kommunikationsschnittstelle zum IEC-Gerät (hier: Zentralstation).

  • Membervariable system.device wird z.B. von der F_iecSetAOQuality-Funktion als VAR_IN_OUT-Parameter erwartet.
  • Membervariable system.device.errors ist ein Gerätefehler-Fifo. Die registrierten Fehler können von der SPS-Applikation ausgelesen und ausgewertet werden.

eState: Status der Verbindung zum Slave.

Beispiel in ST: IEC60870-5-101 Zentralstation

Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken
TwinCAT v2.10.0 Build >= 1328 | PC oder CX (X86, ARM) | TcIEC870_5_101Master.Lib ( Standard.Lib; TcBase.Lib; TcSystem.Lib; TcUtilities.Lib; COMLIbV2.Lib; TcIEC870_5_101.Lib; TcIEC870_5_101Link.Lib; werden automatisch eingebunden )


F_GetVersionTcIEC870_5_101Master

FUNCTION F_GetVersionTcIEC870_5_101Master

Mit dieser Funktion können Versionsinformationen der SPS-Bibliothek ausgelesen werden.

FUNCTION F_GetVersionTcIEC870_5_101Master: UINT

VAR_INPUT
        nVersionElement : INT;
END_VAR

nVersionElement : Versionselement, das gelesen werden soll. Mögliche Parameter:

  • 1 : major number;
  • 2 : minor number;
  • 3 : revision number;
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken
TwinCAT v2.10.0 Build >= 1328 | PC oder CX (x86, ARM) | TcIEC870_5_101Master.Lib ( Standard.Lib; TcBase.Lib; TcSystem.Lib; TcUtilities.Lib; COMLibV2.Lib; TcIEC870_5_101Link.Lib; TcIEC870_5_101.Lib werden automatisch eingebunden )


ST_IEC870_5_101ExSystemInterface

TYPE ST_IEC870_5_101ExSystemInterface

TYPE ST_IEC870_5_101ExSystemInterface :
STRUCT
        device  : ST_IEC870_5_101DeviceInterface;
        service         : ST_IEC870_5_101SystemServices;
        hSOTable : T_HAODBTABLE;
END_STRUCT
END_TYPE

device: Kommunikationsschnittstelle des IEC-Gerätes.

service: IEC-Gerätedienste;

hSOTable : Systemobjekt Datenbank Handle;

Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken
TwinCAT v2.10.0 Build >= 1328 | PC oder CX (x86, ARM) | TcIEC870_5_101Master.Lib ( Standard.Lib; TcBase.Lib; TcSystem.Lib; TcUtilities.Lib; COMLibV2.Lib; TcIEC870_5_101Link.Lib; TcIEC870_5_101.Lib werden automatisch eingebunden )


Fehlercodes Übersicht

TwinCAT IEC 60870-5-101 Zentralstation-Fehlercodes

Fehlercodes (Hex) | Fehlercodes (Dez) | Fehlerquelle | Beschreibung
0x00000000-0x00002000 | 0-8192 | Serial communication errors | Serielle Kommunikation Fehler (aber nur wenn die Fehlerquelle = eIEC870_ESRC_IEC60870_5_101LINK ).
0x00000000-0x00007800 | 0-30720 | TwinCAT System Fehler | TwinCAT System Fehler (ADS-Fehlercodes inklusive wenn Fehlerquelle <> eIEC870_ESRC_IEC60870_5_101LINK ).
0x00008100-0x000081FF | 32768-33023 | IEC 60870-5-10x Fehler | Interne IEC 60870-5-10x Fehler


Fehlersuche

Fehlersuche/Diagnose

  1. Überprüfen Sie die in dieser Dokumentation beschriebenen Hardware- und Softwareanforderungen (TwinCAT-Version, CE Image-Version usw.).
  2. Vergleichen/überprüfen Sie die Kompatibilitätsliste der Leitstation mit der Kompatibilitätsliste der Unterstation.
  3. Überprüfen Sie die IO-Konfiguration und das Mapping der SPS-Variablen in TwinCAT System Manager (Konfiguration der seriellen Schnittstellen, Baudrate, Parity, Stopbits usw.). Vergleichen Sie die Parameter mit Parametern in der Unterstation.
  4. Überprüfen Sie ob der Funktionsbaustein einen Fehlercode/Fehlerquelle ausgibt. Die Dokumentation zu den Fehlercodes finden Sie hier: Übersicht der Fehlercodes.
  5. Überprüfen Sie die am Funktionsbaustein eingestellten Protokolparameter (Link-Adresse, Länge der Link-Adresse, FRAMELength, usw.). Vergleichen Sie die Protokolparameter mit den Parametern in der Unterstation.
  6. Überprüfen Sie die am Funktionsbaustein eingestellten Systemparameter (ASDU-Adresse, Länge der ASDU-Adresse, Länge der Informationsobjekt-Adresse, Länge der Übertragungsursache COT, usw. ). Vergleichen Sie die Systemparameter mit den Parametern in der Unterstation.
  7. Überprüfen Sie die am Funktionsbaustein eingestellten Parameter für die zyklische Datenerfassung (Akquisition) (Initialisierungssequenz, zyklische Generalabfrage, zyklische Zählerabfrage, zyklische Testkommandos, usw. ).
  8. Überprüfen Sie die Konfiguration der Datenpunkte (Typ, Adresse des Informationsobjektes usw.).
  9. Überprüfen Sie ob die Unterstation einen Fehlercode ausgibt.
  10. Aktivieren Sie die Debugausgaben beim Aufbauen und Abbauen der Verbindung und/oder der ASDU Daten. Öffnen Sie den TwinCAT System Manager und aktivieren das LogView-Fenster. Prüfen Sie die Debugausgaben.


Beispiele

In den Beispielprojekten sind folgende Stationsparameter für die Zentralstation eingestellt:

  • Standard PC interface: COM1
  • 19200 Baud
  • Link address: 220
  • Link address size: 2 octets
  • Cause of transfer size: 2 octets
  • Originator address: 1
  • Common ASDU address: 7
  • Common ASDU address size: 2 octets
  • Information object address size: 3 octets
SPS Project | TwinCAT System Manager Konfiguration | Beschreibung
MiniMasterSample.pro | MiniMasterSample.tsm | Einfache TwinCAT IEC60870-5-101 Zentralstation. Ein minimalistisches SPS-Projekt mit einem Single-Point in Überwachungsrichtung (IOA = 100) und einem Single-Command in Steuerungsrichtung (IOA = 10).
TutorialSample.pro | TutorialSample.tsm | Einfache IEC60870-5-101 Zentralstation