Qt Modbus mit TCP/IP-Verbindung

In diesem Blog möchte ich eine kleine Qt-Quick-Anwendung (qml) als Beispiel für eine Modbus-Verbindung über TCP/IP zur Verfügung stellen.
In den Qt-Beispielen habe ich zu Modbus-Verbindungen nur QWidget-Beispiele gefunden und nachdem ich vor Kurzem eine Qt-Quick-Anwendung dazu erstellt habe, möchte ich eine abgespeckte Version davon als Beispiel zur Verfügung stellen.

Testumgebung

Um die Anwendung auch testen zu können, benötigen man einen Modbus-Server bzw. ein Programm, das einen solchen Server "simuliert". Ich habe dazu den "Modbus Server Pro" von http://www.apphugs.com/modbus-server.html verwendet. Damit kann man alle benötigten Szenarien durchspielen.

Qt-Anwendung

Vorab: Da es zu weit führen würde hier den ganzen Code zu posten, werde ich den gesamten Code als ZIP-Datei (siehe unten) zur Verfügung stellen.

Settings

Als erstes habe ich eine einfache SettingsDialog-Klasse erstellt, die die Verbindungs-Optionen enthält. In dem vereinfachten Beispiel ist dies nur die "modbusServerUrl", die "responseTime" und die "numberOfRetries".

    struct Settings {
        QString modbusServerUrl = "192.168.2.86:1502";
        int responseTime = 1000;
        int numberOfRetries = 3;
    };

Die Bezeichnungen sind - denke ich - selbsterklärend.

  • modbusServerUrl = die TCP/IP-Nummer plus Modbus-Server-Port, z.B. 192.168.2.86:502
  • responseTime = die maximale Zeit in ms, in der auf eine Anwort vom Server gewartet wird
  • numberOfRetries = die Anzahl der Fehlversuche, die akzeptiert werden.

Anwendung

onConnectButtonClicked()

Mit der Function onConnectButtonClicked() werden die Verbindungsdaten aus der Settings-Datei ausgelesen und die Verbindung zum Modbus-Server aufgebaut.

onReadButtonClicked()

Mit onReadButtonClicked() werden dann verschiedene readRequests initiiert und die entsprechenden Register vom Modbus-Server ausgelesen. Die zurückgegebenen Werte werden über emit-Signale als Q_PROPERTY an qml weitergegeben und im Userinterface aktualisiert.

Schreibfunktion

Für das Schreiben in die Modbus-Server-Register wird die Funktion onWriteButtonClicked(int writeregister) verwendet. Hier ist vorgesehen, daß über die Variable "writeregister" verschiedene Register auf dem Modbus-Server geschrieben werden können.

Sie können sich die Anwendung hier ix-modbus-tcp-example.zip herunterladen.