banner

Blog

Jun 30, 2023

Modbus über WLAN (Teil 1): Hardware und Programmierung

Das Modbus-Protokoll wird im industriellen Bereich häufig zur Kommunikation zwischen Systemen und Steuerungen verwendet. Dies erfolgt in der Regel über die bewährte RS485-Schnittstelle und herkömmliche Kupferleitung. Hier stellen wir ein Modul vor, mit dem Sie das Modbus-Protokoll über ein drahtloses lokales Netzwerk (WLAN) nutzen können. Das Modul basiert auf einer Espressif NodeMCU-Platine, die mit einem ESP8266-Mikrocontroller ausgestattet ist. Ein zusätzliches Modbus-Basisboard ermöglicht das Arbeiten mit 24-V-Signalen, einem im industriellen Umfeld üblichen Spannungsniveau. Um zu demonstrieren, wie das alles funktioniert, haben die Autoren eine einfache Aufzugstürsteuerung gebaut. Die meisten Elektor-Leser sind wahrscheinlich bereits mit dem Espressif NodeMCU-Modul und der Arduino IDE vertraut. Wenn Sie in diese Kategorie fallen, können Sie diese Einführung überspringen und direkt mit der Beschreibung der Modbus TCP-Karte fortfahren. Für alle anderen hier in Kürze, was Sie wissen müssen: Dieses Projekt basiert auf einem NodeMCU-Modul (erhältlich im Elektor Store). Das Modul ist mit einem Espressif ESP8266-Mikrocontroller ausgestattet, der etwa die Größe einer Briefmarke hat und über eine WLAN-Schnittstelle verfügt. Trotz seiner geringen Größe bietet es viel Rechenleistung. Die Hauptmerkmale des ESP8266-Mikrocontrollers sind in zusammengefasstTabelle 1.

Das NodeMCU-Board erzeugt die Versorgungsspannung für den ESP8266 und betreut die Programmierschnittstelle für den Mikrocontroller.Abbildung 1zeigt eine Übersicht über die Pinbelegung des NodeMCU-Boards, das in unserer Modbus-Schaltung verwendet wird.

Die Arduino IDE eignet sich sehr gut zur Programmierung des NodeMCU-Boards. Sie können die passende Version der Arduino IDE für das Betriebssystem Ihres Computers kostenlos von der Arduino-Website herunterladen und gemäß den Anweisungen auf der Website installieren. Wenn Sie die IDE zum ersten Mal ausführen, wird ein Fenster wie in Abbildung 2 angezeigt . Der Programmcodebereich enthält zwei vordefinierte Funktionen. Oben befindet sich die Funktion setup(), die nur einmal beim Programmstart ausgeführt wird und Dinge wie die Initialisierung der Mikrocontroller-Schnittstellen übernimmt, und unten die Funktion loop(), die normalerweise den Quellcode Ihres Programms enthält .

Die Funktion „loop()“ wird ausgeführt, nachdem die Funktion „setup()“ abgeschlossen ist. Wenn das Programm das Ende der Funktion „loop()“ erreicht, beginnt es erneut von vorne. Der ESP8266 verwaltet die WLAN-Schnittstelle zwischen Ende und Neustart der Funktion loop(). Dies bedeutet, dass Sie keine Endlosschleifen in der Funktion loop() erstellen müssen, da der ESP8266 sonst unweigerlich abstürzt. Stattdessen muss der Code in der Funktion „loop()“ so gestaltet sein, dass er zyklisch ausgeführt werden kann. Eine große Anzahl scheinbar mysteriöser Abstürze des ESP8266 wird dadurch verursacht, dass der Prozessor nicht genügend CPU-Zeit erhält, um dies zu bewältigen WLAN-Schnittstelle. Wenn die Möglichkeit besteht, dass Ihr Programmcode über einen längeren Zeitraum ausgeführt wird, beispielsweise in großen Schleifen, können Sie die Funktion yield() oder die Funktion delay() verwenden, um dem ESP8266 genügend Zeit für die WLAN-Verwaltung zu geben. Bevor Sie den anschließen Nachdem Sie das NodeMCU-Modul in die Modbus-Karte integriert haben, müssen Sie es an einen USB-Anschluss Ihres Computers anschließen. Zuvor müssen Sie jedoch noch einige Dinge tun, um alles betriebsbereit zu machen. Der ESP8266 wird standardmäßig nicht von der Arduino IDE unterstützt, daher müssen Sie zunächst die IDE aktualisieren. Wählen Sie dazu Datei -> Einstellungen und geben Sie die folgende URL in das Feld Zusätzliche Board-Manager-URLs ein: http://arduino.esp8266.com/stable/package_esp8266com_index.json Klicken Sie auf OK und wählen Sie dann Extras -> Board ... -> , um das Boards Manager-Fenster zu öffnen, in dem Sie nach ESP8266 suchen und dann die ESP8266-Community-Boards installieren sollten. Nach der Installation sehen Sie unter Tools -> Board > das Board NodeMCU 1.0 (ESP-E12-Modul) und unter Tools - > Port > sehen Sie den Port, an dem das NodeMCU-Board angeschlossen ist (/dev/ttyUSBx unter Linux bzw. COMx unter Windows). Jetzt können Sie mit dem ersten einfachen Testprogramm auf dem NodeMCU-Modul beginnen. Öffnen Sie dazu das Beispielprogramm „Blink“ unter Datei -> Beispiele -> ESP8266 -> Blink. Das in gezeigte ProgrammAuflistung 1 Die auf der ESP8266-Platine installierte LED blinkt. Der Code, der die LED ein- und ausschaltet, befindet sich in der Funktion loop(). In der Funktion setup() wird der GPIO-Pin der LED als Ausgang konfiguriert.

void setup() {

pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {

digitalWrite(LED_BUILTIN, LOW);

Verzögerung (1000);

digitalWrite(LED_BUILTIN, HIGH);

Verzögerung (2000);

}

Um das Programm in das NodeMCU-Board zu laden, klicken Sie auf das Upload-Symbol (nach rechts zeigender Pfeil). Die Übertragung des Programms dauert einige Sekunden, dann beginnt die LED zu blinken. Dieser Test schließt die Installation und Einrichtung der IDE ab.

Wie Sie auf dem Hauptbild sehen können, ist das NodeMCU-Modul auf der Modbus-TCP-Platine montiert, was auf jeden Fall sehr industriell aussieht. Alle Ein- und Ausgänge sind mit steckbaren Schraubklemmenblöcken realisiert. Dies vereinfacht die Montage und ermöglicht einen einfachen Austausch der Schraubklemmen bei Beschädigung. Die Hauptaufgabe der Modbus TCP-Karte besteht darin, den 3,3-V-Signalpegel der Ein- und Ausgänge des Mikrocontrollers in den mit der industriellen Umgebung kompatiblen 24-V-Pegel umzuwandeln. Das schematische Diagramm inFigur 3 zeigt, dass vier Eingänge durch PC814-Optoisolatoren galvanisch vom Mikrocontroller getrennt sind. Diese Eingänge sind nicht direkt mit dem Mikrocontroller-Board verbunden, sondern über einen 74HC151-Multiplexer. Durch diese Anordnung wird ein GPIO-Pin eingespart, wodurch ein DHT11-Sensor zur Messung von Temperatur und Luftfeuchtigkeit in den Schaltkreis integriert werden kann. Dadurch kann die Modbus-Karte auch für einfache HVAC-Steuerungsaufgaben eingesetzt werden.

Die Ausgangsstufen sind mit HITFET BSP76-Komponenten implementiert (Figur 4 ). Hierbei handelt es sich nicht um einfache Leistungs-MOSFETs, sondern um ICs, die integrierte Schutzfunktionen wie Überspannungsschutz, Strombegrenzung und Übertemperaturschutz für diese elektronischen Schaltkomponenten bereitstellen. Damit können Sie problemlos ohmsche, induktive oder kapazitive Lasten schalten.

Zusätzlich zu den digitalen Ein- und Ausgängen verfügt die Modbus TCP-Karte über einen analogen Eingang und einen analogen Ausgang. Beide analogen Ports arbeiten mit dem branchenüblichen Spannungsbereich von 0 bis 10 V. Am analogen Eingang reduziert der Spannungsteiler R14/R17 die Eingangsspannung auf maximal 3,3 V. Dieser Eingang ist nicht galvanisch getrennt, sondern C7, D10 und D11 bietet einen gewissen Schutz gegen Spannungsspitzen und Überspannung. Die Reihenwiderstände R14 und R19 begrenzen den Eingangsstrom, um zu verhindern, dass die Dioden in Rauch aufgehen, wenn am Eingang etwas schief geht. Am analogen Ausgang befindet sich IC3 (ein Allzweck-Operationsverstärker LM7301 mit Rail-to-Rail-Fähigkeit an beiden Eingängen). und Ausgang) erhöht die Ausgangsspannung des NodeMCU DAC. Die Verstärkung des Operationsverstärkers wird durch die Widerstände R15 und R16 auf 3 eingestellt. Dieser Operationsverstärker wird über die 24-V-Versorgungsschiene mit Strom versorgt. Der Recom DC/DC-Wandler verdient besondere Erwähnung. Es wandelt die 24-V-Versorgungsspannung in den 5-V-Pegel um, der für die Stromversorgung des NodeMCU-Moduls erforderlich ist. Der Wirkungsgrad des DC/DC-Wandlers liegt bei weit über 90 % und er ist sehr vielseitig einsetzbar. Beispielsweise kann damit auch eine negative Versorgungsspannung für Operationsverstärker erzeugt werden. Es lohnt sich auf jeden Fall, einen Blick in das Datenblatt des DC/DC-Wandlers zu werfen. Direkt am 24-V-Eingang ist eine 1N4007-Diode angebracht, um die Schaltung vor Verpolung zu schützen. Die Gerber-Dateien für die Leiterplattenfertigung können bei github heruntergeladen werden. Das Board ist beim Autor entweder als unbestücktes Board oder komplett montiert und einsatzbereit erhältlich.

Um zu zeigen, wie das Modbus-Modul eine typische Industrieaufgabe bewältigen kann, verwendeten die Autoren ein Modell einer Aufzugstür aus dem bekannten chinesischen Online-Shop (Abbildung 5 ). Das Öffnen und Schließen der Tür erfolgt über zwei Druckknöpfe. Die Endlagen der Tür werden durch zwei kapazitive Näherungsschalter erfasst. Der Motor, der die Tür öffnet und schließt, wird von einer H-Brückenschaltung bestehend aus zwei Leistungsrelais angetrieben.

Das Steuerprogramm ist in dargestelltAuflistung 2 . Das Programm definiert zunächst mnemonische Namen für die Ein- und Ausgänge der Schaltung. Die einzelnen I/O-Pins werden in der Funktion setup() als Ein- und Ausgänge initialisiert. Anschließend folgen die Funktionen input() und output(), die den Zugriff auf die I/O-Pins etwas erleichtern. Im Hauptprogramm befindet sich die Funktion loop(), bei der je nach Tasten und Endschaltern die Ausgänge zum Antrieb des Motors ein- oder ausgeschaltet werden. Das Programm in der Funktion loop() kann wiederholt ausgeführt werden. Wenn Sie die Aufzugstür in Aktion sehen möchten, schauen Sie sich einfach das YouTube-Video [6] an.

#define A1 16

#define A2 5

#define A3 19

#define A4 0

#MUXA 12 definieren

#define MUXB 13

#definiere MUXY 14

#define E1 0

#define E2 1

#define E3 2

#define E4 3

void setup() {

pinMode(A1, OUTPUT);

pinMode(A2, OUTPUT);

pinMode(A3, OUTPUT);

pinMode(A4, OUTPUT);

pinMode(MUXA, OUTPUT);

pinMode(MUXB, OUTPUT);

pinMode(MUXY, INPUT);

}

bool input(int i){

digitalWrite(MUXA,(i&1));

digitalWrite(MUXB,(i&2)>>1);

Verzögerung(1);

return digitalRead(MUXY);

}

void-Ausgabe(int i, int v){

digitalWrite(i,v);

}

void loop() {

if(input(E4)& !input(E1)){output(A1,HIGH);}

if(input(E3)& !input(E2)){output(A2,HIGH);}

if(input(E1)){output(A1,LOW);}

if(input(E2)){output(A2,LOW);}

}

Obwohl die funktionierende Aufzugtürsteuerung eine schöne Demo ist, wird sie dem wahren Potenzial des Modbus-Boards und des WLAN-Moduls nicht gerecht. Dies wird im zweiten Teil dieses Artikels behandelt, in dem wir uns mit dem Modbus-Protokoll auseinandersetzen und darüber sprechen, welche Software Sie für die Kommunikation über den Bus verwenden können. Außerdem zeigen wir Ihnen, wie Sie das Modbus-Modul konfigurieren.

Josef Bernhardt entwickelte schon früh ein Interesse für Elektronik. Im Alter von zwölf Jahren baute er sein erstes Kristallradio und betrieb weitere Schaltungen. Erste Programmiererfahrungen sammelte er in den 1980er-Jahren mit dem Commodore VC20, auch mit der Assembler-Programmierung auf dem 8088 kennt er sich aus. An der Universität Regensburg, an der er tätig war, kann er auf mehr als 30 Jahre Elektronikentwicklung zurückblicken dem Bereich der Elektronik- und Softwareentwicklung. Mit seiner eigenen SMD-Fertigung realisiert er auch elektronische Projekte für Kunden. Martin Mohr erblickte im Zeitalter der Magnetkernspeicher und Strowger-Schalter das Licht der Welt und konnte so die gesamte Entwicklung der modernen Computertechnologie persönlich miterleben. Seine Faszination für alles, was blinkt, reicht bis in seine frühe Jugend zurück und wurde durch seine Elektronikausbildung noch verstärkt. Nachdem er ein Informatikstudium abgeschlossen hatte, beschäftigte er sich hauptsächlich mit der Entwicklung von Java-Anwendungen, doch der Raspberry Pi hat seine Leidenschaft für die Elektronik neu entfacht.

Tabelle 1Abbildung 1Figur 2Auflistung 1Figur 3Figur 4Abbildung 5Auflistung 2Über die Autoren
AKTIE