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.