Modbus-Server

Der eigene Modbus-TCP-Server der Station: seine Zeile in der Spalte Kommunikation, das Ein- und Ausschalten, sein Port und die verbundenen Clients, die Registertabelle, die Tags, Variablen der Logic und Alarmzustände bereitstellt, was ein Client liest und schreibt, ein durchgerechnetes Beispiel und was er nicht tut.

Als Markdown ansehen

Der Modbus-Server lässt eine SPS, ein HMI oder ein Gebäudeleitsystem, das nur Modbus TCP spricht, die Tags, die Variablen der Logic und die Alarmzustände der Station lesen und die Tags und Variablen schreiben, die Sie freigeben. Er ist der zweite Weg, auf dem Daten die Station verlassen, neben dem eingebetteten OPC UA-Server, und er ist kein Treiber: Ein Treiber liest Geräte, der Modbus-Server dagegen wird von Geräten gelesen; er wartet darauf, dass sich eine SPS verbindet, und verbindet sich selbst nie mit irgendetwas. Sein Bereich sagt es unter dem Titel: "Beantwortet SPS, HMIs und Gebäudeleitsysteme, die über Modbus TCP lesen und schreiben. Es nimmt Verbindungen an und baut selbst nie eine auf."

Modbus kennt weder Benutzernamen noch Passwort: Wer den Port erreicht, liest jedes Register, das die Tabelle bereitstellt. Deshalb beginnt der Server ausgeschaltet, jede Zeile seiner Tabelle beginnt schreibgeschützt, und das Schreiben wird Zeile für Zeile erlaubt, von jemandem, der es so gewählt hat. Connector anzeigen liest die Seite; Connector konfigurieren ändert sie.

Die Zeile in der Spalte

Die Zeile Modbus-Server steht unter dem Ordner Server im Baum der Spalte Kommunikation, unter der Zeile des OPC UA-Servers, mit einem Server-Symbol, wo die Treiber einen Stecker zeigen. Sie ist immer da: Eine Station hat genau eine, und sie wird nie angelegt oder gelöscht. Das Suchfeld findet sie über ihren Namen, und die Zustands-Chips ordnen sie nach ihrem Zustand ein: Aus, solange der Server ausgeschaltet ist, Störungen, solange sein Port belegt ist oder er nicht lauschen konnte, sonst OK. Neben dem Namen sagt sie, was der Server gerade tut, und ein Punkt fasst es zusammen:

Die Zeile sagt Punkt Wann
"Ausgeschaltet" grau Der Server ist aus, so beginnt jede Station.
"Lauscht auf Port 502", dann wie viele Clients verbunden sind: "Kein Client verbunden", "1 Client verbunden", "3 Clients verbunden" grün Der Server ist eingeschaltet und die Runtime läuft: Der Port ist offen.
"Port 502 ist belegt" rot Der Server ist eingeschaltet, aber ein anderes Programm hält den Port.
"Konnte auf Port 502 nicht lauschen" rot Der Server ist eingeschaltet, aber Windows hat das Öffnen des Ports aus einem anderen Grund verweigert.
"Runtime gestoppt" grau Der Server ist eingeschaltet und die Runtime ist gestoppt: Der Port bleibt zu, bis die Runtime wieder läuft.

Der Punkt gehört allein dem Server: Er geht weder in die Zusammenfassung des Ordners Treiber noch in die Statusleiste ein, die von den Geräten handeln, die die Station liest. Die Zeile zu wählen öffnet den Bereich des Servers; seine Kopfzeile wiederholt den Zustand neben demselben Punkt. Die Befehle stehen auf der Befehlsleiste; die Zeile hat kein eigenes Menü.

Ein- und Ausschalten

Befehl Was er tut Ausgegraut, wenn (Situation) Nicht gezeichnet, wenn (Rolle)
Aktivieren Schaltet den Server ein, wie sein Tooltip sagt: "Den Server einschalten: Er lauscht auf Port 502, solange die Runtime läuft." Der Port öffnet sofort, wenn die Runtime läuft, und das Aktionsprotokoll sagt "Modbus-Server eingeschaltet." Der Server ist bereits eingeschaltet ("Der Server ist bereits eingeschaltet."), ein Lauf hält die Station, oder die Runtime ist gestoppt; der Tooltip nennt den Grund. Ohne Connector konfigurieren.
Deaktivieren Schaltet den Server aus: "Den Server ausschalten: Er schließt seinen Port und trennt jeden Client." Das Aktionsprotokoll sagt "Modbus-Server ausgeschaltet." Der Server ist bereits ausgeschaltet ("Der Server ist bereits ausgeschaltet."), ein Lauf hält die Station, oder die Runtime ist gestoppt. Ohne Connector konfigurieren.

Eingeschaltet zu sein ist eine Einstellung, die die Station behält, und das Lauschen folgt der Runtime:

Moment Was der Server tut
Die Station startet Ein eingeschaltet gelassener Server öffnet seinen Port, sobald die Runtime steht und die Läufe, die sie fortsetzt, wieder da sind; ein ausgeschaltet gelassener Server bleibt aus.
Der Port lässt sich nicht öffnen Die Zeile sagt "Port 502 ist belegt" oder "Konnte auf Port 502 nicht lauschen", und die Karte Port und Clients sagt es unter dem Portfeld: "Port 502 ist auf diesem Rechner belegt. Schließen Sie, was ihn hält, oder wählen Sie einen anderen Port.", oder derselbe Fehler, gefolgt von dem Grund, den Windows genannt hat. Die Station läuft ohne ihn weiter. Der Server versucht es nicht von selbst erneut: Sobald der Port frei ist, schalten Sie ihn aus und wieder ein oder verschieben ihn auf einen anderen Port.
Die Runtime wird gestoppt Der Port schließt, und jeder Client wird getrennt; ein Schreibzugriff, der noch auf seine Antwort wartet, hört auf zu warten. Die Zeile sagt "Runtime gestoppt", und der Neustart der Runtime öffnet den Port wieder.
Die Anwendung wird geschlossen Der Port schließt mit allem anderen.

Die Karte Port und Clients

Die erste Karte des Bereichs ist Port und Clients.

Feld Was es tut Werte und Vorgabe
TCP-Port Der Port, auf dem der Server lauscht, auf jeder Adresse dieses Rechners, IPv4 und IPv6. Ihn zu ändern, während der Server lauscht, schließt den alten Port und öffnet den neuen, was jeden Client trennt; das Aktionsprotokoll sagt "Modbus-Server auf Port 5020 verschoben." 1 bis 65535. Vorgabe 502, der Modbus-Standard.
Verbundene Clients Wie viele Clients gerade verbunden sind: "Kein Client verbunden", "1 Client verbunden", "3 Clients verbunden". Solange jemand verbunden ist, führt eine Tabelle jeden mit Client-Adresse (seine IP-Adresse und sein Port, etwa 192.168.0.20:51234) und Verbunden seit (Datum und Uhrzeit, im Format der Station) auf. Nur lesend.

Ein Port, auf den der Server nicht wechseln kann, wird abgelehnt, bevor etwas gespeichert wird: Der Grund steht unter dem Feld, das Feld zeigt wieder den geltenden Port, und der Server bleibt, wo er war. Sechs Eingaben werden abgelehnt: eine Zahl außerhalb des Bereichs ("Der Port muss zwischen 1 und 65535 liegen."); der Port des Webservers, eingestellt unter Fernzugriff ("Port N ist bereits der Webserver. Wählen Sie einen anderen Port, oder verschieben Sie zuerst den Webserver."); der Port, auf den der Agentenzugriff auf der Seite Agent eingestellt ist, ob der Agentenzugriff an oder aus ist ("Port N ist bereits der Agentenzugriff. Wählen Sie einen anderen Port, oder verschieben Sie zuerst den Agentenzugriff."); der Port des OPC UA-Servers unter Konfiguration, ob er läuft oder gestoppt ist ("Port N ist bereits der OPC UA-Server. Wählen Sie einen anderen Port, oder verschieben Sie zuerst den Server."); der Port des MQTT-Brokers auf der Seite Connector, ob er ein- oder ausgeschaltet ist ("Port N ist bereits der MQTT-Broker. Wählen Sie einen anderen Port, oder verschieben Sie zuerst den MQTT-Broker."); und ein Port, den gerade etwas anderes auf diesem Rechner hält ("Port N ist auf diesem Rechner belegt. Schließen Sie, was ihn hält, oder wählen Sie einen anderen Port."). Die vier anderen Portfelder lehnen ihrerseits den Port dieses Servers ab. Der Grund bleibt unter dem Feld bis zum nächsten Port, den das Feld annimmt, oder bis die Zeile erneut gewählt wird.

Unter der Karte steht ein Hinweis: "Beantwortet jede Unit-ID. Andere Rechner erreichen diesen Server nur, wenn die Windows-Firewall TCP-Port 502 durchlässt: Das zu erlauben ist Ihre Entscheidung, und diese Station tut es nie von selbst."

Der Server nimmt höchstens 16 Clients gleichzeitig: Eine siebzehnte Verbindung wird geschlossen, sobald sie sich öffnet, und das Journal hält es fest. Ein Client, der verschwindet, ohne seine Verbindung zu schließen (eine ausgeschaltete SPS, ein gezogenes Kabel), wird durch das TCP-Keep-alive erkannt, und sein Platz wird nach etwa anderthalb Minuten frei.

Windows-Firewall

Unter dem Hinweis sagen ein Punkt und ein Satz, ob die eingehende Regel der Station diesen Port durchlässt, so wie die Karte Client-Zugriff es für den OPC UA-Port sagt, mit einer Handlung, wenn sie es nicht tut.

Zustand Text
Erlaubt (grün) "Eingehende Modbus-Verbindungen sind auf Port N für private und Domänennetzwerke erlaubt."
Nicht eingerichtet (bernsteinfarben) "Clients aus dem Netzwerk sind möglicherweise blockiert, weil keine Regel dieser Anwendung Port N erlaubt." Die Schaltfläche Lokales Netzwerk erlauben wird gezeichnet.
Nicht unterstützt (grau) "Dieser Start kann die Windows-Firewall nicht verwalten. Richten Sie den eingehenden Zugriff bei Bedarf im Betriebssystem ein." Ein Entwicklungsstand, eine portable Kopie oder eine Vorführung, oder jeder Lauf, der nicht die installierte Anwendung ist.
Unbekannt (grau) "Der Zustand der Windows-Firewall ließ sich nicht ermitteln."
Befehl Was er tut Ausgegraut, wenn (Situation) Nicht gezeichnet, wenn (Rolle)
Lokales Netzwerk erlauben Startet den eigenen Helfer der Anwendung mit erhöhten Rechten, sodass Windows nach der Zustimmung des Administrators fragt, und legt die Regel für diesen Port an, begrenzt auf die Profile Privat und Domäne, das lokale Subnetz und dieses Programm. Liest währenddessen "Wird angewendet…"; das Aktionsprotokoll sagt "Zugriff der Windows-Firewall für den Modbus-Port N wird angefordert…", danach "Die Windows-Firewall erlaubt jetzt Modbus-Verbindungen auf Port N." oder den Zustandstext als Fehler. Eine abgebrochene Frage nach der Zustimmung lässt den Zustand Nicht eingerichtet. In einem Browser auf einem anderen Gerät ("Die Firewallregel lässt sich nur aus der Desktop-Anwendung an der Station anwenden."), solange ein Lauf die Station hält oder die Runtime gestoppt ist, und während die Regel angewendet wird ("Die Firewallregel wird angewendet."). Ohne Connector konfigurieren.

Der Zustand wird beim Öffnen der Karte und nach jedem Wechsel des Ports erneut gelesen; ein neuer Port steht also auf Nicht eingerichtet, bis Sie ihn erlauben. Die Station legt die Regel nie von selbst an.

Die Registertabelle

Die zweite Karte, Registertabelle, ist das, was der Server bereitstellt: Jede Zeile legt ein Tag, eine Variable der Logic oder einen Alarmzustand auf ein Register oder eine Coil, die ein Client adressiert. Ein Register, das keine Zeile abdeckt, gibt es für einen Client nicht. Die Karte sagt: "Jede Zeile liefert ein Tag, eine Logic-Variable oder einen Alarmzustand an einem Register. Eine Zeile bleibt schreibgeschützt, bis Sie das Schreiben erlauben, und eine Zeile, die einen Alarm liefert, bleibt es immer. Ein Schreibzugriff eines Clients nimmt dann denselben Weg wie jeder andere und wird mit der Adresse des Clients im Journal festgehalten."

Die Tabelle

Spalte Was sie zeigt
Registerklasse Holding-Register (4xxxx), Eingangsregister (3xxxx), Spule (0xxxx) oder Diskreter Eingang (1xxxx), jede mit der ersten Ziffer, die die Adresse im Handbuch für sie trägt.
Register Das Register, an dem die Zeile beginnt, ab 0 gezählt, und das letzte, das sie belegt: 0 für eine Zeile aus einem Register, 0-1 für einen Float.
Im Handbuch Dieselbe Stelle in der Schreibweise, die das Handbuch oder das SPS-Werkzeug des Clients schreibt: die erste Ziffer der Klasse und dann das ab 1 gezählte Register. 40001 für Holding-Register 0, 40001 bis 40002 für einen Float dort, sechs Stellen über 9999 (410000 für Holding-Register 9999).
Datentyp Boolean, Int16, UInt16, Int32, Float oder String.
Zugriff Nur lesen, oder Lesen und schreiben.
Quelle Die Quelle, so wie die Auswahl sie benennt.
Aktueller Wert Was ein Client dort gerade liest, oder ein Strich, wenn ein Client, der die Zeile liest, die Ausnahme 04 erhält.

Die Zeilen stehen nach Klasse geordnet (Holding-Register, Eingangsregister, Coils, diskrete Eingänge), dann nach Register. Ohne Zeile: "Noch wird kein Register geliefert. Fügen Sie eines mit Neue Zeile hinzu." Ein Klick auf eine Zeile wählt sie und öffnet ihre Felder unter der Tabelle; welche Zeile gewählt ist, gehört zu dem Fenster, in dem Sie arbeiten.

Was die Tabelle wachsen lässt und was eine Zeile beendet, steht rechts vom Titel der Karte:

Befehl Was er tut Ausgegraut, wenn (Situation) Nicht gezeichnet, wenn (Rolle)
Neue Zeile Fügt eine Zeile am ersten Holding-Register an, das keine Zeile belegt: Float, beide Reihenfolge-Kästchen an, schreibgeschützt, noch ohne Quelle. Die Zeile wird gewählt, und das Aktionsprotokoll sagt "Zeile bei Holding-Register (4xxxx) 40001 bis 40002 hinzugefügt." Ist kein Holding-Register mehr frei: "Für eine neue Zeile ist kein Holding-Register mehr frei." Ein Lauf hält die Station, oder die Runtime ist gestoppt. Ohne Connector konfigurieren.
Zeile löschen (Warnfarbe) Löscht die Zeile, die die Tabelle gewählt hat, sofort und ohne Rückfrage; ihr Tooltip nennt sie ("Zeile bei Holding-Register (4xxxx) 40001 bis 40002 löschen"), und das Aktionsprotokoll sagt "Zeile bei Holding-Register (4xxxx) 40001 bis 40002 gelöscht." Das Tag oder die Variable, die sie bereitstellte, bleibt unberührt. Ein Client, der diese Register liest, erhält von da an die Ausnahme 02. Keine Zeile gewählt ("Wählen Sie eine Zeile der Registertabelle, um sie zu löschen."), ein Lauf hält die Station, oder die Runtime ist gestoppt. Ohne Connector konfigurieren.

Die Felder einer Zeile

Eine Zeile hat genau die Felder und die Regeln eines Modbus-Tags: Ein Punkt, der an einem Ende der Leitung angenommen wird, wird auch am anderen angenommen. Jedes Feld wird in dem Moment gespeichert, in dem es sich ändert (eine Zahl, wenn Sie das Feld verlassen oder Enter drücken, eine Auswahl, wenn Sie auswählen, ein Kästchen, wenn Sie es anhaken), und ein Client erhält die neue Zeile ab seiner nächsten Anfrage, ohne getrennt zu werden.

Feld Was es tut Werte und Vorgabe
Registerklasse In welcher Modbus-Tabelle die Zeile antwortet. Eine Spule oder einen diskreten Eingang zu wählen macht den Typ zu Boolean; ein Eingangsregister oder einen diskreten Eingang zu wählen macht die Zeile schreibgeschützt. Holding-Register (4xxxx), Eingangsregister (3xxxx), Spule (0xxxx), Diskreter Eingang (1xxxx). Holding-Register bei einer neuen Zeile.
Registernummer (ab 0) Wo die Zeile beginnt, die Nummer, wie sie in der Anfrage reist: Holding-Register 0 ist das, was die klassische Schreibweise 40001 nennt. Daneben liest Adresse im Handbuch die Zeile in dieser Schreibweise, wie die Spalte Im Handbuch. 0 bis 65535. Das erste freie Holding-Register bei einer neuen Zeile.
Datentyp Wie der Wert angeordnet ist, so wie ein Modbus-Tag ihn anordnet (Werttypen und Anzahlen): Boolean in einem Register (1 oder 0) oder als ein Bit, Int16 und UInt16 in einem Register, Int32 und Float in zweien, String als UTF-8 mit zwei Bytes pro Register. Eine Coil und ein diskreter Eingang tragen nur einen Boolean. Boolean auf einer Registerzeile zu wählen verschiebt sie auf einen diskreten Eingang (schreibgeschützt) oder eine Spule (lesen und schreiben); eine Zahl auf einer Coil oder einem diskreten Eingang zu wählen verschiebt sie auf ein Eingangsregister oder ein Holding-Register, wie es der Bereich eines Modbus-Tags tut. Boolean, Int16, UInt16, Int32, Float, String. Float bei einer neuen Zeile.
Länge (Register) Nur für einen String gezeichnet: wie viele Register der Text belegt. Leer heißt 4. 1 bis 65535.
Höchstwertiges Byte zuerst (MSB first, Big-Endian) Welches Byte jedes Registers zuerst reist; die Wörter in Klammern sind die, die Handbücher dafür drucken. Nicht gezeichnet für einen String, auch nicht für eine Coil oder einen diskreten Eingang. An.
Höchstwertiges Wort zuerst (High-Word zuerst) Welches Register des Paars die obere Hälfte trägt. Nur für Int32 und Float gezeichnet. Mit beiden Kästchen an reist ein Float als AB CD, in der Reihenfolge der Spezifikation (Byte- und Wortreihenfolge); Byte-Reihenfolge des Werts unter den Kästchen nennt die Anordnung, die sie ergeben (ABCD, CDAB, BADC oder DCBA). An.
Zugriff Ob ein Client die Zeile schreiben darf. Auf einem Eingangsregister oder einem diskreten Eingang bleibt Lesen und schreiben aufgeführt und ausgegraut, und sein Tooltip sagt "Nur ein Holding-Register oder eine Coil nimmt Schreibzugriffe an." Auf einer Zeile, die einen Alarm liefert, ist es ebenfalls ausgegraut: "Eine Zeile, die einen Alarm liefert, ist schreibgeschützt." Nur lesen oder Lesen und schreiben. Nur lesen bei einer neuen Zeile.
Quelle Was die Zeile bereitstellt. Die Liste beginnt mit "(keine)", dann jedes aktivierte Tag eines aktivierten Geräts, benannt nach seinem Treiber, seinem Gerät und sich selbst ("Tag · Simulated · Oven · Temperature"), dann jede Variable der Logic, die einen Wert hält (Wahrheitswert, Ganzzahl, Dezimalzahl, Text oder Datum und Uhrzeit), mit ihrem Namen ("Variable · Setpoint") oder, in einem Ordner abgelegt, mit ihren Ordnern und ihrem Namen ("Variable · Oven / Setpoint"), sodass zwei gleichnamige Variablen auseinanderzuhalten sind. Danach jeder Alarm, auf dieselbe Weise benannt ("Alarm · Oven / High temperature"); eine Zeile, die einen Alarm liefert, ist immer schreibgeschützt und liefert den Zustand, den Gelieferter Alarmzustand nennt. Die Zeile hält ihre Quelle über deren Identität, deshalb bleibt die Zeile auf demselben Punkt, wenn das Tag oder die Variable umbenannt oder das Gerät in einen Ordner abgelegt wird. Eine Quelle, die die Liste nicht mehr anbietet, bleibt gewählt und benannt: ein deaktiviertes Tag als "Tag · Simulated · Oven · Temperature (deaktiviert)", ein Tag eines deaktivierten Geräts als "Tag · Simulated · Oven · Temperature (Gerät deaktiviert)", und nur eine Quelle, die es nicht mehr gibt, als Fehlendes Tag oder Fehlende Variable mit ihrer Identität. Die Karte Verwendet von eines Tags führt die Zeilen auf, die es bereitstellen, und ihr Alle ersetzen verschiebt sie auf das gewählte Tag. "(keine)" bei einer neuen Zeile.
Gelieferter Alarmzustand Erscheint bei einer Zeile, die einen Alarm liefert: welchen seiner Zustände ein Client liest. Aktiv (Boolean) ist 1, solange die Bedingung gilt, Quittiert (Boolean) ist 1, solange nichts auf eine Quittierung wartet, und Zustand (Zahl) ist der Zustand als Zahl. Aktiv (Boolean) bei einer neuen Alarmzeile.

Unter den Feldern lesen drei Zeilen die Zeile zurück: wo sie liegt ("Belegt Register 0." oder "Belegt die Register 0 bis 1."), was ein Client mit ihr tun darf ("Ein Client darf diese Zeile lesen, aber nicht schreiben." oder "Ein Client darf diese Zeile lesen und schreiben: Jeder Schreibzugriff wird mit seiner Adresse im Journal festgehalten.", oder "Ein Client liest diesen Alarmzustand und schreibt ihn nie. Als Zahl ist 0 der Normalzustand, 1 aktiv und unquittiert, 2 aktiv und quittiert, 3 gegangen und unquittiert." bei einer Zeile, die einen Alarm liefert), und was ein Client dort gerade liest ("Aktueller Wert: 21.5"). Wenn ein Client, der die Zeile liest, keinen Wert erhielte, folgt der Grund:

Der Bereich sagt Wann
"Diese Zeile liefert noch nichts: Wählen Sie ihre Quelle." Es ist keine Quelle gewählt.
"Die Quelle dieser Zeile gibt es nicht mehr. Ein Client, der sie liest, erhält die Ausnahme 04." Das Tag oder die Variable wurde gelöscht.
"Die Quelle hat gerade keinen gültigen Wert. Ein Client, der diese Zeile liest, erhält die Ausnahme 04, bis sie wieder einen hat." Das Tag hat keinen gültigen Wert (sein Gerät antwortet nicht und das Tag zeigt keinen Ersatzwert, das Tag oder sein Gerät ist deaktiviert, ein Grenzwertfehler hat seine Qualität schlecht gemacht), oder die Variable ist eine Lücke.
"Der Wert der Quelle passt nicht zum Typ dieser Zeile. Ein Client, der sie liest, erhält die Ausnahme 04." Ein Wert, den keine Zeile dieses Typs halten kann: ein NaN in einer Ganzzahl-Zeile, oder ein Text, der länger ist als die Register der Zeile.

Was eine Zeile ablehnt

Eine Änderung, die die Regeln des Servers ablehnen, wird nicht gespeichert: Der Grund steht rot über den Feldern der Zeile, die Änderung bleibt auf dem Bildschirm, damit Sie sie korrigieren können, und die Zeile stellt weiter bereit, was sie bereitstellte, bis eine Änderung angenommen wird. Die anderen Zeilen sind nicht betroffen.

Der Bereich sagt Wann
"Die Registernummer muss zwischen 0 und 65535 liegen." Ein Register außerhalb des Bereichs des Protokolls.
"Ein Modbus-Punkt trägt Boolean, Int16, UInt16, Int32, Float, String." Ein Typ außerhalb dieser sechs, den nur ein Agent verlangen kann.
"Eine Coil oder ein diskreter Eingang trägt einen Boolean." Eine Zahl in einer Coil oder einem diskreten Eingang, die nur ein Agent verlangen kann.
"Ein Text belegt 1 bis 65535 Register." Eine String-Länge außerhalb des Bereichs.
"Die Register 65535 bis 65536 reichen über Register 65535 hinaus." Eine Zeile, die nach dem letzten Register enden würde: hier ein Float bei 65535.
"Die Register 40001 bis 40002 überschneiden sich mit der Zeile bei Holding-Register (4xxxx) 40002." Zwei Zeilen derselben Klasse, die sich ein Register teilen.
"Ein Eingangsregister oder ein diskreter Eingang ist für einen Client schreibgeschützt: Nur ein Holding-Register oder eine Coil nimmt Schreibzugriffe an." Schreiben auf einer Eingangsklasse erlaubt, was nur ein Agent verlangen kann.
"Eine Zeile, die Schreibzugriffe annimmt, braucht das Tag oder die Variable, an die sie gehen." Lesen und schreiben vor einer Quelle gewählt, oder die Quelle auf einer Zeile, die Schreiben erlaubt, auf "(keine)" zurückgesetzt. Wählen Sie zuerst die Quelle.
"Die Quelle kann nicht geschrieben werden: Wählen Sie ein Tag mit Schreibzugriff oder eine Merker-Variable, oder lassen Sie die Zeile schreibgeschützt." Schreiben auf einer Zeile erlaubt, deren Quelle ein schreibgeschütztes Tag ist, ein Tag eines Treibers, der nie schreibt, eine Variable der Art Ausdruck oder eine Quelle, die es nicht mehr gibt.
"Die Quelle enthält einen Text oder ein Datum, was nur eine String-Zeile trägt." Ein Tag mit Text oder Datum, oder eine Variable Text oder Datum und Uhrzeit, in einer Zeile jedes anderen Typs.
"Eine Zeile, die einen Alarm liefert, ist schreibgeschützt: Ein Client liest den Zustand des Alarms und schreibt ihn nie." Lesen und schreiben für eine Zeile verlangt, die einen Alarm liefert, was nur ein Agent verlangen kann.
"Diese Zeile der Registertabelle gibt es nicht mehr. Laden Sie neu und versuchen Sie es erneut." Die Zeile wurde anderswo gelöscht, in einem anderen Fenster oder von einem Agenten, während Sie sie bearbeitet haben.

Solange ein Lauf die Station hält oder die Runtime gestoppt ist, wird eine Änderung abgelehnt wie jede Änderung der Seite, mit dem Grund im Aktionsprotokoll ("Die Projektierung ist gesperrt, solange eine Einheit läuft.", "Runtime gestoppt"), und nichts wird gespeichert.

Was ein Client liest und schreibt

Der Server beantwortet jede Unit-ID, und er antwortet mit der Unit-ID, mit der er gefragt wurde: Über TCP wird eine Station über ihre IP-Adresse angesprochen. Registernummern reisen ab 0 gezählt. Ein SPS-Werkzeug, das ab 1 zählt oder die klassische Schreibweise verwendet, rechnet den Versatz selbst ein:

Registerklasse Lesen mit Funktion Schreiben mit Funktion Register 0 in der klassischen Schreibweise
Holding-Register (4xxxx) 3 6 (ein Register) oder 16 (mehrere) 40001
Eingangsregister (3xxxx) 4 keine: nur lesen 30001
Spule (0xxxx) 1 5 (eine Coil) oder 15 (mehrere) 00001
Diskreter Eingang (1xxxx) 2 keine: nur lesen 10001

Jeder andere Funktionscode erhält die Ausnahme 01. Eine Anfrage liest höchstens 125 Register oder 2000 Coils oder Eingänge und schreibt höchstens 123 Register oder 1968 Coils.

Ein Lesezugriff wird ganz oder gar nicht beantwortet. Jeder Wert wird aus dem aktuellen Zustand der Station gelesen, nie für den Client ausgewertet: Ein Tag liefert seinen technischen Wert, den, den die Station nach der Wertkette zeigt, eine Variable liefert ihren Wert, und ein Alarm den Zustand, den seine Zeile nennt. Der Wert wird mit der einen Umrechnung der Station in den Typ der Zeile gewandelt: Eine Gleitkommazahl wird für eine Ganzzahl-Zeile auf die nächste ganze Zahl gerundet (Hälften von null weg) und an den Grenzen des Typs gehalten, eine Int16-Zeile liefert also 32767 für 40000. Ein Lesezugriff darf einen Teil einer Zeile aus zwei Registern verlangen: Er erhält die verlangten Register, so wie der kodierte Wert sie hält. Eine Zeile, deren Quelle keinen gültigen Wert hat, erhält nie einen letzten Wert, den der Server aufbewahrt hätte: Ein Register trägt keine Qualität, und eine SPS, die eine alte Zahl läse, handelte nach einem Wert, von dem die Station weiß, dass er nicht aktuell ist. Der Client erhält stattdessen die Ausnahme 04, und seine eigene Behandlung von Kommunikationsfehlern entscheidet; der Preis ist, dass eine Zeile ohne Wert einen Blocklesezugriff scheitern lässt, der sie überspannt, und die Spalte Aktueller Wert der Tabelle zeigt, welche. Ein Tag, das einen eigenen Ersatzwert zeigt (den letzten gültigen Wert gehalten oder eine angegebene Zahl, eingestellt in seiner Stufe Ungültiger Messwert), behält einen gültigen Wert, und der Ersatzwert wird wie jeder Wert geliefert.

Der Schreibzugriff eines Clients geht durch denselben einzigen Schreibkanal wie jeder andere (siehe Logic): ein Tag über die Zustellwarteschlange seines Geräts, sein technischer Wert durch die Umrechnung des Tags zurückgerechnet, und eine Merker-Variable über die Warteschlange der Logic. Die Sperren der Quelle gelten: Eine Quelle, die ein laufendes Rezept oder eine Verriegelung von Process hält, wird abgelehnt. Der Schreibkanal hält jeden Wert als alt nach neu im Journal fest, unter der Quelle Modbus client 192.168.0.20:51234, und die Antwort wartet auf die Quittung jedes Werts, die bei einem Tag die eigene Antwort des Geräts ist.

  • Ein Schreibzugriff deckt ganze Zeilen ab: Ein einzelnes Register einer Float-Zeile zu schreiben wird abgelehnt, ein Float wird also mit Funktion 16 und einer Anzahl von 2 geschrieben.
  • Jede Zeile, die der Schreibzugriff erreicht, wird gegen die Tabelle geprüft, bevor irgendein Wert hinausgeht: Ein Register in keiner Zeile oder eine schreibgeschützte Zeile lehnt die ganze Anfrage ab, und nichts wird geschrieben.
  • Die Werte gehen dann in Registerreihenfolge an ihre Quellen. Eine Ablehnung, die der Schreibkanal einem von ihnen gibt, ist die Antwort an den Client, obwohl die anderen Zeilen derselben Anfrage ebenfalls übergeben wurden.
Ausnahme Wann
01 (unzulässige Funktion) Ein anderer Funktionscode als 1, 2, 3, 4, 5, 6, 15 und 16.
02 (unzulässige Datenadresse) Ein Register in keiner Zeile; ein Schreibzugriff auf eine schreibgeschützte Zeile oder auf einen Teil einer Zeile; ein Bereich über 65535 hinaus; eine Quelle, von der der Schreibkanal sagt, dass sie nicht geschrieben werden kann.
03 (unzulässiger Datenwert) Eine Anzahl außerhalb des Bereichs oder eine fehlerhafte Anfrage; eine Coil, die mit etwas anderem als ein oder aus geschrieben wird; ein Wert, den die Quelle nicht annehmen kann.
04 (Fehler des Server-Geräts) Eine Quelle ohne gültigen Wert, eine Quelle, die es nicht mehr gibt, oder ein Wert, den die Zeile nicht tragen kann; ein Schreibzugriff, den das Gerät abgelehnt oder nicht beantwortet hat, oder ein Gerät, das nicht verbunden ist.
06 (Server-Gerät beschäftigt) Eine Quelle, die ein laufender Process hält, oder die Runtime, die gerade stoppt.

Ein durchgerechnetes Beispiel

Eine SPS liest die Temperatur eines Ofens und seinen Türschalter von der Station und schreibt den Sollwert des Ofens, eine Merker-Variable Variables.Oven.Setpoint. Im Bereich:

  1. Wählen Sie die Zeile Modbus-Server und drücken Sie Neue Zeile. Stellen Sie Registerklasse auf Eingangsregister (3xxxx) (das Register bleibt 0) und Quelle auf "Tag · Simulated · Oven · Temperature". Die Zeile sagt "Belegt die Register 0 bis 1.", Adresse im Handbuch zeigt 30001 bis 30002, und die Spalte Aktueller Wert zeigt die Temperatur.
  2. Drücken Sie erneut Neue Zeile, stellen Sie Registerklasse auf Diskreter Eingang (1xxxx) (der Typ wird Boolean, und das Register bleibt 0) und wählen Sie den Türschalter, "Tag · Simulated · Oven · DoorOpen".
  3. Drücken Sie ein drittes Mal Neue Zeile. Sie landet auf Holding-Register 0, Float. Wählen Sie zuerst "Variable · Oven / Setpoint", dann stellen Sie Zugriff auf Lesen und schreiben: Die Zeile sagt "Ein Client darf diese Zeile lesen und schreiben: Jeder Schreibzugriff wird mit seiner Adresse im Journal festgehalten."
  4. Drücken Sie Aktivieren auf der Befehlsleiste: Die Zeile sagt "Lauscht auf Port 502". Für eine SPS auf einem anderen Rechner drücken Sie dann Lokales Netzwerk erlauben auf der Karte Port und Clients.

Was die SPS verlangt, mit beiden Reihenfolge-Kästchen an (ein Float reist Big-Endian, höchstwertiges Wort zuerst, ABCD):

Wert Funktion Adresse Anzahl Klassische Schreibweise
Temperatur (lesen) 4 0 2 30001-30002
Türschalter (lesen) 2 0 1 10001
Sollwert (schreiben) 16 0 2 40001-40002
Sollwert (zurücklesen) 3 0 2 40001-40002

Dasselbe mit einem Agenten, über die vier Werkzeuge der Bereiche des Connector:

modbus_map_upsert(source: "Connector.Simulated.Oven.Temperature", registerClass: "InputRegister", register: 0, type: "Float")
modbus_map_upsert(source: "Connector.Simulated.Oven.DoorOpen", registerClass: "DiscreteInput", register: 0)
modbus_map_upsert(source: "Variables.Oven.Setpoint", registerClass: "HoldingRegister", register: 0, type: "Float", access: "ReadAndWrite")
modbus_server_configure(enabled: true)

Eine Zeile, die ein Agent anlegt, ist schreibgeschützt, sofern access nichts anderes sagt, und eine Coil oder ein diskreter Eingang ist Boolean, wenn kein Typ angegeben ist. modbus_server_status liest den ganzen Server zurück: seinen Zustand, seine Clients und jede Zeile mit dem, was ein Client dort gerade liest. Die Werkzeuge sind unter Die Werkzeuge, Bereich für Bereich beschrieben.

Berechtigungen und Sperren

Berechtigung Was sie hier öffnet
Connector anzeigen Die Zeile, den Bereich und die Registertabelle, nur lesend. Die Karten werden unter dem Hinweis "Änderungen am Connector setzen die Berechtigung “Connector konfigurieren” voraus." inaktiv gehalten, und kein Befehl wird gezeichnet: weder Aktivieren noch Deaktivieren, weder Neue Zeile noch Zeile löschen.
Connector konfigurieren Alles auf der Seite: den Server ein- und ausschalten, seinen Port und jede Zeile der Tabelle.

Solange ein Lauf die Station hält oder die Runtime gestoppt ist, bleiben die Befehle gezeichnet und mit dem Grund ausgegraut, und jede Änderung wird abgelehnt, wie überall auf der Seite Connector. Das Lesen des Bereichs und das Lesen des Servers durch die Clients gehen weiter. Ein Agent ändert den Server nur über den Bereich Connector konfigurieren des Agentenzugriffs, und jede Änderung, die er macht, wird als seine im Journal festgehalten.

Das Journal

Der Server schreibt auf der Konsole der Ereignisse unter dem Bereich Server, Komponente Modbus server: wann er zu lauschen beginnt und aufhört, einen Port, den er nicht öffnen konnte, eine Verbindung, die er geschlossen hat, weil er schon 16 Clients bediente, und jede Anfrage, die er abgelehnt hat, mit ihrem Ausnahmecode. Eine Ablehnung, die sich wiederholt, wie bei einer SPS, die in jedem Zyklus ein Register abfragt, das nicht in der Tabelle steht, wird beim ersten Mal geschrieben, alle paar Minuten zusammengefasst, solange sie anhält, und mit einer Zeile abgeschlossen, wenn der Client wieder bedient wird. Verbindungen und Trennungen sind Details, die für die ausführliche Aufzeichnung aufbewahrt werden. Jede Änderung der Einstellungen des Servers oder seiner Tabelle wird ebenfalls festgehalten, ob sie von der Seite oder von einem Agenten kam. Was der Schreibzugriff eines Clients bewirkt hat, ist die eigene Zeile des Schreibkanals, unter der Quelle Modbus client <address>:<port>.

Was der Server nicht tut

  • Er stellt nur Modbus TCP bereit, mit dem MBAP-Kopf. Es gibt keinen Modbus-RTU- oder -ASCII-Server auf einer seriellen Leitung und keine RTU-Rahmen über TCP.
  • Er öffnet die Windows-Firewall nie von selbst (das tut nur Lokales Netzwerk erlauben, wenn Sie es drücken), und er kann nicht auf einer einzelnen Netzwerkkarte lauschen: Er lauscht auf jeder Adresse des Rechners, auf einem Port.
  • Er beantwortet jede Unit-ID mit derselben einen Tabelle: Er kann nicht mehrere Einheiten mit verschiedenen Tabellen beherbergen.
  • Er hat keinen Benutzer, kein Passwort und keine Verschlüsselung, weil Modbus keine hat: Wer den Port erreicht, liest jede Zeile und schreibt jede Zeile, die Schreiben erlaubt. Lassen Sie Zeilen schreibgeschützt, wenn kein Client sie schreiben muss, und halten Sie den Port für Netzwerke geschlossen, die nichts mit ihm zu tun haben.
  • Er verbindet sich nie mit irgendetwas. Um ein Modbus-Gerät zu lesen, legen Sie es unter dem Treiber Modbus TCP oder Modbus RTU an.
  • Er hat keine eigenen Register: Ein Register, das keine Zeile abdeckt, gibt es nicht, und alles, was ein Client schreibt, landet in einem Tag oder einer Variablen.
  • Er behält nie einen eigenen Wert, um ihn anstelle eines fehlenden zu liefern, und er beherrscht keinen der anderen Funktionscodes (Read/Write Multiple Registers, Mask Write Register, Geräteidentifikation): Sie erhalten die Ausnahme 01.
  • Die Tabelle hat keinen eigenen Import oder Export: Sie reist mit der Konfiguration der Station in den Sicherungen.