ModbusTCP zwischen zwei RevPi Core 3 Modulen

Rund um die Software von Revolution Pi
Post Reply
User avatar
Frido
Posts: 53
Joined: 21 Apr 2018, 10:47
Location: Stuttgart

ModbusTCP zwischen zwei RevPi Core 3 Modulen

Post by Frido »

Zur Kommunikation von zwei RevPi Core 3 Modulen will ich will Modbus TCP verwenden und bin dazu die Anleitungen von Dirk hier im Bereich Support durchgegangen, auch erfolgreich.
Jetzt möchte ich zwei RevPi Core 3 Module miteinander kommunizieren lassen (zu Übungszwecken), also einfach REALs, BOOLs etc. übertragen.
Gehe ich genau so vor, wie in Dirks Tutorials beschrieben, habe ich leider keinen Erfolg und vermute, dass mein Fehler in der Angabe der Register Adressen liegt. Daher zunächst die Frage (bevor ich meinen Aufbau natürlich genauer beschreiben müsste):

Woher weiß ich, welche Registeradressen die Aus- und Eingäge von meinem virtuellen ModbusTCP Slave haben? Dort gibt es ja die Eingänge Input_1 ... Input_32 und äquivalent die Ausgänge 1 bis 32. Welche Registeradressen haben diese? Versuche ich, Input_1 auf Register Addr. 1 anzusprechen und Output_1 auf Register Addr. 258, bleibe ich erfolglos.

Herzlichen Dank schon mal!
Eduard
KUNBUS
Posts: 209
Joined: 18 Jun 2018, 16:16

Re: ModbusTCP zwischen zwei RevPi Core 3 Modulen

Post by Eduard »

Hallo,
der Modbus Registeradressen Bereich liegt zwischen 1 und 32.
An dieser Stelle ist was faul, da die Ein und Ausgänge nicht auf dem gleichen Bereich liegen dürfen.
Ich werde es noch bei uns abklären wie es zustande kam.

Zurzeit ist es so:
Wenn du mit „Read Holding Register“ den Modbus Register 1 liest, wirst du den Wert aus dem Output_1 erhalten.
Und wenn du mit „Write Single Register“ den Modbus Register 1 schreibst, landet dieser Wert auf Input_1.

Gruß
Eduard
User avatar
Frido
Posts: 53
Joined: 21 Apr 2018, 10:47
Location: Stuttgart

Re: ModbusTCP zwischen zwei RevPi Core 3 Modulen

Post by Frido »

Hallo und vielen Dank Eduard,

Das scheint ja alles einfach funktionieren zu müssen. Da es bei mir trotzdem nicht funktioniert, hier mein Vorgehen, vielleicht entdeckst Du einen Fehler? Ich verwende virtuelle Modbus TCP Module und einen Ethernet Switch von WAGO (Industrial-Eco-Switch), über den die beiden RevPis verbunden sind.

Master:
Image
Im Werte-Editor wurde außerdem die IP-Adresse des Slaves eingestellt und der Port auf 502 belassen. Auch mit Unit-ID = 255 funktioniert es nicht.

Ich schreibe mit logiCAD3 zyklisch auf Output_Word_1 und lese Input_Word_1:

Code: Select all

Output_Word_1 := TO_WORD(i_Frequenz_FU); // in Hz, Frequenz an den RevPi Core3 Slave schicken, muss in [0, 50] sein. i_Frequenz_FU ist eine sich zeitlich ändernde Größe
r_InputMaster_2:= TO_INT(Input_Word_1)/100; // Wert vom RevPi Core 3 lesen

Slave:
Keine besonderen Einstellungen in PiCtory vorgenommen. Mit logiCAD3 stelle ich die Daten auf Output_1 zur Verfügung und verwende Input_1:

Code: Select all

Output_1:= TO_WORD(FrequenzRampe.i_u_motor); // in Hz, wird von Master gelesen, in [0, 50]
OutputValue_1:= TO_INT(Input_1)*200+100; // mV, Input_1 kommt vom Modbus Master = Frequenz des FUs (0 bis 50Hz). Als Analogsignal auf AIO-Modul ausgeben (zur Kontrolle). 50Hz = 10.000mV
Die Fehler-BYTEs Modbus_Master_Status und Modbus_Action_Status_1 zeigen beide16#00 an, auch die einzelnen BITs von Modbus_Master_Status sind 0.

Liegt hier irgendwo ein Fehler in meinem Vorgehen?
Schon mal Dankeschön!
Eduard
KUNBUS
Posts: 209
Joined: 18 Jun 2018, 16:16

Re: ModbusTCP zwischen zwei RevPi Core 3 Modulen

Post by Eduard »

Hallo Frido,

Verwende bitte nicht “Read Holding Registers” sondern “Read Input Registers”.

Wenn du auf die Variablen (RevPi Prozessabbild) in logiCAD3 zugreifen möchtest musst du den Hacken bei „Export“ in pCtory setzen.
Hast du den Haken gesetzt bei der Variable Output_1 und Input_1?

Gruß,
Eduard
User avatar
Frido
Posts: 53
Joined: 21 Apr 2018, 10:47
Location: Stuttgart

Re: ModbusTCP zwischen zwei RevPi Core 3 Modulen

Post by Frido »

Danke für die Antwort!
Ja, die Haken habe ich immer gesetzt, wenn ich Variablen in logiCAD3 verwenden will (eben auch nochmals geprüft).
Die Verwendung von READ_INPUT_REGISTER hat leider keine Veränderung/Verbesserung gebracht.
Das BYTE Modbus_Master_Status ist jetzt aber 16#11, also scheint der Slave nicht gefunden zu werden (siehe hier fast ganz unten).
Ich verwende auf dem Slave PiCtory V.1.2.5 und auf dem Master V.1.3.4 - könnte das die Fehlerursache sein?
Hast Du noch eine weitere Idee zur Fehlerursache?

Meine offenen Fragen zum Thema sind:
1) Ist der Switch mit Modbus TCP kompatibel, können falsche Ethernet-Kabel Probleme verursachen? (Über den Switch verbinde ich mich auch immer vom PC mit SSH zu den RevPis und das klappt problemlos.)
2) Was bewirkt/was ist die Unit ID?
Eduard
KUNBUS
Posts: 209
Joined: 18 Jun 2018, 16:16

Re: ModbusTCP zwischen zwei RevPi Core 3 Modulen

Post by Eduard »

Zu 1) Also ich benutze bei meinem Aufbau auch einen Switch und bei mir funktioniert die Modbus Kommunikation. Kannst du mit dem RevPi Master den RevPi Slave erreichen (ping)?
Zu 2) Es gibt Modbus TCP Slave wo du diese Adresse einstellen must. Bei dem RevPi Modbus Slave musst du die Unit ID nicht beachten, also kannst du ruhig auf 1 stehen lassen.

Ich würde vielleicht auf beide RevPis das neuste Image aufspielen.
Hast du nach der Umstellung auf „Read Input Registers“ ein Treiber Reset durchgeführt mit „piTest –x“?
User avatar
Frido
Posts: 53
Joined: 21 Apr 2018, 10:47
Location: Stuttgart

Re: ModbusTCP zwischen zwei RevPi Core 3 Modulen

Post by Frido »

Alles klar, Danke für die Antworten 1) und 2).

Auf beiden RevPis ist Jessi 2017-09-22-revpi-jessie.img installiert und auch beide sind mit

Code: Select all

 sudo apt-get update 
etc. auf dem aktuellsten Stand gehalten.
Ja, den Treiber setze ich nach jeder Änderung in PiCtory zurück. Anpingen ist auch kein Problem, geht in beide Richtungen. Irgendwo mache ich scheinbar einen anderen Fehler...

Also noch mal Schritt für Schritt, vielleicht erkennst Du meinen Fehler:
  • Mit dem Master lese ich mit READ_INPUT_REGISTER die Variable Output_1 des Slaves und schreibe sie auf Input_Word_1; Registeradresse 1.
  • Mit dem Master schreibe ich seine Variable Output_Word_1 mit WRITE_SINGLE_REGISTER in die Variable Input_1 des Slaves; Registeradresse 1.
Also so:
Image
logiCAD3 lasse ich jetzt mal ganz weg und lese und schreibe alle Variablen über die Console mit

Code: Select all

piTest -r Input_1
piTest -w Output_1,14
.

In piCtory sehen die Einstellungen so aus:
Master:
Image
Hier sind die Uhrzeit und das Datum nicht aktuell. Habe das eben aktualisiert, das hat aber keine Veränderung bewirkt.

Slave:
Image

Falls Du hier keinen Fehler siehst - könntest Du mir bitte die piCtory-Konfigurationsdateien von deinem Aufbau zukommen lassen?
Ich bin ratlos, was ich sonst noch versuchen könnte.
Eduard
KUNBUS
Posts: 209
Joined: 18 Jun 2018, 16:16

Re: ModbusTCP zwischen zwei RevPi Core 3 Modulen

Post by Eduard »

Sind bei dir im „RevPi Core Status“ der Modbus Master sowie der Modbus Slave aktiviert?
RevPiCoreStatus.png
RevPiCoreStatus.png (179.92 KiB) Viewed 9111 times
User avatar
Frido
Posts: 53
Joined: 21 Apr 2018, 10:47
Location: Stuttgart

Re: ModbusTCP zwischen zwei RevPi Core 3 Modulen

Post by Frido »

LÖSUNG!
Glücklicherweise habe ich die Lösung gefunden! Dank auch an Dirk, der mich per Telefon sehr ausführlich und freundlich beraten hat.

In der Shell vom Master:

Code: Select all

piTest -w Action_Status_Reset_1,1
Erklärung:
Ein vorheriger Verbindungsaufbau zwischen Master und Slave lief schief, also merkte sich der Master diesen Fehler in Modbus_Action_Status_1. Man muss diesen Fehler manuell zurücksetzen, also über die Shell. Ein Zurücksetzen des Treibers in PiCtory reicht nicht aus.

Danke für die super Hilfe hier im Forum.
Post Reply