Fragen zu Codesys und Modbus RTU auf dem Raspberry Pi

Marty McFly

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich bin neu hier und habe auch direkt ein paar Fragen.

Was ich vor habe
Ich habe vor mit dem Raspberry Pi (Master) und einigen Arduinos (Slaves) einen Modbus-RTU (RS485) aufzubauen. Das ganze soll als Hausbus dienen. Dabei soll jedes Zimmer eine eigene Modbus-Linie bekommen. Dafür verwende ich USB-Serial-Converter. Auf dem Raspberry läuft "CODESYS Control for Raspberry Pi SL". Ich strebe eine Zykluszeit von ca. 100ms an, um kurzes Tastendrücken noch sicher erkennen zu können.

Aktueller Stand
Aktuell habe ich einen Slave an dem Raspberry Pi hängen und das funktioniert auch grundsätzlich. Was für mich jetzt wichtig wäre, ist wie lange dauert das Abfragen des Slaves. Wie kann ich das am besten herausfinden? Die Abfragezeit begrenzt ja die Anzahl der Slaves bei gegebener Zykluszeit.

Fragen zu Zykluszeiten
Die Zykluszeit der MainTask kann ich mir ja in der Tastkkonfiguration anzeigen lassen. Aber das scheint nur die reine SPS-Logik und nicht die Bus-Kommunikation zu betreffen?

Nun kann ich einmal unter Device->SPS-Einstellungen einen Buszyklus-Tast auswählen. Ich nehme an, das bezieht sich auf alle konfigurierten Feldbusse?

Dann kann ich aber auch auf dem Modbus-Master unter "ModbusGenericSerialMaster E/A-Abbild" einen Buszyklus-Tast auswählen. Ich nehme an, das bezieht sich dann nur auf die eine Buslinie?

Auch kann ich auf dem Modbus-Slave unter "ModbusGenericSerialSlave E/A-Abbild" unter "Variablen aktuallisieren" eine Aktion auswählen. Ich nehme an, das bezieht sich dann nur noch auf den Slave?

Dann reicht es doch, einmal Pro Buslinie eine Tast zu definieren und bei den Slaves nur noch "Einstellungen des übergeordneten Gerätes verwenden?

Was mir auch noch aufgefallen ist, man muss für jeden Channel einen Trigger auswählen. Dies scheinen die eigentlichen Befehle auf dem Bus zu sein und unabhängig von den Task-Einstellungen? Ist es so, dass wenn der Trigger ausgelöst wird, der Master sich die Daten vom Slave holt und erstmal in einem Zwischenspeicher bereit hält und darauf wartet, dass sie ins E/A-Abbild der SPS geladen werden? Sind die oben gefragten Task Einstellungen nur für den Transfer vom Zwischenspeicher ins E/A Abbild der SPS?

https://help.codesys.com/webapp/_mo..._modbus_configuration_editor;version=3.5.16.0
Wenn ich mir das hier anschaue, komme ich zu dem Schluss, dass es da sogar noch einen weiteren Zwischenspeicher geben muss? Dort ist ja nur die Rede von "Copy data from/to bus". Dazu muss der Master ja den Slave schon angetriggert haben und das Ergebnis im Bus-Zwischenspeicher haben. (Ist dass dieser Trigger unter Channel?) Im Bus-Zyklus wird es dann vom Bus-Zwischenspeicher in den Input-Buffer geschrieben und dann von da ins E/A-Abbild der SPS geladen?

Ich freue mich schon auf eure Antworten und wünsche euch eine Guten Rutsch
Marty McFly
 

Anhänge

  • Geräte.PNG
    Geräte.PNG
    14 KB · Aufrufe: 37
  • Device.PNG
    Device.PNG
    22,1 KB · Aufrufe: 36
  • Modbus_Master.PNG
    Modbus_Master.PNG
    10 KB · Aufrufe: 29
  • Slave.PNG
    Slave.PNG
    33,9 KB · Aufrufe: 34
  • Slave_Trigger.PNG
    Slave_Trigger.PNG
    14,9 KB · Aufrufe: 34
Die Zykluszeit der MainTask kann ich mir ja in der Tastkkonfiguration anzeigen lassen. Aber das scheint nur die reine SPS-Logik und nicht die Bus-Kommunikation zu betreffen?
Das ist korrekt. Ich würde mit einem Zyklischen Task von max. 50ms starten.
Nun kann ich einmal unter Device->SPS-Einstellungen einen Buszyklus-Tast auswählen. Ich nehme an, das bezieht sich auf alle konfigurierten Feldbusse?
Das bezieht sich bei "normalen SPS" auf den Bus zwischen SPS und E/A Karten. Also wie oft das Prozessabbild in der SPS maximal aktualisiert werden kann. Die Standardeinstellung wäre hier 10ms. Auf welchen Bus sich das beim PI bezieht kann ich nicht sagen.
Dann kann ich aber auch auf dem Modbus-Master unter "ModbusGenericSerialMaster E/A-Abbild" einen Buszyklus-Tast auswählen. Ich nehme an, das bezieht sich dann nur auf die eine Buslinie?
Das bezieht sich darauf wie oft das Prozessabbild der SPS von Modbusmaster aktualisiert wird.
Auch kann ich auf dem Modbus-Slave unter "ModbusGenericSerialSlave E/A-Abbild" unter "Variablen aktuallisieren" eine Aktion auswählen. Ich nehme an, das bezieht sich dann nur noch auf den Slave?
das ist korrekt
Dann reicht es doch, einmal Pro Buslinie eine Tast zu definieren und bei den Slaves nur noch "Einstellungen des übergeordneten Gerätes verwenden?
das ist korrekt. Hier werden die Variablen des Prozessabbildes im Zyklus des aufrufenden Task aktualisiert
man muss für jeden Channel einen Trigger auswählen
Dieser legt fest in welchem Abstand Daten vom Slave angefragt werden. Hier gilt es einen guten Mittelwert zu finden um den Slave nicht mit Anfragen zu überfordern aber auch kurze Signale mitzubekommen.

Die Dynamik ist aber noch von weiteren Faktoren abhängig. z.B. Baudrate. Außerdem ist der Functionscode ausschlaggebend. Es ist besser die maximale Anzahl an benötigten Register in einem Rutsch zu lesen als in Stücken.


Holger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo holgermaik,
Das ist korrekt. Ich würde mit einem Zyklischen Task von max. 50ms starten.
Warum würdest du nicht höher gehen? Normalerweise kenne ich es so, dass ein Buszyklus schneller sein sollte, als ein SPS-Zyklus.

Das bezieht sich bei "normalen SPS" auf den Bus zwischen SPS und E/A Karten. Also wie oft das Prozessabbild in der SPS maximal aktualisiert werden kann. Die Standardeinstellung wäre hier 10ms. Auf welchen Bus sich das beim PI bezieht kann ich nicht sagen.
Also bei einer "richtigen SPS" der Rückwandbus?

Dieser legt fest in welchem Abstand Daten vom Slave angefragt werden. Hier gilt es einen guten Mittelwert zu finden um den Slave nicht mit Anfragen zu überfordern aber auch kurze Signale mitzubekommen.

Die Dynamik ist aber noch von weiteren Faktoren abhängig. z.B. Baudrate. Außerdem ist der Functionscode ausschlaggebend. Es ist besser die maximale Anzahl an benötigten Register in einem Rutsch zu lesen als in Stücken.
Deshalb bin ich auf der Suche nach einer Möglichkeit um die Zeit zu messen, die ein Slave vom Masteraufruf, bis er geantwortet hat braucht. Wie kann ich das am besten realisieren? Ein SPS-Zylus ist dafür ja zu langsam. Ich erwarte normalerweise eine Antwortzeit von unter einer 1ms.

Schöne Grüße
Marty McFly
 
Hallo,

ich habe inzwischen 3 Arduinos mit der ArduinoModbus Library bestückt und kann den BUS mit Sigrok PulseView (Logicanalyser) beobachten. Ich verwende jetzt ausschließlich FC23 (Read/Write Registers), sodass ich einen Slave in einem Zug beschreiben und und auslesen kann. Hätte ich alles einzeln ausgelesen, hätten die Pausen zwischen den Frames zuviel Zeit verschwendet. Als Zykluszeit verwende ich 100ms, das Auslesen eines Slaves dauert etwa 3ms. Den Timeout habe ich in Codesys dementsprechend auf 5ms eingestellt. Das funktioniert soweit auch wunderbar. Nehme ich jetzt allerdings einen Slave vom Bus, werden die restlichen Slaves nur noch alle 500ms abgefragt. Warum ist das so?

Mein Ziel ist, das wenn ein Teilnemer fehlt, die Kommunikation zu den restlichen trotzdem normal weiter läuft. Ich habe in der Modbus Library (Modbus Com Port Master) leider auch keine Funktion gefunden, um einen Teilnehmer abzuwählen, sodass dieser nicht mehr angesprochen wird. Gibt es hierfür eine fertige Funktion oder muss ich in diesem Fall statt einem zyklischen Trigger, über das SPS Programm Triggern (XTrigger).

Verwendete Arduino Library: https://github.com/arduino-libraries/ArduinoModbus
Codesys-Version: V3.5 Sp16 Patch 3

auf dem PI:
Version 4.0.0.0
CODESYS SDK 3.5.16.20, Release

Schöne Grüße
Marty McFly
 

Anhänge

  • codesys modbus automatischer neustart.PNG
    codesys modbus automatischer neustart.PNG
    47,5 KB · Aufrufe: 18
Zurück
Oben