TwinCAT Zykluszeit für Datentransfer (JSON/MQTT)

clumsi

Level-1
Beiträge
137
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich bräuchte mal euren Rat bei den Überlegungen zur TwinCAT-Zykluszeit.

Meine Anlage (PLC) läuft mit Zykluszeit 10 ms. Der Produktionsprozess dauert etwa 5 s und wird im Dauerlauf wiederholt.

Innerhalb des Produktionsprozesses läuft eine Messwertaufnahme über 2 Sekunden. Die Messung erfolgt mit 100-fach Oversampling, dabei werden in jedem PLC-Zyklus die 100 Datenpunkte an ein entsprechend großes Array[20.000] angefügt. Nach den 2 s Messen habe ich das Array also voll.

Jetzt stehen 3 Sekunden zur Verfügung, um die Datenpunkte des Arrays zu skalieren, ein JSON-String zu erstellen, und per MQTT rauszusenden. Die Frage ist, wie ich diese Aufgaben (ohne Echtzeitanforderung) organisiere.

Macht es hier Sinn, einen seeehr langsamen Task einzurichten (Zykluszeit im Sekundenbereich) die JSON-Erstellung und den MQTT-Versand dort auszuführen, oder lieber irgendwie kleinere JSON-Pakete erstellen und die dann absenden? Hier ist aber die Frage, wie ich dann das Optimum als JSON-Paket-Größe und Zykluszeit ermittle. Oder gibt es irgendwie die Möglichkeit das als Task laufen zu lassen, der nicht unterbrochen wird, wenn der nächste Tick fällig ist, sondern so lange laufen darf, bis er fertig ist?

Viele Grüße,
clumsi
 
Wenn Du eine Task mit z. B, 5 s einrichtest, musst Du sicherstellen, daß beim Start dieser Task die Messung in jedem Fall beendet ist. Dazu müsstest Du den Produktionszyklus und insbesondee den Start der Messung mit dem Task Tick des Rechners snychronisieren. Wenn nicht, kann es passieren, daß die Task gerade dann startet, wenn die Messung noch nicht beendet ist. Die nächste Abfrage "Messung beendet?" würde dann erst 5 s später erfolgen und Du würdest ein Datenpaket verlieren.
Eine andere Möglichkeit wäre, die Taskzeit deutlich kürzer zu machen, um die Abfragefrequenz zu erhöhen. Beim Erstellen und Senden der Daten würde es dann zu Zykluszeitüberschreitungen kommen. Ist nicht schön, aber möglich.
 
Wenn noch Speicher vorhanden ist, dann würde ich zwei Arrays verwenden. Das eine davon ist der Arbeitsspeicher welches vom laufenden Prozess gerade befüllt wird, und das andere wird im Hintergrund mit niedriger Priorität verarbeitet und verschickt.

Evtl. kann man ja auch schon bei der Aufzeichnung gar nicht erst im Array speichern, sondern direkt umskalieren und an den JSON-String anhängen. Dann musst du nach Abschluss des Prozesses nur noch den String abschließen und versenden.
 
Zykluszeit ist das Eine, Prio das Andere.
Damit verbunden ist immer die Datenkonsistenz wichtig ( also das während einer Aktion keine Werte von außen geändert werden)

Speicher ist in Twincat bilig ( genügend verfügbar). Insofer mein Ansatzl.
Zykluszeit egal, Prio niedrig und nach deinen 2 sek. die Werte einfach wegschicken. das System regelt das schon.
Also keine Probleme suchen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Falls es die Zeit zulässt, würde ich auch beim "Eintreffen" der 100 neuen Werte, diese direkt skalieren, und dem Json String anhängen. Falls die Skalierung aufwändiger ist, würde ich es in einen anderen tiefprioren Task auslagern, der, wie es @Thomas_v2.1 beschrieben hat, immer eines von zwei Arrays bearbeitet.
 
Zurück
Oben