In der industriellen Automatisierung wird das Modbus-Protokoll aufgrund seiner Einfachheit und seiner umfangreichen Unterstützung häufig für die Kommunikation zwischen Geräten verwendet. In diesem Artikel wird beschrieben, wie man mit der C-Sprache und der libmodbus-Bibliothek einen voll funktionsfähigen Modbus-TCP - Server erstellt, der eine effiziente Kommunikation zwischen Geräten ermöglicht.
Vollständiger Code:
Initialisierung des Modbus-Servers
Zuerst müssen Sie eine Modbus-TCP - Server-Instanz erstellen. Verwenden Sie diemodbus_new_tcp- Funktion, um einen Zeiger auf den Typmodbus_tzu initialisieren, deren Parameter die IP-Adresse und die Portnummer des Servers sind. In diesem Beispiel ist der Server so konfiguriert, dass er den Port 1502 auf der lokalen Adresse 127.0.0.1 abhört:
ctx = modbus_new_tcp("127.0.0.1", 1502);2. Einrichten von Modbus-Zuordnung
Modbus-Zuordnung ist die Art und Weise, wie der Server seine Daten (z. B. Spulen, diskreten Eingängen, Halte - und Eingaberegister) speichert. Nutzungmodbus_mapping_new, um diese Bereiche zuzuweisen und zu initialisieren:
mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0, MODBUS_MAX_READ_REGISTERS, 0);
Wenn die Erstellung der Zuordnung fehlschlägt, druckt der Server eine Fehlermeldung aus und beendet sich.
3.Überwachung der Verbindung
Die Funktionmodbus_tcp_listenwird verwendet, um eine Netzwerkverbindung zu überwachen und gibt einen Socket-Deskriptor zurück. Die maximale Anzahl von Verbindungen, die der Server verarbeiten kann, wird durch dieNB_CONNECTION- Makro definiert:
server_socket = modbus_tcp_listen(ctx, NB_CONNECTION);
4. Verarbeitung von SIGINT-Signalen
Um den Server elegant abzuschalten und Ressourcen freizugeben, verwenden wirsignalFunktion zum Erfassen von SIGINT-Signalen (normalerweise mit Ctrl + C ausgelöst) und zum Verknüpfen mitclose_sigint- Funktion: Die
signal(SIGINT, close_sigint);
close_sigintDie Funktion schließt das Socket, freigibt den Modbus-Kontext und die Zuordnung und beendet dann das Programm.
5. Der Hauptkreislauf
läuft in einer unendlichen Schleife und verwendet die Funktionselect, um Aktivitäten auf dem Socket zu überwachen. WennselectAktivität erkennt, prüft der Server, ob es sich um eine neue Verbindungsanforderung oder um eine Datenanforderung handelt, die bereits eine Verbindung hergestellt hat:
if (master_socket == server_socket) {
// 处理新的连接请求
} else {
// 处理来自已连接客户端的数据
}Bei neuen Verbindungen akzeptiert der Server die Verbindung und fügt die neue Socket der Listen-Sammlung hinzu. Bei Datenanfragen verwendet der Servermodbus_receiveempfängt Daten und sendet dann eine Antwort mitmodbus_replySenden Sie eine Antwort.
6. Leistungsbewertung
Um die Leistung des Servers zu bewerten, wurde eine Berechnung der Datenübertragungsrate in den Code integriert. Der Server berechnet die Anzahl der Bits und Registers, die in einer gegebenen Zeit erfolgreich verarbeitet wurden, um die Übertragungsrate von Punkten / Sekunde und KiB / Sekunde zu erhalten:
rate = (n_loop * nb_points) * G_MSEC_PER_SEC / (end - start);
printf("* %d points/sn", rate);Diese Leistungsindikatoren sind nützlich für die Optimierung von Server-Einstellungen und Netzwerkkonfigurationen.
Schlussfolgerungen
Mit Hilfe der C-Sprache und der libmodbus-Bibliothek kann ein Modbus-TCP - Server effektiv implementiert werden, der nicht nur Multi-Client - Verbindungen unterstützt, sondern auch Echtzeitdaten über seine Leistung bereitstellt. Dies bietet eine leistungsstarke und flexible Lösung für die Gerätekommunikation in industriellen Anwendungen.
Antwort veröffentlichen