# Fragen zu Codesys und Modbus RTU auf dem Raspberry Pi



## Marty McFly (28 Dezember 2020)

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


----------



## holgermaik (28 Dezember 2020)

> 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


----------



## Marty McFly (29 Dezember 2020)

Hallo holgermaik,


holgermaik schrieb:


> 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.



holgermaik schrieb:


> 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?



holgermaik schrieb:


> 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


----------

