Schnelle Bereitstellung eines Modbus TCP-Servers mit libmodbus

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

Schnelle Bereitstellung eines Modbus TCP-Servers mit libmodbus

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.

Relevante Etiketten
Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.