|
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- |
S7- |
||||
|
MB_ADDR |
IN |
UInt |
Word |
‑ |
Stationsadresse des Modbus-Slave: 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: |
|
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:
Das Bit NDR ist einen Zyklus lang TRUE, nachdem die letzte Anforderung ohne Fehler beendet wurde. |
|
|
DR |
OUT |
Bool |
FALSE |
Daten lesen:
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: |
|
QB_Count |
Word |
0xFFFF |
Anzahl der durch den Modbus-Master schreibbaren Ausgangs-Bytes. Hinweis: |
|
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:
-
Positionieren Sie den Cursor im Parameterfeld OUT1 und geben Sie das Zeichen m ein.
-
Wählen Sie in der Klappliste den gewünschten Instanz-DB der Anweisung Modbus_Slave aus.
-
Positionieren Sie den Cursor rechts vom DB-Namen (nach den Anführungszeichen) und geben Sie einen Punkt ein.
-
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.