QModbusServer Class

Die Klasse QModbusServer ist die Schnittstelle zum Empfang und zur Verarbeitung von Modbus-Anfragen. Mehr...

Kopfzeile: #include <QModbusServer>
CMake: find_package(Qt6 REQUIRED COMPONENTS SerialBus)
target_link_libraries(mytarget PRIVATE Qt6::SerialBus)
qmake: QT += serialbus
Vererbt: QModbusDevice
Vererbt von:

QModbusRtuSerialServer und QModbusTcpServer

Öffentliche Typen

enum Option { DiagnosticRegister, ExceptionStatusOffset, DeviceBusy, AsciiInputDelimiter, ListenOnlyMode, …, UserOption }

Öffentliche Funktionen

QModbusServer(QObject *parent = nullptr)
bool data(QModbusDataUnit *newData) const
bool data(QModbusDataUnit::RegisterType table, quint16 address, quint16 *data) const
virtual bool processesBroadcast() const
int serverAddress() const
bool setData(const QModbusDataUnit &newData)
bool setData(QModbusDataUnit::RegisterType table, quint16 address, quint16 data)
virtual bool setMap(const QModbusDataUnitMap &map)
void setServerAddress(int serverAddress)
virtual bool setValue(int option, const QVariant &newValue)
virtual QVariant value(int option) const

Signale

void dataWritten(QModbusDataUnit::RegisterType table, int address, int size)

Geschützte Funktionen

virtual QModbusResponse processPrivateRequest(const QModbusPdu &request)
virtual QModbusResponse processRequest(const QModbusPdu &request)
virtual bool readData(QModbusDataUnit *newData) const
virtual bool writeData(const QModbusDataUnit &newData)

Detaillierte Beschreibung

Modbus-Netzwerke können mehrere Modbus-Server haben. Modbus-Server werden von einem Modbus-Client gelesen/geschrieben, der durch QModbusClient repräsentiert wird. QModbusServer kommuniziert mit einem Modbus-Backend und bietet dem Benutzer eine praktische API.

Dokumentation der Mitgliedstypen

enum QModbusServer::Option

Jedem Modbus-Server ist eine Reihe von Werten zugeordnet, für die es jeweils eine eigene Option gibt.

Die Optionen für allgemeine Zwecke (und die zugehörigen Typen) sind:

KonstanteWertBeschreibung
QModbusServer::DiagnosticRegister0Das Diagnoseregister des Servers. quint16
QModbusServer::ExceptionStatusOffset1Der Byte-Offset des Ausnahmestatus des Servers. quint16
QModbusServer::DeviceBusy2Flagge, die signalisiert, dass der Server mit der Verarbeitung eines lang andauernden Programmbefehls beschäftigt ist. quint16
QModbusServer::AsciiInputDelimiter3Das Modbus-ASCII-Nachrichtenende-Begrenzungszeichen. char
QModbusServer::ListenOnlyMode4Flagge zum Setzen des Listen-Only-Modus des Servers. Diese Funktion wird normalerweise nur von seriellen Modbus-Geräten unterstützt. bool
QModbusServer::ServerIdentifier5Die Kennung des Servers, nicht die Serveradresse. quint8
QModbusServer::RunIndicatorStatus6Das Laufkennzeichen des Servers. quint8
QModbusServer::AdditionalData7Die zusätzlichen Daten des Servers. QByteArray
QModbusServer::DeviceIdentification8Die physikalische und funktionale Beschreibung des Servers. QModbusDeviceIdentification

Benutzeroptionen:

KonstanteWertBeschreibung
QModbusServer::UserOption0x100Die erste Option, die für benutzerspezifische Zwecke verwendet werden kann.

Bei Benutzeroptionen muss der Entwickler entscheiden, welche Typen verwendet werden sollen, und sicherstellen, dass die Komponenten beim Zugriff auf und beim Setzen von Werten die richtigen Typen verwenden.

Dokumentation der Mitgliedsfunktionen

[explicit] QModbusServer::QModbusServer(QObject *parent = nullptr)

Konstruiert einen Modbus-Server mit dem angegebenen parent.

bool QModbusServer::data(QModbusDataUnit *newData) const

Gibt die Werte in dem durch newData angegebenen Registerbereich zurück.

newData muss einen gültigen Registertyp, eine Startadresse und valueCount angeben. Die zurückgegebene newData enthält die mit dem angegebenen Bereich verbundenen Registerwerte.

Wenn newData einen gültigen Registertyp, aber eine negative Startadresse enthält, wird die gesamte Registerkarte zurückgegeben und newData entsprechend dimensioniert.

Siehe auch setData().

bool QModbusServer::data(QModbusDataUnit::RegisterType table, quint16 address, quint16 *data) const

Liest die im Modbus-Server gespeicherten Daten. Ein Modbus-Server hat vier Tabellen (table) und jede hat ein eindeutiges address Feld, das verwendet wird, um data aus dem gewünschten Feld zu lesen. Siehe QModbusDataUnit::RegisterType für weitere Informationen über die verschiedenen Tabellen. Gibt false zurück, wenn die Adresse außerhalb des Map-Bereichs liegt oder der Registertyp gar nicht definiert ist.

Siehe auch QModbusDataUnit::RegisterType und setData().

[signal] void QModbusServer::dataWritten(QModbusDataUnit::RegisterType table, int address, int size)

Dieses Signal wird ausgegeben, wenn ein Modbus-Client ein oder mehrere Datenfelder an den Modbus-Server geschrieben hat. Das Signal enthält Informationen über die Felder, die geschrieben wurden:

  • Registertyp (table), der geschrieben wurde,
  • address des ersten Feldes, das geschrieben wurde,
  • und size von aufeinanderfolgenden Feldern, die ab address geschrieben wurden.

Das Signal wird nicht ausgegeben, wenn sich die zu beschreibenden Felder nicht geändert haben, weil sich der Wert nicht geändert hat.

[virtual protected] QModbusResponse QModbusServer::processPrivateRequest(const QModbusPdu &request)

Diese Funktion sollte von benutzerdefinierten Modbus-Servern implementiert werden. Sie wird von processRequest() aufgerufen, wenn die angegebene request keine Standard-Modbus-Anfrage ist.

Das Überschreiben dieser Funktion ermöglicht die Behandlung zusätzlicher Funktionscodes und Unterfunktionscodes, die in der Modbus Application Protocol Specification 1.1b nicht spezifiziert sind. Neuimplementierungen sollten diese Funktion erneut aufrufen, um sicherzustellen, dass für alle unbekannten Funktionscodes, die die benutzerdefinierte Modbus-Implementierung nicht behandelt, eine Ausnahmeantwort zurückgegeben wird.

Diese Standardimplementierung gibt ein QModbusExceptionResponse mit dem Funktionscode request und dem Fehlercode illegal function zurück.

Siehe auch processRequest().

[virtual protected] QModbusResponse QModbusServer::processRequest(const QModbusPdu &request)

Verarbeitet eine Modbus-Client-Anfrage request und gibt eine Modbus-Antwort zurück. Diese Funktion gibt ein QModbusResponse oder QModbusExceptionResponse zurück, je nach Art der Anfrage.

Die Standardimplementierung dieser Funktion verarbeitet alle Standard-Modbus-Funktionscodes, die in der Modbus Application Protocol Specification 1.1b definiert sind. Alle anderen Modbus-Funktionscodes, die nicht in der Spezifikation enthalten sind, werden an processPrivateRequest() weitergeleitet.

Die Standardbehandlung der Standard-Modbus-Funktionscode-Anfragen kann durch Neuimplementierung dieser Funktion überschrieben werden. Die Überschreibung muss den betreffenden Anforderungstyp behandeln und die entsprechende QModbusResponse zurückgeben. Ein häufiger Grund könnte sein, Funktionscode-Anfragen für Datenwerte herauszufiltern, um den Lese-/Schreibzugriff zu begrenzen, sowie Funktionscodes, die in bestimmten Implementierungen nicht erwünscht sind, wie z. B. die Diagnose serieller Leitungen auf Ethernet- oder Modbus Plus-Transportschichten. Jeder andere Anforderungstyp sollte an diese Standardimplementierung weitergeleitet werden.

Hinweis: Diese Funktion sollte nicht überschrieben werden, um eine benutzerdefinierte Implementierung für nicht standardmäßige Modbus-Anfragetypen bereitzustellen.

Siehe auch processPrivateRequest().

[virtual] bool QModbusServer::processesBroadcast() const

Unterklassen sollten diese Funktion implementieren, wenn die Transportschicht Broadcasts verarbeiten soll. Die Implementierung sollte dann true zurückgeben, wenn die aktuell verarbeitete Anfrage eine Broadcast-Anfrage ist; andernfalls false. Die Standardimplementierung gibt immer false zurück.

Hinweis: Der Rückgabewert dieser Funktion ist nur innerhalb von processRequest() oder processPrivateRequest() sinnvoll, andernfalls kann er nur anzeigen, dass die letzte bearbeitete Anfrage eine Broadcast-Anfrage war.

[virtual protected] bool QModbusServer::readData(QModbusDataUnit *newData) const

Liest die Werte in dem durch newData angegebenen Registerbereich und schreibt die Daten zurück nach newData. Gibt bei Erfolg true zurück oder false, wenn newData 0 ist, der Bereich newData außerhalb des Map-Bereichs liegt oder der RegisterType() nicht existiert.

Hinweis: Unterklassen, die das Lesen aus einem anderen Sicherungsspeicher als dem Standardspeicher implementieren, müssen auch setMap() und writeData() implementieren.

Siehe auch setMap() und writeData().

int QModbusServer::serverAddress() const

Gibt die Adresse dieser Modbus-Server-Instanz zurück.

Siehe auch setServerAddress().

bool QModbusServer::setData(const QModbusDataUnit &newData)

Schreibt newData in die Modbus-Server-Map. Gibt false zurück, wenn der Bereich newData außerhalb des Map-Bereichs liegt.

Wenn der Aufruf erfolgreich war, wird das Signal dataWritten() ausgegeben. Beachten Sie, dass das Signal nicht ausgegeben wird, wenn sich das adressierte Register nicht geändert hat. Dies kann der Fall sein, wenn newData genau die gleichen Werte wie das Register enthält. Dennoch gibt diese Funktion in solchen Fällen true zurück.

Siehe auch data().

bool QModbusServer::setData(QModbusDataUnit::RegisterType table, quint16 address, quint16 data)

Schreibt Daten an den Modbus-Server. Ein Modbus-Server hat vier Tabellen (table) und jede hat ein eindeutiges address Feld, das verwendet wird, um data in das gewünschte Feld zu schreiben. Gibt false zurück, wenn die Adresse außerhalb des Map-Bereichs liegt.

Wenn der Aufruf erfolgreich war, wird das Signal dataWritten() ausgegeben. Beachten Sie, dass das Signal nicht ausgegeben wird, wenn sich data nicht geändert hat. Dennoch gibt diese Funktion in solchen Fällen true zurück.

Siehe auch QModbusDataUnit::RegisterType, data(), und dataWritten().

[virtual] bool QModbusServer::setMap(const QModbusDataUnitMap &map)

Setzt die registrierte Map-Struktur für Anfragen von anderen ModBus-Clients auf map. Die Registerwerte werden mit Null initialisiert. Gibt bei Erfolg true zurück, andernfalls false.

Wenn diese Funktion nicht vor dem Verbindungsaufbau aufgerufen wird, wird ein Standardregister mit Nulleinträgen eingerichtet.

Hinweis: Der Aufruf dieser Funktion verwirft jeden Registerwert, der zuvor gesetzt wurde.

void QModbusServer::setServerAddress(int serverAddress)

Setzt die Adresse für diese Modbus-Server-Instanz auf serverAddress.

Siehe auch serverAddress().

[virtual] bool QModbusServer::setValue(int option, const QVariant &newValue)

Setzt die newValue für option und gibt bei Erfolg true zurück; andernfalls false.

Hinweis: Wenn der zugehörige Typ der Option quint8 oder quint16 ist und der Typ von newValue größer ist, werden die Daten abgeschnitten oder die Konversation schlägt fehl.

SchlüsselBeschreibung
QModbusServer::DiagnosticRegisterSetzt das Diagnoseregister des Servers in einer gerätespezifischen Kodierung auf newValue. Als Standardwert ist 0x0000 voreingestellt. Die Bitwerte des Registers müssen gerätespezifisch dokumentiert werden.
QModbusServer::ExceptionStatusOffsetSetzt den Byte-Offset für den Ausnahmestatus des Servers auf newValue, was der absoluten Offset-Adresse in den Coils entspricht (0x-Register). Modbus-Registertabelle beginnend mit 0x0000h. Der voreingestellte Wert ist 0x0000, wobei die Ausnahmestatus-Spulen ähnlich wie bei Modicon 984 CPUs (Spulen 1-8) verwendet werden.

Die Funktion gibt true zurück, wenn das Coils-Register die 8 Bits enthält, die zum Speichern und Abrufen der Statusspulen erforderlich sind, andernfalls false.

QModbusServer::DeviceBusySetzt ein Flag, das signalisiert, dass der Server mit der Verarbeitung eines lang andauernden Programmbefehls beschäftigt ist. Gültige Werte sind 0x0000 (nicht beschäftigt) und 0xffff (beschäftigt). Als Standardwert ist 0x0000 voreingestellt.
QModbusServer::AsciiInputDelimiterDer Wert newValue wird zum Begrenzungszeichen für das Ende der Nachricht für zukünftige Modbus-ASCII-Nachrichten. Als Standardwert ist \n voreingestellt.
QModbusServer::ListenOnlyModeSetzt den Listen-Only-Status des Servers auf newValue. Wenn der Listen-Only-Modus auf true eingestellt ist, werden die Nachrichten zwar überwacht, aber es wird keine Antwort gesendet. Als Standardwert ist false voreingestellt.
QModbusServer::ServerIdentifierSetzt den Herstellerbezeichner des Servers auf newValue. Mögliche Werte liegen im Bereich von 0x00 bis 0xff. Der voreingestellte Standardwert ist 0x0a.
QModbusServer::RunIndicatorStatusSetzt den Status der Laufanzeige des Servers auf newValue. Diese Daten werden von dem Funktionscode QModbusPdu::ReportServerId als Zusatz verwendet. Gültige Werte sind 0x00 (AUS) und 0xff (EIN). Der voreingestellte Wert ist 0xff (EIN).
QModbusServer::AdditionalDataSetzt die Zusatzdaten des Servers auf newValue. Diese Daten werden vom Funktionscode QModbusPdu::ReportServerId als Addendum verwendet. Die maximale Datengröße darf 249 Byte nicht überschreiten, um den Größenbeschränkungen für Antwortnachrichten zu entsprechen. Der voreingestellte Wert ist Qt Modbus Server.
QModbusServer::DeviceIdentificationLegt die physische und funktionale Beschreibung des Servers fest. Standardmäßig sind keine zusätzlichen Daten zur Geräteidentifikation eingestellt.
QModbusServer::UserOptionSetzt den Wert einer Benutzeroption auf newValue.

Hinweis: Für Benutzeroptionen muss der Entwickler entscheiden, welche Typen verwendet werden sollen, und sicherstellen, dass die Komponenten beim Zugriff auf und beim Setzen von Werten die richtigen Typen verwenden.

Siehe auch value().

[virtual] QVariant QModbusServer::value(int option) const

Gibt den Wert für option oder eine ungültige QVariant zurück, wenn die Option nicht gesetzt ist.

OptionBeschreibung
QModbusServer::DiagnosticRegisterGibt den Wert des Diagnoseregisters des Servers zurück. Das Diagnoseregister enthält gerätespezifische Inhalte, wobei jedes Bit eine bestimmte Bedeutung hat.
QModbusServer::ExceptionStatusOffsetLiefert die Offset-Adresse des Bytes für den Ausnahmestatus im Coils-Register.
QModbusServer::DeviceBusyGibt ein Flag zurück, das anzeigt, ob der Server mit der Verarbeitung eines Langzeitprogrammbefehls beschäftigt ist.
QModbusServer::AsciiInputDelimiterGibt einen Begrenzer für das Nachrichtenende von Modbus-ASCII-Nachrichten zurück.
QModbusServer::ListenOnlyModeGibt den Listen-Only-Status des Servers zurück. Die Nachrichten werden überwacht, aber es wird keine Antwort gesendet.
QModbusServer::ServerIdentifierGibt den Identifizierungscode des Serverherstellers zurück. Dies kann ein beliebiger Wert im Bereich von 0x00 bis 0xff sein.
QModbusServer::RunIndicatorStatusGibt den Status der Laufanzeige des Servers zurück. Diese Daten werden von dem Funktionscode QModbusPdu::ReportServerId als Zusatz verwendet.
QModbusServer::AdditionalDataGibt die zusätzlichen Daten des Servers zurück. Diese Daten werden als Zusatz für den Funktionscode QModbusPdu::ReportServerId verwendet.
QModbusServer::DeviceIdentificationGibt die physische und funktionale Beschreibung des Servers zurück.
QModbusServer::UserOptionGibt den Wert einer Benutzeroption zurück.

Hinweis: Bei Benutzeroptionen muss der Entwickler entscheiden, welche Typen verwendet werden sollen, und sicherstellen, dass die Komponenten beim Zugriff auf und Setzen von Werten die richtigen Typen verwenden.

Siehe auch setValue().

[virtual protected] bool QModbusServer::writeData(const QModbusDataUnit &newData)

Schreibt newData in die Modbus-Server-Map. Gibt bei Erfolg true zurück, oder false, wenn der Bereich newData außerhalb des Map-Bereichs liegt oder der registerType() nicht existiert.

Hinweis: Unterklassen, die das Schreiben in einen anderen Sicherungsspeicher als den Standardspeicher implementieren, müssen auch setMap() und readData() implementieren. Das Signal dataWritten() muss auch innerhalb der Funktionsimplementierung ausgegeben werden.

Siehe auch setMap(), readData(), und dataWritten().

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.