Datenaustausch zwischen Tasks

briceyouemto

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

Ich habe 2 Task(a,b) mit zwei unterschiedlichen zykluszeiten (1ms und 5ms)

Task a berechnet 15 Werte. diese werden von Task b gelesen und über 104 communication für das Monitoring geschickt.

Mein Professor sagt mir, dass ein wert von den 15 berechneten Werten soll alle 20 ms über das 104 communication gesendet werden.

Könne Sie mir bitte sagen, wie ich das machen kann und worauf ich aufpassen soll?

Soll ich die die Zykluszeit des Task ändert? In diesem Fall sind alle anderen Werte betroffen. und das will ich nicht.


Vielen dank und besten Grüße,
Brice
 
???
Fang vielleicht noch einmal von vorne an ...
Was macht Task 'a' mit welcher Zykluszeit ?
Was macht Task 'b' mit welcher Zykluszeit ?
Was ist bei dem einem Wert (alle 20ms) anders zu machen wie bei den anderen 14 ...?

Ach ja ...
hast du dir auch schon eigene Gedanken dazu gemacht ?

Gruß
Larry
 
Und kläre mich doch bitte auch auf was du mit "104 communication" meinst.

Da du im CoDeSys-Forum bist schon mal vorneweg noch den Hinweis: Der Zugriff auf Variablen die von zwei Task gelesen/geschrieben werden sollte entweder über das Mapping als EA-Interface laufen oder aber du musst dich selber darum kümmern das im worst-case der Zugriff jeweils "exklusiv" erfolgt damit Datenkonstistenz herrscht.
Stichwort:
FB_IecCriticalSection...
Hab Spass und wie Larry schon andeutet. Erst denken/brüten dann fragen.

 
Was macht Task 'a' mit welcher Zykluszeit ?
Task a berechnet 15 Sollwerte. Seine Zykuszeit beträgt 1 ms

Was macht Task 'b' mit welcher Zykluszeit ?
Task b liest die 15 Sollwerte ein und schreibt diese über 104_communication bei "Kunde" für die Visualisierung.. Zyluszeit 5 ms.

Was ist bei dem einem Wert (alle 20ms) anders zu machen wie bei den anderen 14 ...?
Der Professor hat mir gesagt, dass er möchte, dass ein von den 15 Sollwerten alle 20 ms geschrieben werden soll. Die anderen 14 Sollwerte bleiben unverändert (d.h die anderen 14 Sollwerte werden alle 5 ms beim Kunde geschrieben).

Ach ja ...
hast du dir auch schon eigene Gedanken dazu gemacht ?
Mein Idee am Anfang war ein TON ind Task a einzufügen, so dass den betroffenen Sollwert nur alle 20 ms geändert wird. Aber der Professor hat mir gesagt, dass ich auch auf die Zykluszeit von task b aufpassen soll. Ich weiß nicht, warum er das erwähnt hat und welcher Einfluss hat die Zykluszeit von task b in dem Fall. Könnt Ihr bitte mir helfen?

VG, Brice
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn innerhalb einer Task etwas mit zwei verschiedenen Zeitregimes gemacht werden soll muss die task eine Zykluszeit haben, die dem schnellsten Vorgang gerecht wird.
Langsamere Vorgänge innerhalb dieser Task realisiert man dann über einen eigenen "Scheduler", der entsprechend für die langsameren Vorgänge abfragt ob sie schon dran sind.
Wenn also Task b mit bisher 100ms Zykluszeit läuft müsstest Du die Zykluszeit auf 20ms verändern und die 14 verbleibenden Werte nur in jedem 5. Zyklus senden/verarbeiten. Dadurch hast Du einen Wert alle 20ms und den Rest langsamer.

Ist es das was Du willst?

Edit: Aktualisierung von Dir kam während ich schrieb. Das Prinzip bleibt aber gleich da 20ms ein Vielfaches von 5ms ist.
 
Zuletzt bearbeitet von einem Moderator:
Danke andy fuer deine schnelle Antwort

- mein Task b hat zwei verschiedene Zeitregimes. 14 Solltwerte werden alle 5 ms gelesen und fuer die Visualisierung gesendet. Nur 1 Sollwert muesste alle 20 ms gelesen et gesendet.

Wenn ich dich richtig verstanden habe, sollte ich 5ms als Zykluszeit fuer der Task b lassen. So werden die 14 Sollwerte als 5ms gelesen und gesendet. Denn sie sind die schnellsten. Und der letzte Sollwerte soll nur in jedem 4. Zyklus senden/verarbeiten.

Habe ich richtig verstanden, was du meinst?

Kannst du bitte mir sagen, wie ich das implementieren kann? ---> der letzte Sollwerte soll nur in jedem 4. Zyklus senden/verarbeiten.
Meine Idee ist es, Task a sowas zu schreiben

IF i >= 3 THEN

wert15 := sollwert;
i := 0;
END_IF
i := i + 1;

So ändert sich der wert15 in jedem 4. Zyklus. Ist es reichtig?

VG. Brice
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... jedenfalls fast ...
In dem geposteten Code wird das alle 15ms ausgelöst - schau mal auf i ...
Außerdem sollte i für den Task eine STAT sein.
Generell solltest du, da es keinen Einfluß auf die Programmlaufzeit hat, die Variablen, die du verwendest, sinnvoller benennen ...

Gruß
Larry
 
Zurück
Oben