Modbus_Slave: Als Modbus-Slave kommunizieren (S7-1200, S7-1500) - STEP 7

MODBUS (RTU) (S7-1200, S7-1500)

ft:publication_title
MODBUS (RTU) (S7-1200, S7-1500)
Product
STEP 7
Version
V20
Publication date
11/2024
Language
de-DE
Modbus_Slave: Als Modbus-Slave kommunizieren

Hinweis

Einsatz mit CM1241

Der Einsatz dieser Anweisung mit einem CM1241 ist erst ab einem Firmware-Stand V2.1 des Moduls möglich.

Beschreibung

Mit der Anweisung Modbus_Slave kann Ihr Programm über einen CM (RS422/485 oder RS232) als Modbus-Slave kommunizieren. STEP 7 erstellt automatisch einen Instanz-DB, wenn Sie die Anweisung einfügen. Der Parameter MB_DB der Anweisung Modbus_Comm_Load muss mit dem (statischen) Parameter MB_DB der Anweisung Modbus_Slave verschaltet werden.

Hinweis

Sie dürfen für einen Instanz-DB der Anweisung Modbus_Slave keine Remanenz (Retain) aktivieren.

Parameter

Parameter

Deklaration

Datentyp

Standard

Beschreibung

S7-
1200/1500

S7-
300/400/
WinAC

MB_ADDR

IN

UInt

Word

Stationsadresse des Modbus-Slave:
Standard-Adressierungsbereich (1 bis 247)
Erweiterter Adressierungsbereich (0 bis 65535)

Hinweis: 0 ist die Broadcast-Adresse

COM_RST

IN/OUT

---

Bool

FALSE

Initialisierung der Anweisung Modbus_Slave

Mit TRUE wird die Anweisung initialisiert. Anschließend wird COM_RST von der Anweisung wieder auf FALSE gesetzt.

Hinweis:
Der Parameter ist nur für S7-300/400-Anweisungen verfügbar.

MB_HOLD_REG

IN/OUT

Variant

Any

Pointer auf den Modbus-Halteregister-DB: Bei dem Modbus-Halteregister kann es sich um den Speicherbereich der Merker oder um einen Datenbaustein handeln.

Ab Anweisungsversion V4.0:

Der Parameter muss auf einen Speicherbereich zeigen, der eine Länge von mindestens 16 Bit hat. Eine geringere Länge führt zur Fehlermeldung 16#8187. Dies betrifft Single-Elemente, Arrays, STRUCTs und UDTs. Z.B. führt ein Single Bool oder ein Array, das aus weniger als 16 Bool-Elementen besteht, zu der Fehlermeldung.

Wenn die Länge kein Vielfaches von 16 Bit ist, können die Restbits am Ende des Speicherbereichs von der Anweisung Modbus_Slave weder gelesen noch geschrieben werden.

Der Parameter darf auf einen optimierten Speicherbereich zeigen. Im optimierten Speicherbereich ist ein Single-Element oder ein Array erlaubt mit folgenden Datentypen: Bool, Byte, Char, Word, Int, DWord, DInt, Real, USInt, UInt, UDInt, SInt, WChar. Jeder andere Datentyp führt zur Fehlermeldung 16#818C.

NDR

OUT

Bool

FALSE

Neue Daten bereit:

  • FALSE – Keine neuen Daten

  • TRUE – Gibt an, dass neue Daten vom Modbus-Master geschrieben wurden

Das Bit NDR ist einen Zyklus lang TRUE, nachdem die letzte Anforderung ohne Fehler beendet wurde.

DR

OUT

Bool

FALSE

Daten lesen:

  • FALSE – Keine Daten gelesen

  • TRUE – Gibt an, dass die Anweisung vom Modbus-Master empfangene Daten im Zielbereich abgelegt hat.

Das Bit DR ist einen Zyklus lang TRUE, nachdem die letzte Anforderung ohne Fehler beendet wurde.

ERROR

OUT

Bool

FALSE

Das Bit ERROR ist einen Zyklus lang TRUE, nachdem die letzte Anforderung mit Fehler beendet wurde. Wenn die Ausführung mit einem Fehler beendet wird, ist der Fehlercode im Parameter STATUS nur in dem einen Zyklus gültig, in dem ERROR = TRUE ist.

STATUS

OUT

Word

0

Fehlercode (siehe Fehlermeldungen)

Die Funktionscodes der Modbus-Kommunikation (1, 2, 4, 5 und 15) können Bits und Wörter direkt im Prozessabbild der Eingänge und im Prozessabbild der Ausgänge der CPU lesen und schreiben. Bei diesen Funktionscodes muss der Parameter MB_HOLD_REG als Datentyp größer als ein Byte definiert werden. Die folgende Tabelle zeigt die Beispielzuordnung der Modbus-Adressen zum Prozessabbild in der CPU.

Zuordnung der Modbus-Adressen zum Prozessabbild

Modbus-Funktionen

S7-1200

Code

Funktion

Datenbereich

Adressbereich

Datenbereich

CPU-Adresse

01

Bits lesen

Ausgang

0

bis

8191

Prozessabbild der Ausgänge

A0.0

bis

A1023.7

02

Bits lesen

Eingang

0

bis

8191

Prozessabbild der Eingänge

E0.0

bis

E1023.7

04

Wörter lesen

Eingang

0

bis

511

Prozessabbild der Eingänge

EW0

bis

EW1022

05

Bit schreiben

Ausgang

0

bis

8191

Prozessabbild der Ausgänge

A0.0

bis

A1023.7

15

Bits schreiben

Ausgang

0

bis

8191

Prozessabbild der Ausgänge

A0.0

bis

A1023.7

Zuordnung der Modbus-Adressen zum Prozessabbild

Modbus-Funktionen

S7-1500 / S7-300 / S7-400

Funktionscode

Funktion

Datenbereich

Adressbereich

Datenbereich

CPU-Adresse

01

Bits lesen

Ausgang

0

bis

9998

Prozessabbild der Ausgänge

A0.0

bis

A1249.6

02

Bits lesen

Eingang

0

bis

9998

Prozessabbild der Eingänge

E0.0

bis

E1249.6

04

Wörter lesen

Eingang

0

bis

9998

Prozessabbild der Eingänge

EW0

bis

EW19996

05

Bit schreiben

Ausgang

0

bis

9998

Prozessabbild der Ausgänge

A0.0

bis

A1249.6

15

Bits schreiben

Ausgang

0

bis

9998

Prozessabbild der Ausgänge

A0.0

bis

A1249.6

Hinweis

Der verfügbare Adressbereich kann, abhängig vom Speicherausbau der CPU, auch kleiner sein.

Die Funktionscodes der Modbus-Kommunikation (3, 6, 16) nutzen ein Modbus-Halteregister, bei dem es sich um einen Adressbereich im Speicherbereich der Merker oder um einen Datenbaustein handeln kann. Der Typ des Halteregisters wird vom Parameter MB_HOLD_REG der Anweisung Modbus_Slave angegeben.

Hinweis

S7-1200/1500 - Typ des Datenbausteins MB_HOLD_REG

Ein Datenbaustein mit Modbus-Halteregister muss die direkte (absolute) und die symbolische Adressierung zulassen.

Diagnosefunktionen

Modbus-Diagnosefunktionen von Modbus_Slave der S7-1200

Funktionscodes

Teilfunktion

Beschreibung

08

0000H

Echotest Abfragedaten ausgeben: Die Anweisung Modbus_Slave gibt einem Modbus-Master das Echo eines empfangenen Datenworts zurück.

08

000AH

Kommunikationsereigniszähler löschen: Die Anweisung Modbus_Slave löscht den Kommunikationsereigniszähler, der für Modbus-Funktion 11 verwendet wird.

11

Kommunikationsereigniszähler abrufen: Die Anweisung Modbus_Slave nutzt einen internen Kommunikationsereigniszähler, um die Anzahl erfolgreicher Modbus-Lese- und Modbus-Schreibanforderungen, die an den Modbus-Slave gesendet werden, zu erfassen. Der Zähler wird bei Funktion 8, Funktion 11 und Broadcast-Anforderungen nicht hochgezählt. Außerdem wird bei Anforderungen, die zu Kommunikationsfehlern führen (z. B. Paritäts- oder CRC-Fehler), nicht hochgezählt.

Die Anweisung Modbus_Slave unterstützt Broadcast-Schreibanforderungen von Modbus-Mastern, solange die Anforderungen den Zugriff auf gültige Adressen umfassen. Für Funktionscodes, die bei der Broadcast-Funktion nicht unterstützt werden, erzeugt Modbus_Slave den Fehlercode 16#8188.

Variablen des Modbus-Slave in der Anweisungsversion V3.0

Diese Tabelle zeigt die öffentlichen statischen Variablen im Instanz-Datenbaustein von Modbus_Slave, die in Ihrem Programm verwendet werden können.

Variablen des Modbus-Slave

Variable

Datentyp

Standard

Beschreibung

HR_Start_Offset

Word

0

Gibt die Anfangsadresse der Modbus-Halteregisters an (Standard = 0)

QB_Start

Word

0

Anfangsadresse des zulässigen schreibbaren Adressierungsbereichs der Ausgänge (Byte 0 bis 65535)

Hinweis:
Die Variable ist für S7-300, S7-400 und WinAC nicht verfügbar.

QB_Count

Word

0xFFFF

Anzahl der durch den Modbus-Master schreibbaren Ausgangs-Bytes.

Hinweis:
Die Variable ist für S7-300, S7-400 und WinAC nicht verfügbar.

Extended_Addressing

Bool

FALSE

Erweiterte Adressierung, konfiguriert die Slave-Adressierung als einzelnes oder doppeltes Byte

(FALSE = einzelne Byte-Adresse, TRUE = doppelte Byte-Adresse)

Request_Count

Word

0

Die Anzahl aller von diesem Slave empfangenen Anforderungen

Slave_Message_Count

Word

0

Die Anzahl der für diesen spezifischen Slave empfangenen Anforderungen

Bad_CRC_Count

Word

0

Die Anzahl der empfangenen Anforderungen, die einen CRC-Fehler aufweisen

Broadcast_Count

Word

0

Die Anzahl der empfangenen Broadcast-Anforderungen

Exception_Count

Word

0

Modbus-spezifische Fehler, die mit einer Exception an den Master quittiert werden

Success_Count

Word

0

Die Anzahl der für diesen spezifischen Slave empfangenen Anforderungen ohne Protokollfehler

MB_DB

MB_BASE

-

Der Parameter MB_DB der Anweisung Modbus_Comm_Load muss mit diesem Parameter MB_DB der Anweisung Modbus_Master verschaltet werden.

Ihr Programm kann in die Variablen HR_Start_Offset und Extended_Addressing Werte schreiben und die Modbus-Slave-Operationen steuern. Die anderen Variablen können gelesen werden, um den Modbus-Zustand zu überwachen.

Regeln für die Modbus-Slave-Kommunikation

  • Modbus_Comm_Load muss ausgeführt werden, um einen Port zu konfigurieren, damit die Anweisung Modbus_Slave über diesen Port kommunizieren kann.

  • Wenn ein Port als Slave auf einen Modbus-Master reagieren soll, darf dieser Port nicht mit der Anweisung Modbus_Master programmiert werden.

  • Nur eine Instanz von Modbus_Slave kann mit einem bestimmten Port verwendet werden, andernfalls kann unerwartetes Verhalten auftreten.

  • Die Modbus-Anweisungen nutzen keine Kommunikations-Alarmereignisse zum Steuern des Kommunikationsprozesses. Ihr Programm muss den Kommunikationsprozess durch Abfrage der Anweisung Modbus_Slave auf abgeschlossene Sende- und Empfangsvorgänge steuern.

  • Die Anweisung Modbus_Slave muss regelmäßig mit einer Häufigkeit ausgeführt werden, die eine zeitnahe Antwort auf eingehende Anforderungen eines Modbus-Masters ermöglicht. Es wird empfohlen, Modbus_Slave in jedem Zyklus aus einem Programmzyklus-OB auszuführen. Modbus_Slave kann aus einem Weckalarm-OB ausgeführt werden, doch ist dies nicht empfehlenswert, weil übermäßige Zeitverzögerungen im Interruptprogramm die Ausführung anderer Interruptprogramme temporär blockieren können.

Zeitsteuerung des Modbus-Signals

Modbus_Slave muss regelmäßig ausgeführt werden, um jede Anforderung des Modbus-Masters zu empfangen und entsprechend zu antworten. Die Häufigkeit der Ausführung von Modbus_Slave richtet sich nach dem vom Modbus-Master vorgegebenen Timeout-Wert für die Antwort. Dies ist in der nachstehenden Abbildung dargestellt.

Der Timeout-Zeitraum der Antwort (RESP_TO) ist die Zeitdauer, die ein Modbus-Master auf den Beginn einer Antwort von einem Modbus-Slave wartet. Dieser Zeitraum wird nicht vom Modbus-Protokoll definiert, sondern von einem Parameter der Anweisung Modbus_Comm_Load. Da sowohl das Empfangen als auch das Senden eines Telegramms mehrere, mindestens aber je drei Aufrufe der Anweisung Modbus_Slave erfordert, sollten Sie Modbus_Slave mindestens zwölfmal während des Timeout-Zeitraums für die Antwort des Modbus-Masters ausführen, damit das Empfangen und Senden von Daten durch den Modbus-Slave doppelt so oft ausgeführt wird, wie durch den Timeout-Zeitraum vorgegeben.

HR_Start_Offset

Die Adressen des Modbus-Halteregisters beginnen bei 40001 oder 400001. Diese Adressen entsprechen der Anfangsadresse des Halteregisters im Zielsystemspeicher. Sie können jedoch die Variable HR_Start_Offset konfigurieren, um eine andere Anfangsadresse als 40001 oder 400001 für das Modbus-Halteregister zu konfigurieren.

Die Adresse 0 im Empfangstelegramm entspricht der Anfangsadresse des Halteregisters im Zielsystemspeicher. Über die Variable HR_Start_Offset können Sie eine andere Anfangsadresse als 0 für das Modbus-Halteregister konfigurieren.

Sie können z. B. ein Halteregister mit Beginn an MW100 und einer Länge von 100 Wörtern konfigurieren. Mit HR_Start_Offset = 20 entspricht die Adresse 20 im Empfangstelegramm der Anfangsadresse des Halteregisters im Zielspeicher (MW100). Jede Adresse im Empfangstelegramm unter 20 und über 119 führt zu einem Adressierungsfehler.

Beispiel für die Adressierung des Modbus-Halteregisters, falls DATA_PTR ein Zeiger auf MW100 mit der Länge 100 Worte ist

HR_Start_Offset

Adresse

Minimum

Maximum

0

Modbus-Adresse (Wort)

0

99

S7-1500 Adresse

MW100

MW298

20

Modbus-Adresse (Wort)

20

119

S7-1500 Adresse

MW100

MW298

HR_Start_Offset ist ein Wortwert, der die Anfangsadresse des Modbus-Halteregisters angibt und im Instanz-Datenbaustein Modbus_Slave gespeichert ist. Sie können diese öffentliche statische Variable über die Parameter-Klappliste auswählen, nachdem Sie Modbus_Slave in Ihr Programm eingefügt haben.

Wenn Sie beispielsweise Modbus_Slave in ein KOP-Netzwerk eingefügt haben, können Sie in ein vorheriges Netzwerk gehen und den Wert HR_Start_Offset mit dem Move-Befehl zuweisen. Der Wert muss vor der Ausführung von Modbus_Slave zugewiesen werden.

Modbus-Slave-Variable über den Standard-DB-Namen eingeben:

  1. Positionieren Sie den Cursor im Parameterfeld OUT1 und geben Sie das Zeichen m ein.

  2. Wählen Sie in der Klappliste den gewünschten Instanz-DB der Anweisung Modbus_Slave aus.

  3. Positionieren Sie den Cursor rechts vom DB-Namen (nach den Anführungszeichen) und geben Sie einen Punkt ein.

  4. Wählen Sie in der Klappliste "Modbus_Slave_DB.HR_Start_Offset" aus.

Anweisungsversionen

Die Version 4.0 ist funktional identisch zur Version 3.0 und wurde aufgrund interner Maßnahmen erhöht.