kupferdings
Level-1
- Beiträge
- 9
- Reaktionspunkte
- 0
-> Hier kostenlos registrieren
Hallo zusammen!
Ich bin schon lange ein stiller Mitleser und konnte vieles dabei lernen und auch schon umsetzen. Jetzt bin ich an einem Punkt angekommen, wo ich leider nicht mehr weiterkomme und versuche es deshalb mal auf diesem Weg.
Vorab: Falls der Controller an dieser Stelle wichtig ist: Ich verwende 750-881 (Produktiv) und 750-830 (Entwicklungsumgebung)
Ich habe mit ST und unter Verwendung einer 750-650 und eines RS2323 zu RS485 Wandlers ein proprietaeres, aber ausreichend gut reverse-engineered und dokumentiertes Protokoll implementiert. Es handelt sich dabei um das Homematic wired Protokoll und ich steuere darueber meine Rolladenaktoren.
Auf der Steuerung laufen 2 Tasks mit jeweils einem Programm
Im Programm Serial wird die 750-650 initialisiert und danach nur der Baustein vom Typ SERIAL_INTERFACE aus der Wago Lib "Serial_Interface_01" aufgerufen. Der Ringbuffer fuer die empfangenen Daten und der Buffer zum Senden befinden sich gemeinsam in einer Datenstruktur, deren einzelne Komponenten SERIAL_INTERFACE mitgegeben werden.
Im Programm Main befindet sich eine Statemachine, die anhand eines eigenen Zaehlers auf den Ringbuffer die neu empfangenen Daten durchlaeuft, anhand der Statemachine die Nachrichten zusammenbaut und in einem eigenen dafuer vorgesehenem Datentyp speichert. Die Statemachine sucht z.B. dann initial nach einem Startbyte, dann einer Source- und Destinationadress, Befehlen, Pruefsumme etc. entsprechend dem Protokoll und ist dabei so aufgebaut, dass sie die Nachrichten ueber mehrere Zyklen aufbaut, da mit der 750-650 pro K-Bus Zyklus ja nur 3 Bytes in den Empfangspuffer uebertragen werden koennen. Eine typische Nachricht ist zwischen 10 und 20 Bytes gross.
Im Anschluss werden ebenfalls in Main vollstaendig empfangene Nachrichten ausgewertet und ggf. Nachrichten zum Versenden generiert und in den Sendebuffer abgelegt und fuer den SERIAL_INTERFACE Baustein im Serial Programm das xStartSend Flag gesetzt.
Soweit funktioniert das auch alles zuverlaessig, allerdings ist die Last auf dem Controller aufgrund der 1ms Zykluszeit von Serial sehr hoch. Eine geringere Zykluszeit funktioniert nicht, da der Sendebuffer auf der 750-650 mit 16 Byte zu klein ist, um komplette Nachrichten aufzunehmen und im ContinousSend zu versenden. Ist die Zykluszeit kleiner, ergeben sich zu grosse Luecken beim Versenden, so dass die Empfaenger die Nachrichten verwerfen oder nicht erkennen. Mit 1ms Zykluszeit bekomme ich nach ca. 60 bis 70ms die Antwort in Main, gemessen von der Ablage der ausgehenden Nachricht um Sendebuffer bis zum vollstaendigen Empfang einer Nachricht vom Aktor.
Um nun die Last zu verringern habe ich eine 750-652 erworben, da diese zum einen einen wesentlich groesseren Sende- und Empfangspuffer als auch nicht nur den Austausch von 3 Byte sondern bis zu ca. 40 Byte pro K-Bus Zyklus ermoeglicht. Meine Idee war, dass dann die Zykluszeit des Tasks Serial deutlich reduziert werden kann, da Nachrichten nicht mehr haeppchenweise von der Klemme in den Buffer (oder umgekehrt) transportiert werden sondern dafuer ein Zyklus (sowohl Task als auch K-Bus) ausreicht.
Leider funktioniert das so in der Praxis bei mir leider gar nicht. Die 750-652 ist auf 48 Byte Prozessdaten mit I/O Check konfiguriert und auch in der Steuerungskonfiguration so angelegt. Wenn ich nun Serial weiter mit 1ms Zykluszeit laufen lasse funktioniert alles genauso wie mit der 750-650 und eine Antwort ist auch in der gleichen Zeit da. Wenn ich die Zykluszeit auf 5ms erhoehe, ist eine deutliche Erhoehung der Antwortzeit zu beobachten und es braucht haeufig mehrere Versuche bis zum Empfang einer Antwort (Nachricht wird nach 100ms ohne Antwort erneut gesendet). Bei 10ms Zykluszeit braucht es praktisch immer mehr als einen Sendeversuch und die Antwortzeit liegt bei >200ms.
Hab ich da grundsaetzlich was falsch verstanden oder voellig falsch umgesetzt? Ich bin etwas ratlos, wie ich mich einer Loesung naehern kann, also wie ich z.B. debugge oder ein moegliches Problem weiter eingrenzen kann.
Hat jemand vielleicht Erfahrung damit, wie sich das mit der Zykluszeit des K-Bus verhaelt oder wieso entweder der K-Bus die Prozessbreite nicht voll ausnutzt oder seltener ausgefuehrt wird? Gibt es vielleicht in der Verwendung des Baustein SERIAL_INTERFACE aus der Wago Lib "Serial_Interface_01" etwas zu beachten oder anders zu benutzen?
Viele, aber etwas ratlose Gruesse,
EDIT: Gibt es einen Trick, wie man einen Beitrag mit Umlauten posten kann? In der Vorschau wurden diese und andere "spezielle" Zeichen wie ein scharfes "S" durch unlesbare Zeichen ersetzt.
Ich bin schon lange ein stiller Mitleser und konnte vieles dabei lernen und auch schon umsetzen. Jetzt bin ich an einem Punkt angekommen, wo ich leider nicht mehr weiterkomme und versuche es deshalb mal auf diesem Weg.
Vorab: Falls der Controller an dieser Stelle wichtig ist: Ich verwende 750-881 (Produktiv) und 750-830 (Entwicklungsumgebung)
Ich habe mit ST und unter Verwendung einer 750-650 und eines RS2323 zu RS485 Wandlers ein proprietaeres, aber ausreichend gut reverse-engineered und dokumentiertes Protokoll implementiert. Es handelt sich dabei um das Homematic wired Protokoll und ich steuere darueber meine Rolladenaktoren.
Auf der Steuerung laufen 2 Tasks mit jeweils einem Programm
- Main, zyklisch 10ms
- Serial, zyklisch 1ms
Im Programm Serial wird die 750-650 initialisiert und danach nur der Baustein vom Typ SERIAL_INTERFACE aus der Wago Lib "Serial_Interface_01" aufgerufen. Der Ringbuffer fuer die empfangenen Daten und der Buffer zum Senden befinden sich gemeinsam in einer Datenstruktur, deren einzelne Komponenten SERIAL_INTERFACE mitgegeben werden.
Im Programm Main befindet sich eine Statemachine, die anhand eines eigenen Zaehlers auf den Ringbuffer die neu empfangenen Daten durchlaeuft, anhand der Statemachine die Nachrichten zusammenbaut und in einem eigenen dafuer vorgesehenem Datentyp speichert. Die Statemachine sucht z.B. dann initial nach einem Startbyte, dann einer Source- und Destinationadress, Befehlen, Pruefsumme etc. entsprechend dem Protokoll und ist dabei so aufgebaut, dass sie die Nachrichten ueber mehrere Zyklen aufbaut, da mit der 750-650 pro K-Bus Zyklus ja nur 3 Bytes in den Empfangspuffer uebertragen werden koennen. Eine typische Nachricht ist zwischen 10 und 20 Bytes gross.
Im Anschluss werden ebenfalls in Main vollstaendig empfangene Nachrichten ausgewertet und ggf. Nachrichten zum Versenden generiert und in den Sendebuffer abgelegt und fuer den SERIAL_INTERFACE Baustein im Serial Programm das xStartSend Flag gesetzt.
Soweit funktioniert das auch alles zuverlaessig, allerdings ist die Last auf dem Controller aufgrund der 1ms Zykluszeit von Serial sehr hoch. Eine geringere Zykluszeit funktioniert nicht, da der Sendebuffer auf der 750-650 mit 16 Byte zu klein ist, um komplette Nachrichten aufzunehmen und im ContinousSend zu versenden. Ist die Zykluszeit kleiner, ergeben sich zu grosse Luecken beim Versenden, so dass die Empfaenger die Nachrichten verwerfen oder nicht erkennen. Mit 1ms Zykluszeit bekomme ich nach ca. 60 bis 70ms die Antwort in Main, gemessen von der Ablage der ausgehenden Nachricht um Sendebuffer bis zum vollstaendigen Empfang einer Nachricht vom Aktor.
Um nun die Last zu verringern habe ich eine 750-652 erworben, da diese zum einen einen wesentlich groesseren Sende- und Empfangspuffer als auch nicht nur den Austausch von 3 Byte sondern bis zu ca. 40 Byte pro K-Bus Zyklus ermoeglicht. Meine Idee war, dass dann die Zykluszeit des Tasks Serial deutlich reduziert werden kann, da Nachrichten nicht mehr haeppchenweise von der Klemme in den Buffer (oder umgekehrt) transportiert werden sondern dafuer ein Zyklus (sowohl Task als auch K-Bus) ausreicht.
Leider funktioniert das so in der Praxis bei mir leider gar nicht. Die 750-652 ist auf 48 Byte Prozessdaten mit I/O Check konfiguriert und auch in der Steuerungskonfiguration so angelegt. Wenn ich nun Serial weiter mit 1ms Zykluszeit laufen lasse funktioniert alles genauso wie mit der 750-650 und eine Antwort ist auch in der gleichen Zeit da. Wenn ich die Zykluszeit auf 5ms erhoehe, ist eine deutliche Erhoehung der Antwortzeit zu beobachten und es braucht haeufig mehrere Versuche bis zum Empfang einer Antwort (Nachricht wird nach 100ms ohne Antwort erneut gesendet). Bei 10ms Zykluszeit braucht es praktisch immer mehr als einen Sendeversuch und die Antwortzeit liegt bei >200ms.
Hab ich da grundsaetzlich was falsch verstanden oder voellig falsch umgesetzt? Ich bin etwas ratlos, wie ich mich einer Loesung naehern kann, also wie ich z.B. debugge oder ein moegliches Problem weiter eingrenzen kann.
Hat jemand vielleicht Erfahrung damit, wie sich das mit der Zykluszeit des K-Bus verhaelt oder wieso entweder der K-Bus die Prozessbreite nicht voll ausnutzt oder seltener ausgefuehrt wird? Gibt es vielleicht in der Verwendung des Baustein SERIAL_INTERFACE aus der Wago Lib "Serial_Interface_01" etwas zu beachten oder anders zu benutzen?
Viele, aber etwas ratlose Gruesse,
EDIT: Gibt es einen Trick, wie man einen Beitrag mit Umlauten posten kann? In der Vorschau wurden diese und andere "spezielle" Zeichen wie ein scharfes "S" durch unlesbare Zeichen ersetzt.
Zuletzt bearbeitet: