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_101Slave.Lib implementiert die Beckhoff Unterstation (Slave) nach der IEC 60870-5-101 Norm.

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

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 laufende Applikation zu erhalten; 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 einer handvoll Datenpunkten implementieren möchten (<1000);
  • Keine grossen Performace-Anforderungen an die Applikation stellen;
  • Keine besondere Befehlsausführung wie Select/Execute oder Daten + Zeistempel von externen Geräten versenden möchten;
  • Keine Funktionalitäten benötigen die laut Kompatibilitätsliste nicht unterstützt werden;


Kompatibilitätsliste

TwinCAT IEC 60870-5-101 controlled station interoperability

Kompatibilitätsliste nach IEC 60870-5-101

für TwinCAT SPS Bibliothek: IEC 60870-5-101 Unterstation (slave).

Version: 1.2
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
Festlegungen für die Unterstation (SLAVE)

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
9, 11, 13, 21 | <1>
1, 3, 5, 7, 9, 11, 13, 20, 21 | <2>

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>:= Test command with time tag 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 |  |  | X |  |  |  |  |
<2> | M_SP_TA_1 |  |  | X |  | X |  |  |  |  |  | X |  |  |  |  |  |  |  |
<3> | M_DP_NA_1 |  | X | X |  | X |  |  |  |  |  | X |  |  | X |  |  |  |  |
<4> | M_DP_TA_1 |  |  | X |  | X |  |  |  |  |  | X |  |  |  |  |  |  |  |
<5> | M_ST_NA_1 |  | X | X |  | X |  |  |  |  |  | X |  |  | X |  |  |  |  |
<6> | M_ST_TA_1 |  |  | X |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |
<7> | M_BO_NA_1 |  | X | X |  | X |  |  |  |  |  |  |  |  | X |  |  |  |  |
<8> | M_BO_TA_1 |  |  | X |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |
<9> | M_ME_NA_1 | X | X | X |  | X |  |  |  |  |  |  |  |  | X |  |  |  |  |
<10> | M_ME_TA_1 |  |  | X |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |
<11> | M_ME_NB_1 | X | X | X |  | X |  |  |  |  |  |  |  |  | X |  |  |  |  |
<12> | M_ME_TB_1 |  |  | X |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |
<13> | M_ME_NC_1 | X | X | X |  | X |  |  |  |  |  |  |  |  | X |  |  |  |  |
<14> | M_ME_TC_1 |  |  | X |  | 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 |  |  | X |  |  |  |  |
<21> | M_ME_ND_1 | X | X | X |  | X |  |  |  |  |  |  |  |  | X |  |  |  |  |
<30> | M_SP_TB_1 |  |  | X |  | X |  |  |  |  |  | X |  |  |  |  |  |  |  |
<31> | M_DP_TB_1 |  |  | X |  | X |  |  |  |  |  | X |  |  |  |  |  |  |  |
<32> | M_ST_TB_1 |  |  | X |  | X |  |  |  |  |  | X |  |  |  |  |  |  |  |
<33> | M_BO_TB_1 |  |  | X |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |
<34> | M_ME_TD_1 |  |  | X |  | X |  |  |  |  |  |  |  |  |  |  |  |  |  |
<35> | M_ME_TE_1 |  |  | X |  | 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 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<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 |  |  |  |  |  | X | X | X | X | X |  |  |  |  |  | X | X | X | X
<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 |  |  |  |  | X |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<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 |  |  |  |  |  | X | X |  |  |  |  |  |  |  |  | X | X | X | X
<106> | C_CD_NA_1 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | X | X | X | X
<107> | C_TS_TA_1 |  |  |  |  |  | X | X |  |  |  |  |  |  |  |  | X | X | X | X
<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 Unterstation.

Kompatibilitätsliste finden Sie hier: Interoperability check list

Übersicht der Fehlercodes finden Sie hier: Fehlercodes

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

Kurzanleitung

  1. Erstellen Sie ein neues SPS-Projekt erstellen binden Sie die SPS-Bibliothek: TcIEC870_5_101Slave.Lib ein.
  2. Legen Sie zwei SPS-Tasks an, eine schnelle (z.B. mit Zykluszeit T#1ms) und eine langsame (z.B. mit Zykluszeit T#10ms).
    Legen Sie zwei Programmbausteine an (z.B. P_SerialComm_HighSpeed und P_MAIN_LowSpeed). P_SerialComm_HighSpeed wird von der schnellen und P_MAIN_LowSpeed von der langsamen Task aufgerufen.
  3. Legen Sie im P_SerialComm_HighSpeed eine Instanz des Funktionsbausteins FB_IEC870_SerialLineCtrl an, konfigurieren Sie diese und rufen Sie diese auf.
    Je nach dem, ob über die seriellen Beckhoff-Klemmen oder über die serielle Schnittstelle des PCs kommuniziert wird, die Puffer: KL6inData5B, KL6outData5B oder PcComInData, PcComOutData anlegen und mit den entsprechen IO-Prozessdaten im TwinCAT Systemmanager verknüpfen.
  4. Die Instanz der T_HSERIALCTRL-Variablen dient dem Austausch der Tx/Rx-Telegramme zwischen den beiden Tasks (Programmen). Legen Sie diese Variable z.B. als globale Variable an.
  5. Konfiguration der Datenpunkte: Legen Sie eine Array-Variable vom Typ ST_IEC870_5_101AODBEntry an. Jedes Arrayelement entspricht einem Datenpunkt. Konfigurieren Sie die Datenpunkte mit Hilfe der Funktion F_iecInitAOEntry zur Laufzeit (z.B. in einem Init-Schritt).
  6. Legen Sie im P_MAIN_LowSpeed eine Instanz des Protokoll-Bausteins FB_IEC870_5_101Slave an, konfigurieren Sie diese und rufen Sie diese auf.
  7. Konfigurieren Sie die System- und Protokoll-Parameter passend zu den Parametern der Leitstation.


Einführung: Übersicht

Tutorial: IEC 60870-5-101 controlled station (slave)

Einführung (Tutorial)

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

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


Einführung: Glossar

Tutorial: IEC 60870-5-101 controlled station (slave)

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

Tutorial: IEC 60870-5-101 controlled station (slave)

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_101Slave.Lib aus und bestätigen dies.


Einführung: Die schnelle SPS-Task

Tutorial: IEC 60870-5-101 controlled station (slave)

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

Tutorial: IEC 60870-5-101 controlled station (slave)

Applikationsobjekt-Datenbank der Unterstation 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 der 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). In diesem Fall wird eine Wertänderung durch ein Kommando von der Leitstation eine Übertragung des M_SP_NA_1 mit der Objektadresse 100 und Übertragunsursache <11> (returned by remote command) zur Folge haben.

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

Arrayelement | ASDU identifier | Objektadresse IOA | Group-Konfigurationsparameter | Basiszeitmultiplikator | SPS-Prozessdatenbereich | Offset Byte | Offset Bit | Prozessdatenbreite in der TwinCAT SPS
0 | M_SP_NA_1 | 100 | Generalabfrage | 0 | Merker | 100 | 0 | 1 Bit
1 | M_SP_NA_1 | 101 | Generalabfrage | 0 | Merker | 100 | 1 | 1 Bit
2 | M_SP_TB_1 | 102 | Generalabfrage | 0 | Merker | 100 | 2 | 1 Bit
3 | M_DP_NA_1 | 200 | Generalabfrage | 0 | Merker | 200 | 0 | 2 Bits
4 | M_DP_NA_1 | 201 | Generalabfrage | 0 | Merker | 200 | 2 | 2 Bits
5 | M_DP_TB_1 | 202 | Generalabfrage | 0 | Merker | 200 | 4 | 2 Bits
6 | M_ST_NA_1 | 300 | Generalabfrage | 0 | Merker | 300 | 0 | 1 Byte
7 | M_ST_NA_1 | 301 | Generalabfrage | 0 | Merker | 301 | 0 | 1 Byte
8 | M_ST_TB_1 | 302 | Generalabfrage | 0 | Merker | 302 | 0 | 1 Byte
9 | M_BO_NA_1 | 400 | Generalabfrage | 0 | Merker | 400 | 0 | 4 Byte
10 | M_BO_NA_1 | 401 | Generalabfrage | 0 | Merker | 404 | 0 | 4 Byte
11 | M_BO_TB_1 | 402 | Generalabfrage | 0 | Merker | 408 | 0 | 4 Byte
12 | M_ME_NA_1 | 500 | Generalabfrage | 0 | Merker | 500 | 0 | 2 Byte
13 | M_ME_NA_1 | 501 | Generalabfrage | 0 | Merker | 502 | 0 | 2 Byte
14 | M_ME_TD_1 | 502 | Generalabfrage | 0 | Merker | 504 | 0 | 2 Byte
15 | M_ME_NB_1 | 600 | Generalabfrage | 0 | Merker | 600 | 0 | 2 Byte
16 | M_ME_NB_1 | 601 | Generalabfrage | 0 | Merker | 602 | 0 | 2 Byte
17 | M_ME_TE_1 | 602 | Generalabfrage | 0 | Merker | 604 | 0 | 2 Byte
18 | M_ME_NC_1 | 700 | Generalabfrage | 0 | Merker | 700 | 0 | 4 Byte
19 | M_ME_NC_1 | 701 | Generalabfrage | 0 | Merker | 704 | 0 | 4 Byte
20 | M_ME_TF_1 | 702 | Generalabfrage | 0 | Merker | 708 | 0 | 4 Byte
21 | M_IT_NA_1 | 800 | Generalzählerabfrage und Mode A (lokal Umspeichern mit Spontanübertragung alle 15s) | 0 | Merker | 800 | 0 | 4 Byte
22 | M_IT_NA_1 | 801 | Generalzählerabfrage und Mode A (lokal Umspeichern mit Spontanübertragung alle 15s) | 0 | Merker | 804 | 0 | 4 Byte
23 | M_IT_TB_1 | 802 | Generalzählerabfrage und Mode A (lokal Umspeichern mit Spontanübertragung alle 15s) | 0 | Merker | 808 | 0 | 4 Byte
Commands |  |  |  |  |  |  |  |
24 | C_SC_NA_1 | 10 | - | 0 | Merker | 2100 | 0 | 1 Bit
25 | C_SC_NA_1 | 11 | - | 0 | Merker | 2100 | 1 | 1 Bit
26 | C_SC_TA_1 | 12 | - | 0 | Merker | 2100 | 2 | 1 Bit
27 | C_DC_NA_1 | 20 | - | 0 | Merker | 2200 | 0 | 2 Bit
28 | C_DC_NA_1 | 21 | - | 0 | Merker | 2200 | 2 | 2 Bit
29 | C_DC_TA_1 | 22 | - | 0 | Merker | 2200 | 4 | 2 Bit
30 | C_RC_NA_1 | 30 | - | 0 | Merker | 2300 | 0 | 1 Byte
31 | C_RC_NA_1 | 31 | - | 0 | Merker | 2301 | 0 | 1 Byte
32 | C_RC_TA_1 | 32 | - | 0 | Merker | 2302 | 0 | 1 Byte
33 | C_BO_NA_1 | 40 | - | 0 | Merker | 2400 | 0 | 4 Byte
34 | C_BO_NA_1 | 41 | - | 0 | Merker | 2404 | 0 | 4 Byte
35 | C_BO_TA_1 | 42 | - | 0 | Merker | 2408 | 0 | 4 Byte
36 | C_SE_NA_1 | 50 | - | 0 | Merker | 2500 | 0 | 2 Byte
37 | C_SE_NA_1 | 51 | - | 0 | Merker | 2502 | 0 | 2 Byte
38 | C_SE_TA_1 | 52 | - | 0 | Merker | 2504 | 0 | 2 Byte
39 | C_SE_NB_1 | 60 | - | 0 | Merker | 2600 | 0 | 2 Byte
40 | C_SE_NB_1 | 61 | - | 0 | Merker | 2602 | 0 | 2 Byte
41 | C_SE_TB_1 | 62 | - | 0 | Merker | 2604 | 0 | 2 Byte
42 | C_SE_NC_1 | 70 | - | 0 | Merker | 2700 | 0 | 4 Byte
43 | C_SE_NC_1 | 71 | - | 0 | Merker | 2704 | 0 | 4 Byte
44 | 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 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 Variable in MAIN:

PROGRAM MAIN
VAR
    AODB : ARRAY[0..49] OF ST_IEC870_5_101AODBEntry;
END_VAR

Applikationsobjekte konfigurieren

Während der Konfiguration der einzelnen Applikationsobjekte werden unter anderem der Objekt-Typ ( M_SP_NA_1, M_DP_NA_1, M_ST_NA_1 usw.), die Objekt-Adresse und weitere Objekt-Parameter festgelegt.

Die Konfiguration der gewünschten Applikationsobjekte wird zur Programmlaufzeit durchgeführt. Jedes Applikationsobjekt (Datenbank-Array-Element) wird durch einen einmaligen Aufruf der F_iecInitAOEntry-Funktion konfiguriert. Das zu konfigurierende Array-Element wird an die Funktion per VAR_IN_OUT übergeben. Im Regelfall wird die Konfiguration beim SPS-Programmstart einmalig in einer Init-Routine durchgeführt. Die Funktion F_iecInitAOEntry erwartet folgende Funktionsparameter (von links nach rechts):

FUNCTION F_iecInitAOEntry : UDINT
VAR_INPUT
    eType 		: E_IEC870_5_101TcTypeID;
    objAddr 		: DWORD := 0;
    group 		: DWORD := 0;
    multiplier 	: BYTE := 0;
    ioMapType 	: E_IEC870_5_101IOMappingType;
    byteOffs 		: UDINT := 0;
    bitOffs 		: UDINT := 0;
END_VAR
VAR_IN_OUT
    dbEntry 		: ST_IEC870_5_101AODBEntry;
END_VAR

eType: Applikationsobjekt-Typ (ASDU identifier, z.B.: M_SP_NA_1 für Single Point oder M_DP_NA_1 für Double Point ). Beachten Sie, dass nur die in der Kompatibilitätsliste aufgeführten ASDU-Typen verwendet werden können. Unzulässige Typen werden ignoriert.

objAddr : Objektadresse, z.B. 100. Jedes Applikationsobjekt sollte mit einer eindeutigen Adresse konfiguriert werden.

group: Group-Konfigurationsparameter. Die verfügbaren Group-Parameter sind als Konstanten definiert und können mit ODER-Operator kombiniert werden. Z.B.: IEC870_GRP_INROGEN OR IEC870_GRP_PERCYC.

Hier finden Sie die Beschreibung aller Group-Konfigurationsparameter.

mutiplier: Basiszeitmultiplikator für die zyklische/periodische Datenübertragung ( 0=Deaktiviert). Die Basiszeit wird über die Systemparameter konfiguriert. Wurde die Basiszeit z.B. auf T#10s gesetzt und der Multiplikator auf den Wert 2, dann werden die periodischen/zyklischen Daten des Applikationsobjekts alle 20 Sekunden gesendet.

ioMapType: Dieser Parameter legt fest, aus oder in welchen Prozessdatenbereich der TwinCAT SPS die IEC-Prozessdaten zur Laufzeit gemappt werden sollen (inputs, outputs, memory, data).

byteOffs: Prozessdatenbereich Byteoffset;

bitOffs: Prozessdatenbereich Bitoffset;

dbEntry: Applikationsobjekt das konfiguriert werden soll (ein Datenbankvariable-Arrayelement, das an die Funktion per VAR_IN_OUT übergeben wird).

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

PROGRAM MAIN
VAR
    AODB : ARRAY[0..49] OF ST_IEC870_5_101AODBEntry;

    init	: BOOL := TRUE;
    initError	: UDINT;
END_VAR
IF init THEN
    init := FALSE;

    (* Monitored Single Points *)
    initError := F_iecInitAOEntry( M_SP_NA_1, 100, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 100, 0, AODB[0] );
    initError := F_iecInitAOEntry( M_SP_NA_1, 101, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 100, 1, AODB[1] );
    initError := F_iecInitAOEntry( M_SP_TB_1, 102, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 100, 2, AODB[2]);
    (* Double Points*)
    initError := F_iecInitAOEntry( M_DP_NA_1, 200, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 200, 0, AODB[3] );
    initError := F_iecInitAOEntry( M_DP_NA_1, 201, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 200, 2, AODB[4] );
    initError := F_iecInitAOEntry( M_DP_TB_1, 202, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 200, 4, AODB[5] );
    (* Regulating step value *)
    initError := F_iecInitAOEntry( M_ST_NA_1, 300, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 300, 0, AODB[6] );
    initError := F_iecInitAOEntry( M_ST_NA_1, 301, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 301, 0, AODB[7] );
    initError := F_iecInitAOEntry( M_ST_TB_1, 302, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 302, 0, AODB[8] );
    (* 32 bit string*)
    initError := F_iecInitAOEntry( M_BO_NA_1, 400, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 400, 0, AODB[9] );
    initError := F_iecInitAOEntry( M_BO_NA_1, 401, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 404, 0, AODB[10] );
    initError := F_iecInitAOEntry( M_BO_TB_1, 402, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 408, 0, AODB[11] );
    (* Measured value, normalized value *)
    initError := F_iecInitAOEntry( M_ME_NA_1, 500, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 500, 0, AODB[12] );
    initError := F_iecInitAOEntry( M_ME_NA_1, 501, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 502, 0, AODB[13] );
    initError := F_iecInitAOEntry( M_ME_TD_1, 502, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 504, 0, AODB[14] );
    (* Mesured value, scaled value *)
    initError := F_iecInitAOEntry( M_ME_NB_1, 600, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 600, 0, AODB[15] );
    initError := F_iecInitAOEntry( M_ME_NB_1, 601, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 602, 0, AODB[16] );
    initError := F_iecInitAOEntry( M_ME_TE_1, 602, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 604, 0, AODB[17] );
    (* Measured value , short floating point value *)
    initError := F_iecInitAOEntry( M_ME_NC_1, 700, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 700, 0, AODB[18] );
    initError := F_iecInitAOEntry( M_ME_NC_1, 701, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 704, 0, AODB[19] );
    initError := F_iecInitAOEntry( M_ME_TF_1, 702, IEC870_GRP_INROGEN, 0, MAP_AREA_MEMORY, 708, 0, AODB[20] );
    (* Integrated totals *)
    initError := F_iecInitAOEntry( M_IT_NA_1, 800, IEC870_GRP_REQCOGEN OR IEC870_GRP_LOCFREEZE, 0, MAP_AREA_MEMORY, 800, 0, AODB[21] );
    initError := F_iecInitAOEntry( M_IT_NA_1, 801, IEC870_GRP_REQCOGEN OR IEC870_GRP_LOCFREEZE, 0, MAP_AREA_MEMORY, 804, 0, AODB[22] );
    initError := F_iecInitAOEntry( M_IT_TB_1, 802, IEC870_GRP_REQCOGEN OR IEC870_GRP_LOCFREEZE, 0, MAP_AREA_MEMORY, 808, 0, AODB[23] );

    (* Single commands *)
    initError := F_iecInitAOEntry( C_SC_NA_1, 10, 0, 0, MAP_AREA_MEMORY, 2100, 0, AODB[24] );
    initError := F_iecInitAOEntry( C_SC_NA_1, 11, 0, 0, MAP_AREA_MEMORY, 2100, 1, AODB[25] );
    initError := F_iecInitAOEntry( C_SC_TA_1, 12, 0, 0, MAP_AREA_MEMORY, 2100, 2, AODB[26] );
    (* Double commands *)
    initError := F_iecInitAOEntry( C_DC_NA_1, 20, 0, 0, MAP_AREA_MEMORY, 2200, 0, AODB[27] );
    initError := F_iecInitAOEntry( C_DC_NA_1, 21, 0, 0, MAP_AREA_MEMORY, 2200, 2, AODB[28] );
    initError := F_iecInitAOEntry( C_DC_TA_1, 22, 0, 0, MAP_AREA_MEMORY, 2200, 4, AODB[29] );
    (* Regulating step commands *)
    initError := F_iecInitAOEntry( C_RC_NA_1, 30, 0, 0, MAP_AREA_MEMORY, 2300, 0, AODB[30] );
    initError := F_iecInitAOEntry( C_RC_NA_1, 31, 0, 0, MAP_AREA_MEMORY, 2301, 0, AODB[31] );
    initError := F_iecInitAOEntry( C_RC_TA_1, 32, 0, 0, MAP_AREA_MEMORY, 2302, 0, AODB[32] );
    (* 32 bit string commands *)
    initError := F_iecInitAOEntry( C_BO_NA_1, 40, 0, 0, MAP_AREA_MEMORY, 2400, 0, AODB[33] );
    initError := F_iecInitAOEntry( C_BO_NA_1, 41, 0, 0, MAP_AREA_MEMORY, 2404, 0, AODB[34] );
    initError := F_iecInitAOEntry( C_BO_TA_1, 42, 0, 0, MAP_AREA_MEMORY, 2408, 0, AODB[35] );
    (* Set point, normalized values*)
    initError := F_iecInitAOEntry( C_SE_NA_1, 50, 0, 0, MAP_AREA_MEMORY, 2500, 0, AODB[36] );
    initError := F_iecInitAOEntry( C_SE_NA_1, 51, 0, 0, MAP_AREA_MEMORY, 2502, 0, AODB[37] );
    initError := F_iecInitAOEntry( C_SE_TA_1, 52, 0, 0, MAP_AREA_MEMORY, 2504, 0, AODB[38] );
    (* Set point, scaled valuess *)
    initError := F_iecInitAOEntry( C_SE_NB_1, 60, 0, 0, MAP_AREA_MEMORY, 2600, 0, AODB[39] );
    initError := F_iecInitAOEntry( C_SE_NB_1, 61, 0, 0, MAP_AREA_MEMORY, 2602, 0, AODB[40] );
    initError := F_iecInitAOEntry( C_SE_TB_1, 62, 0, 0, MAP_AREA_MEMORY, 2604, 0, AODB[41] );
    (* Set point, short floating point values *)
    initError := F_iecInitAOEntry( C_SE_NC_1, 70, 0, 0, MAP_AREA_MEMORY, 2700, 0, AODB[42] );
    initError := F_iecInitAOEntry( C_SE_NC_1, 71, 0, 0, MAP_AREA_MEMORY, 2704, 0, AODB[43] );
    initError := F_iecInitAOEntry( C_SE_TC_1, 72, 0, 0, MAP_AREA_MEMORY, 2708, 0, AODB[44] );

END_IF


Einführung: Mapping IEC-SPS

Tutorial: IEC 60870-5-101 controlled station (slave)

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 MAIN
VAR
    AODB : ARRAY[0..49] OF ST_IEC870_5_101AODBEntry;

    init : BOOL := TRUE;
    initError : UDINT;

    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_iecInitAOEntry-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 := 2#10001000_10001000_10001000_10001000;
    msgBitStr_1 	AT%MD404	: DWORD := 2#10001000_10001000_10001000_10001000;
    msgBitStr_2 	AT%MD408	: DWORD := 2#10001000_10001000_10001000_10001000;

    (* 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;

    (* Regulating step commands *)
    cmdStep_0		AT%MB2300 : BYTE;
    cmdStep_1		AT%MB2301 : BYTE;
    cmdStep_2		AT%MB2302 : 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 Unterstation

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.

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

Beispiel 2

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

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

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.

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

Beispiel 2

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

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


Einführung: Instanz des Funktionsbausteins deklarieren

Tutorial: IEC 60870-5-101 controlled station (slave)

Instanz der IEC60870-5-101 Unterstation deklarieren und aufrufen

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

Die gesamte Funktionalität einer Unterstation ist im Funktionsbaustein FB_IEC870_5_101Slave gekapselt. Mit einer Instanz kann eine Verbindung zum Master aufgebaut werden. Das hSerial-Verbindungshändle der schnellen Task muss als VAR_IN_OUT-Variable an die Unterstation übergeben werden.

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;

    init 		: BOOL := TRUE;
    error 		: UDINT;

    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;
    server 		: FB_IEC870_5_101Slave;
END_VAR

und im Programmteil wird die Instanz aufgerufen:

IF init THEN
    init := FALSE;
...

ELSE
...
    server( 	pInputs := ADR( inputs ),
        cbInputs := SIZEOF( inputs ),
        pOutputs := ADR( outputs ),
        cbOutputs := SIZEOF( outputs ),
        pMemory := ADR( memory ),
        cbMemory := SIZEOF( memory ),
        pData := ADR( data ),
        cbData := SIZEOF( data ),
        pAOEntries := ADR( AODB ),
        cbAOEntries := SIZEOF( AODB ),
        hSerial := P_SerialComm_HighSpeed.hSerial, (* serial link interface connection handle from fast task *)
        bEnable := bEnable );
...

END_IF


Einführung: Protokollparameter

Tutorial: IEC 60870-5-101 controlled station (slave)

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 Unterstation an die Anforderungen des Masters angepasst werden. Die meisten Parameter sind mit Defaultwerten vorbelegt, so dass diese nicht verändert werden müssen.

Im unserem Beispiel setzen wir die Linkadresse und die Bytelänge der Linkadresse:

IF init THEN
    init := FALSE;
...

    server.protPara.linkAddr := 220;(* slave link address *)
    server.protPara.eLinkAddrSize := eIEC870_LinkAddr_TwoOctets; (* link address octet size *)

...

ELSE

    server( 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

Tutorial: IEC 60870-5-101 controlled station (slave)

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 Unterstation konfiguriert.

In unserer Einführung konfigurieren wir folgende Systemparameter:

  • Die gemeinsame ASDU-Adresse wird auf 7 gesetzt. (asduAddr)
  • Die Systemzeit der Unterstation wird während der Initialisierung mit der Systemzeit des lokalen TwinCAT PC's synchronisiert (bUsePCTime).
  • Die Synchronisierung der Systemzeit der Unterstation mit dem Uhrzeitsynchronisationsbefehl wird aktiviert (bSyncTime).
  • Während der Synchronisierung der Systemzeit in der Unterstation soll die Systemzeit des TwinCAT PC's nicht synchronisiert werden (bSyncPCTime).
  • Das Senden von M_EI_NA_1 (End of init) an die Zentralstation wird aktiviert (bEndOfInit).
  • Das Senden der periodischen/zyklischen Daten wird deaktiviert (bPerCyclic). Die Basiszeit fürs Senden dieser Daten wird auf 5s gesetzt.
  • Hintergrundabfrage wird deaktiviert (bBackScan). Die Zykluszeit für Hintergrundabfrage wird auf 30s gesetzt.
  • Das lokale Umspeichern und Reset der Zählerstände wird aktiviert (bPerFRZ) und die Zykluszeit fürs Umspeichern und Reset auf 15s gesetzt.
  • Das loggen der Debugmeldungen im Application-Log wird aktiviert (dbgMode). Es werden Änderungen im Gerätestatus gelogt.

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

IF init THEN
    init := FALSE;
...

    server.sysPara.asduAddr := 7;
    server.sysPara.bUsePCTime := TRUE;
    server.sysPara.bSyncTime := TRUE;
    server.sysPara.bSyncPCTime := FALSE;
    server.sysPara.bEndOfInit := TRUE;
    server.sysPara.bPerCyclic := FALSE;
    server.sysPara.tPerCyclicBase := T#5s;
    server.sysPara.bBackScan := FALSE;
    server.sysPara.tBackScanCycle := T#30s;
    server.sysPara.bPerFRZ := TRUE;
    server.sysPara.tPerFRZCycle := T#15s;
    server.sysPara.dbgMode :=  (*IEC870_DEBUGMODE_ASDU OR*) IEC870_DEBUGMODE_DEVSTATE;

...
ELSE

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

END_IF

Die Dokumentation aller Systemparameter finden Sie hier: ST_IEC870_5_101SystemParams.


Einführung: Stationsabfrage

Tutorial: IEC 60870-5-101 controlled station (slave)

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.

Konfiguration der Systemparameter

  • Es müssen keine speziellen Systemparameter gesetzt werden;

Konfiguration der Applikationsobjekte

  • Der Datenpunkt muss einer oder mehreren Groupen zugeordnet werden. Der Groupparameter muss gesetzt werden. Eine Übersicht aller verfügbaren Grouppen finden Sie hier: Group configuration flags.

Beispielkonfiguration für einen Datenpunkt der der Gruppe: 1 und der Gruppe: Allgemein zugerodnet wurde.

F_iecInitAOEntry( M_SP_NA_1, 100, IEC870_GRP_INROGEN OR IEC870_GRP_INRO1, 0, MAP_AREA_MEMORY, 100, 0, AODB[0] );


Einführung: Zählwertübertragung

Tutorial: IEC 60870-5-101 controlled station (slave)

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:

bPerFRZ  := TRUE
tPerFRZCycle := T#60s

Der erste Parameter aktiviert das örtliche Umspeichern oder Umspeichern mit Rücksetzen. Der zweite Parameter gibt die Zykluszeit an in der das umspeichern oder Umspeichern mit Rücksetzen durchgeführt wird (z.B.: alle 60 Sekunden).

Konfiguration der Applikationsobjekte:

  • IEC870_GRP_SPONTOFF-Groupparameter darf nicht gesetzt werden. Dieser würde die spontane Datenübertragung der Zählwerte verhindern.
  • Der Zählwert wird umgespeichert wenn IEC870_GRP_LOCFREEZE-Groupparameter gesetzt wurde.
  • Der Zählwert wird zurückgesetzt wenn IEC870_GRP_LOCRESET-Groupparameter gesetzt wurde.
  • Das Örtliche Umspeichern oder Umspeichern mit Rücksetzen wird gleichzeitig für alle Gruppen (1 bis 4 oder allgemein) durchgeführt.

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:

bPerFRZ  := TRUE
tPerFRZCycle := T#60s

Der erste Parameter aktiviert das örtliche Umspeichern oder (und) Rücksetzen. Der zweite Parameter gibt die Zykluszeit an in der das umspeichern oder Umspeichern mit Rücksetzen durchgeführt wird (z.B.: alle 60 Sekunden).

Konfiguration der Applikationsobjekte:

  • IEC870_GRP_SPONTOFF-Groupparameter muss gesetzt werden. Die Zählwerte sollen nicht spontan zur Zentralstation übertragen werden.
  • Der Zählwert wird umgespeichert wenn IEC870_GRP_LOCFREEZE-Groupparameter gesetzt wurde.
  • Der Zählwert wird zurückgesetzt wenn IEC870_GRP_LOCRESET-Groupparameter gesetzt wurde.
  • Das örtliche Umspeichern oder Umspeichern mit Rücksetzen wird gleichzeitig für alle Gruppen (1 bis 4 oder allgemein) durchgeführt.

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:

bPerFRZ  := FALSE
tPerFRZCycle := T#60s

Das örtliche Umspeichern oder (und) Rücksetzen muss deaktiviert werden. Der zweite Parameter wird ignoriert.

Konfiguration der Applikationsobjekte:

  • IEC870_GRP_SPONTOFF muss gesetzt werden. Die Zählwerte sollen nicht spontan zur Zentralstation übertragen werden.
  • IEC870_GRP_LOCFREEZE- und IEC870_GRP_LOCRESET-Groupparameter dürfen nicht gesetzt werden. Die Zentralstation leitet das Umspeichern oder (und) Rücksetzen ein.
  • Die Zählwerte können einzelnen Gruppen (1 bis 4 oder allgemein) zugeordnet und abgefragt werden (IEC870_GRP_REQCOGEN, IEC870_GRP_REQCO1,IEC870_GRP_REQCO2, IEC870_GRP_REQCO3, IEC870_GRP_REQCO4).

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:

bPerFRZ  := FALSE
tPerFRZCycle := T#60s

Das örtliche Umspeichern oder (und) Rücksetzen muss deaktiviert werden. Der zweite Parameter wird ignoriert.

Konfiguration der Applikationsobjekte:

  • IEC870_GRP_SPONTOFF-Groupparameter darf nicht gesetzt werden. Dieser würde die spontane Datenübertragung der Zählwerte verhindern.
  • IEC870_GRP_LOCFREEZE- und IEC870_GRP_LOCRESET-Groupparameter dürfen nicht gesetzt werden. Die Zentralstation leitet das Umspeichern oder (und) Rücksetzen ein.
  • Die Zählwerte können einzelnen Gruppen (1 bis 4 oder allgemein) zugeordnet und abgefragt werden (IEC870_GRP_REQCOGEN, IEC870_GRP_REQCO1,IEC870_GRP_REQCO2, IEC870_GRP_REQCO3, IEC870_GRP_REQCO4).


Einführung: Uhrzeitsynchronisation

Tutorial: IEC 60870-5-101 controlled station (slave)

Uhrzeitsynchronisation

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

Das Verhalten, wie die Systemzeit der Unterstation synchronisiert werden soll, ist über die Systemparameter konfigurierbar.

  • Die Systemzeit der Unterstation kann während der Initialisierung mit der Systemzeit des lokalen TwinCAT PC's synchronisiert werden;
  • Beim Empfang eines Uhrzeit-Synchronisationsbefehls von der Zentralstation kann die Systemzeit der Unterstation ebenfalls synchronisiert werden;
  • Die Systemzeit des lokalen TwinCAT PC's kann beim Empfang eines Uhrzeit-Synchronisationsbefehls auch synchronisiert werden.


Einführung: Hintergrundabfrage

Tutorial: IEC 60870-5-101 controlled station (slave)

Hintergrundabfrage

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

Die Hintergrundabfrage wird zum Auffrischen der Prozessinformationen von der Unterstation zur Zentralstation als zusätzlicher Sicherheitsbeitrag zur Stationsabfrage und spontanen Übertragung angewendet.
Applikationsobjekte mit Typkennungen wie für die Stationsabfrage, dürfen mit der Übertragungsursache <2> Hintergrundabfrage stetig mit niedriger Priorität übertragen werden. Die zulässigen ASDU-Typkennungen sind in der Kompatibilitätsliste der Station aufgelistet (Tabelle Typkennung <-> Übertragungsursache). Die Hintergrundabfrage wird von der Unterstation eingeleitet und ist unabhängig von den Stationsabfragebefehlen.

Konfiguration der Systemparameter

Der Übertragungszyklus wird durch Systemparameter in der Unterstation festgelegt.

bBackScan := TRUE;
tBackScanCycle := T#30s;

Konfiguration der Applikationsobjekte

Applikationsobjekte, deren Prozessdaten als Hintergrundabfrage übertragen werden sollen, müssen mit dem Group-Flag: IEC870_GRP_BACKGROUND konfiguriert werden.

Beispiel:

F_iecInitAOEntry( M_SP_NA_1, 100, IEC870_GRP_INROGEN OR IEC870_GRP_BACKGROUND, 0, MAP_AREA_MEMORY, 100, 0, AODB[0] );


Einführung: Zyklische Datenübertragung

Tutorial: IEC 60870-5-101 controlled station (slave)

Zyklische Datenübertragung

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

Die zyklische Datenübertragung wird ähnlich wie die Hintergrundabfrage von der Unterstation eingeleitet und ist unabhängig von anderen Befehlen aus der Zentralstation. Durch die zyklische Datenübertragung werden die Prozessdaten der Zentralstation kontinuierlich aufgefrischt. Bei den Prozessdaten handelt es sich meistens um Messwerte, die in regulären Zeitabständen erfasst werden. Die zyklische Datenübertragung wird oft benutzt um nicht-zeitkritische, oder sich nicht so schnell ändernde Prozessdaten zu überwachen (z.B. ein Temperatursensor). Die zyklischen/periodischen Daten werden zur Zentralstation mit der Übertragungsursache <1> Periodic/Cyclic übertragen. Die zulässigen ASDU-Typkennungen sind in der Kompatibilitätsliste der Station aufgeführt (Tabelle Typkennung <-> Übertragungsursache). Die zyklische Datenübertragung kann über die Systemparameter und die Konfigurationsparameter der Applikationsobjekte konfiguriert werden.

Konfiguration der Systemparameter:

bPerCyclic 	: BOOL := TRUE;
tPerCyclicBase 	: TIME := T#60s;

Der erste Parameter aktiviert die zyklische Übertragung. Der zweite Parameter ist die Basiszeit der zyklischen/periodischen Datenübertragung (hier z.B. 60 Sekunden).

Konfiguration der Applikationsobjekte:

  • IEC870_GRP_PERCYC-Groupparameter muss gesetzt werden;
  • Der Multiplikator-Parameter (multiplier) der F_iecInitAOEntry-Funktion muss auf einen Wert <> Null gesetzt werden. Beispiel: Bei einem Multiplikator = 2 und Basiszeit von 60 Sekunden werden die die Prozessdaten des Applikationsobjekts alle 120 Sekunden zur Zentralstation gesendet;

Beispielkonfiguration für einen Messwert der zyklisch alle 120 Sekunden zur Zentralstation übertragen werden soll (measured value, normalized value without time tag, M_ME_NA_1).

F_iecInitAOEntry( M_ME_NA_1, 222, IEC870_GRP_INROGEN OR IEC870_GRP_PERCYC, 2, MAP_AREA_MEMORY, 6, 0, AODB[2] );


Einführung: Befehlsübertragung

Tutorial: IEC 60870-5-101 controlled station (slave)

Befehlsübertragung

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

Befehle können von der Zentralstation in Steuerungsrichtung (zur Unterstation) gesendet werden.
Ein Einzelbefehl mit der Typkennung 45 (C_SC_NA_1) wird zur Steuerung eines Applikationsobjekts benutzt, das in Überwachungsrichtung als Einzelmeldung (M_SP_NA_1, M_SP_TA_1 oder M_SP_TB_1) übertragen wird. Ein Doppelbefehl (C_DC_NA_1) wird zur Steuerung eines Applikationsobjekts benutzt, das in Überwachungsrichtung als Doppelmeldung (M_DP_NA1, M_DP_TA_1 oder M_DP_TB_1) übertragen wird, usw.

Konfiguration der Systemparameter:

  • Es müssen keine speziellen Systemparameter gesetzt werden;

Konfiguration der Applikationsobjekte:

  • Die Applikationsobjekte müssen als Befehle (Datentypen in Steuerungsrichtung) konfiguriert werden;
  • Die Addressen der Informationsobjekte (IOA's) müssen den Adressen in der Leitstation entsprechen;

Beispiele:

Single command mit der IOA = 10. Der empfangene Wert wird in den Merkerbereichspuffer, Byteoffset = 100, Bitoffset = 0 kopiert.

F_iecInitAOEntry( C_SC_NA_1, 10, 0, 0, MAP_AREA_MEMORY, 100, 0, AODB[24] );

Double command mit der IOA = 20. Der empfangene Wert wird in den Merkerbereichspuffer, Byteoffset = 200, Bitoffset = 0..1 kopiert.

F_iecInitAOEntry( C_DC_NA_1, 20, 0, 0, MAP_AREA_MEMORY, 200, 0, AODB[27] );

Set point, scaled value mit der IOA = 60. Der empfangene Wert wird in den Merkerbereichspuffer, Byteoffset = 600..601, Bitoffset = 0 kopiert.

F_iecInitAOEntry( C_SE_NB_1, 60, 0, 0, MAP_AREA_MEMORY, 600, 0, AODB[39] )


Einführung: Leseprozedur/Abfrage

Tutorial: IEC 60870-5-101 controlled station (slave)

Abfrage-/Lese-Prozedur

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

Die Zentralstation sendet Abfragebefehle an die Unterstation.
In dem Abfragebefehl wird die Adresse des abzufragenden Applikationsobjekts übertragen. Die Daten dieses Applikationsobjekts sollen an die Zentralstation gesendet werden. Die Unterstation sendet die Daten mit der Übertragungsursache <5> Abfrage oder abgefragt. Die zulässigen ASDU-Typkennungen sind in der Kompatibilitätsliste der Station aufgelistet (Tabelle Typkennung <-> Übertragungsursache).

Konfiguration der Systemparameter

  • Es müssen keine speziellen Systemparameter gesetzt werden;

Konfiguration der Applikationsobjekte

  • Es müssen keine speziellen Parameter gesetzt werden;


Einführung: Doppelübertragung

Tutorial: IEC 60870-5-101 controlled station (slave)

Doppelübertragung

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

Alle Applikationsobjekte (Informationsobjekte), die mit der Übertragungsursache <3> Spontan übertragen werden, dürfen zweimal übertragen werden, mit und ohne Zeitmarke. Diese Betriebsart wird "Doppelübertragung" genannt.
Doppelübertragung wird von der Unterstation zur Zeit nicht unterstützt.


Einführung: Quality-Flags

Tutorial: IEC 60870-5-101 controlled station (slave)

Quality-Flags

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

Die Quality-Flags (Quality-Descriptor) liefern der Zentralstation zusätzliche Informationen zur Qualität eines Applikationsobjekts. Die Quality-Flags können aus der SPS-Applikation mit Hilfe der F_iecSetAOQuality-Funktion unabhängig voneinander gesetzt/zurückgesetzt werden. Mit der F_iecGetAOQuality-Funktion kann der Status der Quality-Flags abgefragt werden. Jede Änderung der Quality-Flags führt zu einer spontanen Übertragung der Daten zur Zentralstation.

Folgende Quality-Flags werden intern von der Unterstation zur Laufzeit ausgewertet:

  • IECQ_BL_ON (Blocked). Wurden die Prozessdaten des Applikationsobjekts für die Übertragung blockiert, dann wird das Mapping der SPS- und IEC-Prozessdaten für dieses Applikationsobjekt nicht ausgeführt;

Folgende Quality-Flags werden intern von der Unterstation zur Laufzeit gesetzt/zurückgesetzt:

  • IECQ_IV_ON (Invalid). Die Unterstation setzt das Invalid-Flag wenn das Mapping der SPS- und IEC-Prozessdaten nicht durchgeführt werden konnte (z.B. wegen fehlerhafter Konfiguration des Applikationsobjekts). Dieses Verhalten kann durch einen gesetzten Group-Parameter: IEC870_GRP_IV_OFF deaktiviert werden.

Alle anderen Quality-Flags werden unverändert zur Zentralstation gesendet.


Einführung: Test der Kommunikation

Tutorial: IEC 60870-5-101 controlled station (slave)

Test der Kommunikation

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

Durch das Setzen der bChangeIO-Variable auf TRUE wird eine einfache Simulation der Datenpunkte in Überwachungsrichtung aktiviert und mit FALSE deaktiviert. Bei einer aktiven Verbindung werden die Werte Zyklisch alle 3 Sekunden zur Leitstation übertragen.

PROGRAM MAIN
VAR
    ...

    bChangeIO : BOOL; (* TRUE => simulate/modify plc process data *)
    timer : TON;
    i : INT;

    ...
END_VAR
...

(*modify plc process data *)
timer( IN := bChangeIO, PT := T#3s );
IF timer.Q THEN
    timer( IN := FALSE );

    msgSingle_0 := NOT msgSingle_0;
    msgSingle_1 := NOT msgSingle_1;
    msgSingle_2 := NOT msgSingle_2;

    FOR i:= 0 TO 3 DO
        IF F_iecGetDPI(msgDouble_0, i) = eIEC870_DPI_ON THEN (* the value of double point allready ON? *)
            msgDouble_0 := F_iecSetDPI(	msgDouble_0, i, eIEC870_DPI_OFF ); (* change ON => OFF *)
        ELSE
            msgDouble_0 := F_iecSetDPI(	msgDouble_0, i, eIEC870_DPI_ON );(* change OFF => ON *)
        END_IF
    END_FOR

    F_iecIncVTI( msgStep_0 );
    F_iecDecVTI( msgStep_1 );

    msgBitStr_0 := ROL( msgBitStr_0, 1 );
    msgBitStr_1 := ROR( msgBitStr_1, 1 );

    msgNormalized_0 := msgNormalized_0 + 1;
    msgNormalized_1 := msgNormalized_1 + 2;

    msgScaled_0 := msgScaled_0 + 3;
    msgScaled_1 := msgScaled_1 - 3;

    msgFloating_0 := msgFloating_0 + 0.1;
    msgFloating_1 := msgFloating_1 + 1.5;

    msgTotal_0 := msgTotal_0 + 1;
    msgTotal_1 := msgTotal_1 + 2;
END_IF

...


Einführung: Übertragungs-/Kommunikationsfehler

Tutorial: IEC 60870-5-101 controlled station (slave)

Ü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 Unterstation können durch folgenden Aufruf ausgelesen werden:

PROGRAM MAIN
VAR
...

    server : FB_IEC870_5_101Slave;

...
END_VAR
....

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

...


Einführung: Fehlersuche und Diagnose

Tutorial: IEC 60870-5-101 controlled station (slave)

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 Unterstation 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

Tutorial: IEC 60870-5-101 controlled station (slave)

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_101Slave

TwinCAT PLC Library: IEC 60870-5-101 controlled station (slave)

FUNCTION_BLOCK FB_IEC870_5_101Slave

Mit einer Instanz des Funktionsbausteins FB_IEC870_5_101Slave kann in der TwinCAT SPS eine IEC60870-5-101 Unterstation (Slave) implementiert werden.

VAR_IN_OUT

VAR_IN_OUT
    hSerial 		: T_HSERIALCTRL;
ND_VAR

hSerial : Verbindungs-Handle zum FB_IEC870_SerialLineCtrl-Funktionsbaustein. Über diese Variable werden mit dem FB_IEC870_SerialLineCtrl-Funktionsbaustein die zu sendenden und empfangenen Daten ausgetauscht.

VAR_INPUT

VAR_INPUT
    protPara 	: ST_IEC870_5_101ProtocolParams; 						(* IEC60870-5-101 serial link protocol communication params *)
    sysPara 		: ST_IEC870_5_101SystemParams;						(* IEC60870-5-101 slave system params *)
    pAOEntries 	: POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF ST_IEC870_5_101AODBEntry; 	(* Pointer to the first element of application database object array *)
    cbAOEntries 	: UDINT; 								(* Byte size (length) of application database object array *)
    pInputs 		: POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE;
    cbInputs 	: UDINT;
    pOutputs 	: POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE;
    cbOutputs 	: UDINT;
    pMemory 		: POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE;
    cbMemory 	: UDINT;
    pData 		: POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE;
    cbData 		: UDINT;
    bEnable 		: BOOL := TRUE;
END_VAR

protPara: IEC60870-5-101-Protokollparameter.

sysPara: Systemparameter.

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.

pMemory: Adresse des SPS-Prozessdatenbereichs der Merker.

cbMemory: 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 Verbindung).

VAR_OUTPUT

VAR_OUTPUT
    system 		: ST_IEC870_5_101SystemInterface;
    eState 		: E_IEC870_5_101SerialLinkState := eSERIALLINK_DISCONNECTED; (* Serial link connection state *)
END_VAR

system: System-Interface. Diese Variable dient anderen SPS Funktionen oder Funktionsbausteinen als Kommunikationsschnittstelle zum IEC-Gerät (hier: Unterstation).

  • 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: Verbindungsstatus zum Master.

Beispiel:

Beispielprojekte: IEC60870-5-101 Unterstation

Aufruf in ST:

PROGRAM test
VAR
    slave1AODB 	: ARRAY[1..50] OF ST_IEC870_5_101AODBEntry;

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

    server1 		: FB_IEC870_5_101Slave;

    bEnable 		: BOOL;
    eState	 	: E_IEC870_5_101SerialLinkState;

    bError 		: BOOL;
    iecError 	: ST_IEC870_5_101ErrorFifoEntry;
END_VAR

server1.protPara.linkAddr := 220;
server1.protPara.eLinkMode := eIEC870_LinkMode_Unbalanced;
server1.protPara.elinkAddrSize := eIEC870_LinkAddr_TwoOctets;

server1.sysPara.asduFmt.eAsduAddrSize := eIEC870_AsduAddr_TwoOctets;
server1.sysPara.asduFmt.eObjAddrSize := eIEC870_ObjAddr_ThreeOctets;
server1.sysPara.asduFmt.eCOTSize := eIEC870_COT_TwoOctets;
server1.sysPara.asduAddr := 7;
server1.sysPara.bUsePCTime := TRUE;
server1.sysPara.bSyncTime := TRUE;
server1.sysPara.bSyncPCTime := FALSE;
server1.sysPara.bEndOfInit := TRUE;
server1.sysPara.bPerCyclic := FALSE;
server1.sysPara.tPerCyclicBase := T#5s;
server1.sysPara.bBackScan := FALSE;
server1.sysPara.tBackScanCycle := T#30s;
server1.sysPara.bPerFRZ := TRUE;
server1.sysPara.tPerFRZCycle := T#15s;
server1.sysPara.dbgMode := IEC870_DEBUGMODE_LINKLAYER;(* OR IEC870_DEBUGMODE_DEVSTATE OR IEC870_DEBUGMODE_ASDU;*)
server1.sysPara.bTimeCOT3 := FALSE;

server1( pInputs := ADR( inputs ),
    cbInputs := SIZEOF( inputs ),
    pOutputs := ADR( outputs ),
    cbOutputs := SIZEOF( outputs ),
    pMemory := ADR( memory ),
    cbMemory := SIZEOF( memory ),
    pData := ADR( data ),
    cbData := SIZEOF( data ),
    pAOEntries := ADR( slave1AODB ),
    cbAOEntries := SIZEOF( slave1AODB ),
    hSerial := P_SerialComm_HighSpeed.hSerial,
    bEnable := bEnable,
    eState=>eState );

Im folgenden Beispiel wird der Gerätefehler-Fifo zyklisch ausgelesen und die registrierten Fehler ins Windows Application Log geschrieben.

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

Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken
TwinCAT v2.9.0 Build >= 1030 | PC or CX (x86) | TcIEC870_5_101Slave.Lib ( Standard.Lib; TcBase.Lib; TcSystem.Lib; TcUtilities.Lib; TcIEC870_5_101Link.Lib; TcIEC870_5_101.Lib; COMLibV2.Lib werden automatisch eingebunden )
TwinCAT v2.10.0 Build >= 1301 | CX (ARM)


F_GetVersionTcIEC870_5_101Slave

TwinCAT PLC Library: IEC 60870-5-101 controlled station (slave)

FUNCTION F_GetVersionTcIEC870_5_101Slave

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

FUNCTION F_GetVersionTcIEC870_5_101Slave: 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.9.0 Build >= 1030 | PC or CX (x86) | TcIEC870_5_101Slave.Lib ( Standard.Lib; TcBase.Lib; TcSystem.Lib; TcUtilities.Lib; TcIEC870_5_101Link.Lib; TcIEC870_5_101.Lib; COMLibV2.Lib werden automatisch eingebunden )
TwinCAT v2.10.0 Build >= 1301 | CX (ARM)


ST_IEC870_5_101SystemInterface

TwinCAT PLC Library: IEC 60870-5-101 controlled station (slave)

TYPE ST_IEC870_5_101SystemInterface

TYPE ST_IEC870_5_101SystemInterface :
STRUCT
    device 	: ST_IEC870_5_101DeviceInterface;
    service 	: ST_IEC870_5_101SlaveServices;
END_STRUCT
END_TYPE

device: Kommunikationsschnittstelle des IEC-Gerätes. Diese Variable dient anderen SPS Funktionen oder Funktionsbausteinen als Kommunikationsschnittstelle zum IEC-Gerät (hier: Unterstation).

service: IEC-Gerätedienste;

Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken
TwinCAT v2.9.0 Build >= 1030 | PC or CX (x86) | TcIEC870_5_101Slave.Lib ( Standard.Lib; TcBase.Lib; TcSystem.Lib; TcUtilities.Lib; TcIEC870_5_101Link.Lib; TcIEC870_5_101.Lib; COMLibV2.Lib werden automatisch eingebunden )
TwinCAT v2.10.0 Build >= 1301 | CX (ARM)


Error codes overview

TwinCAT PLC Library: IEC 60870-5-101 controlled station (slave)

TwinCAT IEC 60870-5-101 Unterstation-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

TwinCAT PLC Library: IEC 60870-5-101 controlled station (slave)

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 Unterstation mit der Kompatibilitätsliste der Leitstation.

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 Leitstation.

4. Überprüfen Sie ob der Funktionsbaustein einen Fehlercode 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 Leitstation.

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 Leitstation.

7. Überprüfen Sie die Konfiguration der Datenpunkte (Typ, Adresse des Informationsobjektes usw.).

8. Überprüfen Sie ob die Leitstation einen Fehlercode ausgibt.

9. 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.


Sample

TwinCAT PLC Library: IEC 60870-5-101 controlled station (slave)

Beispiele

In den Beispielprojekten sind folgende Stationsparameter für die Unterstation 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
MiniSlaveSample.pro | MiniSlaveSample.tsm | Einfache TwinCAT IEC60870-5-101 Unterstation. 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 Unterstation