Beckhoff ADS Integritäts/RaceCondition/Timing-Fragen

Chili

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

in letzter Zeit sind im Rahmen meiner Stduienprojekte einige Fragen zum Thema Kommunikation SPS<->WinPC via ADS (genauer c++ via ads-dll zu CX9000) aufgekommen, auf die ich im Beckhoff InfoSys keine Antwort gefunden habe, trotz Durcharbeiten der kompletten ADS-Kapitel.
Wie sind eure Erfahrungen zu den folgenden Fragen bzw. habt ihr Links zu entsprechendem Nachschlagewerk?
-Wie wird die Datenintegrität beim synchronen Lesen z.B. mit adssyncread gehandhabt? kann es z.b. passieren dass während des Lesens eines großen Arrays das SPS-Programm Teile davon überschreibt? Synchrones lesen deutet an dass nicht, wie es aber genau umgesetzt ist habe ich nirgends gefunden. Bekommt man den Stand vom Zyklusanfang? Gleiches beim Schreiben via adssyncwrite: kann es passieren dass man Stellen überschreibt die das SPS-Programm gerade liest? Quellen wären super.
-Wie viele Notifications kann die SPS pro Zyklus senden? Wenn ich den Modus auf onChange und die maxcycletime auf 0 setze, kann ich dann mehrere Notifications pro Zyklus auslösen oder nur einen am Ende des Zykluses? Habs mal aus Interesse ausprobiert, die Ergebnisse waren aber eher kryptisch. Manchmal kam eine Notification, mal zwei aber mit dem gleichen Wert obwohl eigentlich inkrementiert worden sein sollte, 3 Notifications hab ich bei 4ms Zykluszeit noch nie erhalten. Das Windows keine 4ms schafft weis ich, deshalb wurden nur auf Knopfdruck einen Zyklus lang 5 Notifications erzeugt. Bei einer Sekunde maxdelay sollte das also nicht das Problem sein.

Für Hinweise wäre ich wirklich dankbar, Lösungen ohne wirkliche Funktionsgarantie liegen schwer im Magen.
Danke im Voraus,
viele Grüße
Chili
 
Ich kenne das Problem nur aus anderen Systemen und wie es gelöst ist:

Synchrones Lesen bezieht sich allein auf die Seite, die liest! Das heisst, der Leseauftrag blockiert die restliche Programmabarbeitung bis die Daten kommen oder ein Timeout eingetreten ist.

Anders, beim async Lesen, Auftrag wird gegeben, dann etwas anderes getan und per Polling gelegentlich nachgesehen, ob die Antwort angekommen ist. Ggf. auch Behandlung in einem eigenen Thread bei Prozessoren mit mit mehreren Kernen.

Das sagt aber nichts über den Partner aus, der die Daten abgefragt bekommt.

Die Notifications sind total unberechenbar, sie kommen in der Regel aus einem eigenen Tread, der z.B. eine ObservableCollection überwacht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gut, macht bei der Durchsicht der anderen Adapter Sinn, da existieren entsprechende async-Varianten der Funktionen.
Meine Fragen sind dadurch aber leider immer noch nicht beantwortet.
Wie wird RaceConditions denn nun vorgebeugt?
Um Notifications überhaupt vernünftig einsetzen zu können müssen sie doh in irgend einer Art und Weise deterministisch sein, nur auf welche?
 
Naja ...
wenn du deine benötigten Variablen in einem Thread zyklisch abfragst, mit dem Vorgängerwert vergleichst und bei Änderung eine Notification (ein Event) erzeugst dann ist das doch (zumindestens bis dahin) noch deterministisch. Die Frage ist, ob und in wie weit dein Rest-Programm dann damit arbeitet bzw. ob du alle deine Variablen in der gedachten Laufzeit des Threads aktualisiert bekommst ...

Gruß
Larry
 
-Wie wird die Datenintegrität beim synchronen Lesen z.B. mit adssyncread gehandhabt? kann es z.b. passieren dass während des Lesens eines großen Arrays das SPS-Programm Teile davon überschreibt? Synchrones lesen deutet an dass nicht, wie es aber genau umgesetzt ist habe ich nirgends gefunden. Bekommt man den Stand vom Zyklusanfang? Gleiches beim Schreiben via adssyncwrite: kann es passieren dass man Stellen überschreibt die das SPS-Programm gerade liest? Quellen wären super.

Hallo Chili,

meines Wissens wird bei der PLC zuerst die Logik, bzw. das Programm abgearbeitet und erst danach die ADS Commands. Somit können also keine Race-Conditions oder dergleichen entstehen.

Gruß, Neals
 
Zurück
Oben