Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: run, halt austauschen Kategorie: Programmierung (von Lorenz - 8.12.2011 16:17)
Als Antwort auf Re: run, halt austauschen von André H. - 6.12.2011 21:04
Ich nutze:
C-Control II Station
Hallo André


Viele Dank für die ausführliche Antwort.

Da  sieht man  den Spezialisten der C-contol II.
Die Lösung 2 ist eine intressante Möglichkeit. Ich werde zuerst mit einer
Weiche probieren. Für mich als Leihe einfacher.

Mfg

Lorenz aus Südtirol







> Hallo Lorenz,
>
> Grundlagen C2:
> Funktionen können nur Werte und Variablen bzw. Referenzen auf Variablen(Arrays)
> übergeben werden.
> Ein Thread ist keines davon. Deshalb kann dies auch nicht übergeben werden.
>
> Nun zum Problem:
> Die Schlüsselworte zur Threadkontrolle erwarten die Threadnummer als Konstante.
> D.h. diese wird einkompiliert. (siehe vmcodes.c2)
> Wenn man mit run, halt, resume, reset arbeitet führt daran kein Weg vorbei.
> Es gibt zwei Möglichkeiten:
> 1. Du baust Dir eine Weiche.
>   Mit If-Anweisungen wählst Du die entsprechenden Threads aus.
> 2. Du arbeitest mit einem kleinem Trick.
>   Ich hatte im Zusammenhang mit einem anderem Problem vor langer Zeit eine direktere
>   Möglichkeit der Thread-Kontrolle aufgezeigt:
>   Re: Funktions/Thread-Definitionen vom 11.05.2008
>   Einziger Nachteil: Du muÃ?t die Thread-ID in Erfahrung bringen. Ã?ndert sich die Reihenfolge
>   der Threads, anderen sich auch die IDs. Diese werden von Oben nach unten
>   bei 1 beginnend zugewiesen. Der Mainthread (der unterste) hat die höchste ID.
>   Sinnvoll ist es, wenn die Threads Ihre IDs selbst verraten. Dazu müssen alle Threads
>   bei Programmstart kurz anlaufen.
>
> z.B.:
>
> byte ThreadID[32]; Array für bis zu 32 Threads
> const Thread_irgendwas=1;
> const Thread_wasanderes=2; // Der Index hat nichts mit der ID zu tun
> //dies Dient nur zu leichteren Verwendung. Man kann die IDs natürlich
> //auch in einzelne Bytevariablen speichern.
>
> thread irgendwas
> {
>  ThreadID[Thread_irgendetwas]=TID();
>  halt;// Wichtig, wenn der Thread nicht sofort weiterlaufen soll.
>        // Kann entfallen, wenn die ThreadID erst nach dem ersten vorgesehenem run benötigt wird.
>  loop // Eigentlicher Threadinhalt
>  {
>  //...
>  }
> }
>
> thread irgendwas
> {
>  ThreadID[Thread_wasanderes]=TID();
>  halt;
>  loop // Eigentlicher Threadinhalt
>  {
>  //...
>  }
> }
>

>
> Die Threads können dann mit setPrio() beinflu�t werden.
> Eine Priorität von 0 hei�t, da� der Thread steht.
> 1 bis 255 heiÃ?t, er soll mit der entsprechenden Prio laufen.
>
> Bei dieser Lösung kann weiterhin parallel mit den Schlüsselworten gearbeitet werden.
> Der Vorteil dieser Lösung ist, da� man nicht den Einschränkungen des Single-Pass-Compilers
> unterliegt, sondern auch ein weiter oben stehender Thread auch einen weiter unten steuern kann.
>
> MfG André H.
>
>
> >
> > Hallo,
> > ich möchte gern wissen ob man meinen Code kürzer schreiben kann.
> > Dieser wäre der untenstehende Code und zwar 5 mal hintereinander geschrieben,
> > nur dass menu.Ladepumpe_tog durch eine andere Variablen ersetzt wird und dass
> > der thread ladepumpe.Pumpe durch andere threads gestartet und gehalten wird.
> >
> >
> > thread auto
> > {
> >
> > byte  x[5];
> >
> >
> >     loop
> >     {
> >        if menu.Ladepumpe_tog != 0
> >        {
> >        x[2] = 1 ;
> >             if menu.Ladepumpe_tog == 1
> >             {
> >                       if stports.get(10) == 0
> >                       {
> >                        halt ladepumpe.Pumpe;
> >                    
> >                       stports.set(10,-1) ;
> >                       }
> >                      
> >           }
> >           else
> >           {
> >                     if stports.get(10) != 0
> >                        {
> >                        halt ladepumpe.Pumpe;
> >                       stports.set(10,0);
> >                         }
> >                        
> >           }
> >        }
> >        else
> >        {
> >        if x[2] == 1
> >                 {
> >                  run ladepumpe.Pumpe;
> >                 sleep 1000;
> >                 }
> >        x[2] = 0;
> >        }
> >        sleep 1000;
> >     }
> >    
> > }
> >

> >
> > Ich habe es vesucht so zu lösen wie in diesem Beispiel, aber es hat nicht funktioniert:
> >
> >
> > function update(var myvar, thread mythread)
> > {
> > ...
> > }
> >
> > function auto()
> > {
> > function update(var1, thread1);
> > function update(var2, thread2);
> > function update(var3, thread3);
> > }

> >
> > MfG
> > Lorenz


    Antwort schreiben


Antworten: