In der modernen industriellen Kommunikation wird das Modbus-Protokoll aufgrund seiner Einfachheit und einfachen Implementierung weit verbreitet. In diesem Artikel wird mit einem konkreten Beispiel erläutert, wie man einen TCP-basierten Modbus-Server mit der libmodbus-Bibliothek erstellt. Dieser Server ist in der Lage, Modbus-Anfragen von Clients zu verarbeiten und auf diese Anfragen zu antworten.
Vollständiger Code (Chinesische Kommentare):
1. Initialisieren des Modbus-TCP - Servers
Zuerst müssen wir die libmodbus-Bibliothek einführen und einen Modbus-TCP - Server initialisieren. In unserem Beispiel wird der Server an die lokale Adresse127.0.0.1und den Port1502gebunden. Durch den Aufruf dermodbus_new_tcp- Funktion erstellen wir einen Zeiger auf diemodbus_t- Struktur, die als Kontext für alle folgenden Aktionen dient:
ctx = modbus_new_tcp("127.0.0.1", 1502);2. Modbus-Datenmodell zuordnen
Als nächstes müssen wir die Modbus-Datenzuordnung definieren, die vom Server verwendet wird. Dieser Schritt wird über die Funktionmodbus_mapping_newdurchgeführt, die den Speicher für verschiedene Modbus-Datenarten (Bits, Eingabebits, Halten - und Eingaberegister) zuweisen und initialisiert:
mb_mapping = modbus_mapping_new(500, 500, 500, 500);
if (mb_mapping == NULL) {
fprintf(stderr, "Failed to allocate the mapping: %sn", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}3. Hören und Annehmen von Clientverbindungen
Sobald die Datenzuordnung bereit ist, kann der Server mit dem Hören von Verbindungsanfragen von Clients beginnen. Verwenden Sie die Funktionmodbus_tcp_listen, um das Hören zu beginnen und dann die Zugriffsanbindung mitmodbus_tcp_acceptzu verarbeiten:
s = modbus_tcp_listen(ctx, 1); modbus_tcp_accept(ctx, &s);
4. Anfrage empfangen und beantworten
Der Hauptschleife eines Servers besteht aus dem Warten auf eine Clientanfrage, dem Empfangen von Anfragen, der Verarbeitung von Anfragen und dem Senden von Antworten. Dies ist durch ständige Anrufemodbus_receivezum Empfang von Anfragen und zum Senden von Antworten mit der Funktionmodbus_reply:
for (;;) {
rc = modbus_receive(ctx, query);
if (rc > 0) {
modbus_reply(ctx, query, rc, mb_mapping);
} else if (rc == -1) {
break;
}
}5. Bereinigung und Schließung von Ressourcen
Sobald der Server seine Aufgabe abgeschlossen hat (normalerweise aufgrund eines Fehlers oder eines Clients, der die Verbindung herunterbringt), muss er alle zugewiesenen Ressourcen freigeben und die Verbindung elegant schließen:
printf("Quit the loop: %sn", modbus_strerror(errno));
if (s != -1) {
close(s);
}
modbus_mapping_free(mb_mapping);
modbus_close(ctx);
modbus_free(ctx);Mit den oben beschriebenen Schritten haben wir gezeigt, wie man mit libmodbus einen voll funktionsfähigen Modbus TCP-Server erstellt. Dieser Server ist in der Lage, Standardmodbus-Funktionscode zu verarbeiten, einschließlich der Lese - und Schreiboperationen von einzelnen oder mehreren Bits und Registeren. Dieses Beispiel eignet sich nicht nur für Bildungs - und Testzwecke, sondern kann auch als Grundlage für die praktische Anwendung dienen.
Antwort veröffentlichen