Re: Werte in Thread übergeben Kategorie: Programmierung (von DCTH - 24.04.2012 10:00) | |
Als Antwort auf Re: Werte in Thread übergeben von nitraM - 23.04.2012 11:01
| |
> > Ach schöner Mist ... irgendwie war noch der falsche Titel drin. > > > > Wie dem auch sei, ich habe vll eine Lösung: > > > > In dem Modul wo sich auch die Threads befinden deklariere ich meine Variablen (int sleep1_1, sleep1_2;) > > In meinem Thread steht somit "sleep sleep1_1;" > > > > In meinem Hauptmodul schreibe ich in meine Funktion bevor der Thread gestartet wird "modul.sleep1_1 = 1000;" > > > > Scheint soweit zu klappen. > > Hallo DCTH, > sorry aber aus deinen beiden Posting's werde ich nicht schlau... > Vielleicht beschreibst du dein Problem noch einmal anders.. > > > nitraM Habe ja schon eine Lösung gefunden, aber ich versuchs nochmal zu beschreiben, der vollständigkeit wegen für andere Benutzer: 1. Ich benötige eine einfache Ablaufsteuerung: Es sollen 7 baugleiche Geräte à 2 Ventile (also 14) an die Ausgänge der Station angeschlossen werden. Eins der beiden Ventile an einem Gerät wird nur für 30ms "immer mal wieder" geöffnet. Das zweite Ventil wird für 500-1000ms vor dem ersten Ventil geöffnet, schlie�t dann aber sofort (es sind NIE beide Ventile an einem Gerät gleichzeitig geöffnet). 2. Alle Geräte arbeiten nicht synchron zueinander ... es kann also sein, dass Gerät 1 alle 5sec den unter 1 beschriebenen Vorgang durchführt, Gerät 2 alle zwei sec, Gerät .... usw. 3. Die Zeiten zwischen den Geräten sind ebenfalls wichtig. Also Gerät 2 soll immer zB 1,4sec nach Gerät 1 seinen Vorgang starten. Meine erste Lösung war also eine reines Ablaufprogramm wo alle 14 Ventile nach entsprechender Zeit (sleep) angesteuert wurde. Dies funktioniert, ist auch relativ einfach, aber nicht schön und sehr unvariabel (will man die Takt-Zeit für nur ein Gerät ändern, muss man andere Zeiten anpassen.) Hier ein Beispiel: blas.stuetz_x_ein/aus() - öffnet/schlie�t Ventil 1 an Gerät x blas.blas_x_ein/aus() - öffnet/schlie�t Ventil 2 an Gerät x Jedes Gerät öffnet Ventil 2 alle 2,8sec für eine Dauer von 30ms. Ventil 1 öffnet 1s bevor Ventil 2 öffnet. Alle 0,4sec (2,8sec geteilt durch 7 Geräte) wird ein Ventil 2 geöffnet. //////////////ABLAUF 3////////////// function ablauf_3() //Ablauf: 1-2-3-4-5-6-7 { for i = 1...5 { blas.stuetz_1_ein(); blas.stuetz_2_ein(); blas.stuetz_3_ein(); sleep 200; blas.blas_1_ein(); sleep 30; blas.blas_1_aus(); sleep 170; blas.stuetz_4_ein(); sleep 200; blas.blas_2_ein(); sleep 30; blas.blas_2_aus(); sleep 170; blas.stuetz_5_ein(); sleep 200; blas.blas_3_ein(); sleep 30; blas.blas_3_aus(); sleep 170; blas.stuetz_6_ein(); sleep 200; blas.blas_4_ein(); sleep 30; blas.blas_4_aus(); sleep 170; blas.stuetz_7_ein(); sleep 200; blas.blas_5_ein(); sleep 30; blas.blas_5_aus(); sleep 170; blas.stuetz_1_ein(); sleep 200; blas.blas_6_ein(); sleep 30; blas.blas_6_aus(); sleep 170; blas.stuetz_2_ein(); sleep 200; blas.blas_7_ein(); sleep 30; blas.blas_7_aus(); sleep 170; } blas.stuetz_aus(); blas.blas_aus(); } Eine schönere Lösung wäre also jedem Gerät einen eigenen Thread zuweisen, so dass ich die Zeiten pro Gerät einfach ändern kann. Also habe ich nun 7 Threads erstellt und diese in ein eigenes Modul gesteckt. thread blas_1 { blas.stuetz_1_ein(); sleep s1_1; blas.blas_1_ein(); blas.stuetz_1_aus(); sleep 30; blas.blas_1_aus(); sleep s1_2-30; } sleep s1_1 und s1_2 sind die Zeiten um die Taktrate eines Gerätes zu beeinflussen. Die sleep 30 sind fest vorgegeben. Und damit ich nicht in den Modulen nach den Zeiten suchen muss und auch, dass ich einfach in meinem Hauptmodul mehrere unterschiedliche Abläufe/Taktraten vorbereiten kann, wollte ich die Zeiten s1_1, s1_2 in mein Modul verlinkt/übertragen haben: Dies macht genau das selbe wie das Programm oben, allerdings sind die Zeiten viel ersichtlicher und ich kann jedes Geräte schneller/langsamer laufen lassen, ohne mir Gedanken um die anderen Zeiten machen zu müssen. //////////////ABLAUF 7////////////// function ablauf_7() { blas.s1_1 = 500; blas.s1_2 = 2300; blas.s2_1 = 500; blas.s2_2 = 2300; blas.s3_1 = 500; blas.s3_2 = 2300; blas.s4_1 = 500; blas.s4_2 = 2300; blas.s5_1 = 500; blas.s5_2 = 2300; blas.s6_1 = 500; blas.s6_2 = 2300; blas.s7_1 = 500; blas.s7_2 = 2300; sleep 0; run blas.blas_1; sleep 400; run blas.blas_2; sleep 400; run blas.blas_3; sleep 400; run blas.blas_4; sleep 400; run blas.blas_5; sleep 400; run blas.blas_6; sleep 400; run blas.blas_7; } ps: Das ist ja schrecklich mit dem Forum und den geforderten Zeilenumbrüchen ... geht sowas nicht inzwischen automatisch? Läuft das Forum auf ner C-Control? ^^ | |
Antwort schreiben Antworten: |