Verzögerung in CAPL

Gast
So viel ich weiß, gar nicht. Dafür ist, finde ich, CAPL nicht ausgelegt. 
Wie du es machen kannst, bzw. ich mache. Du schickst die Nachricht zum 
Laden, startest einen Timer und der Handler schickt die Nachricht zum 
Entladen.

Sowas wie delay(xx) habe ich mal gesucht, aber nie gefunden. Du könntest 
sonst das mit C/Matlab, ... nutzen, da sollte das gehen. Bei CAPL dürfen 
die Funktionen nicht blockieren.
Das geht in CAPl sehr einfach.
Bist du in einem Testmodul oder in einem Netzwerkknoten?

Testmodul:
Funktion TestWaitForTimeout(...) benutzen.

Netwerkknoten:
 - Mit setTimer(t1, 5000) einen Timer aufziehen.
 - Mit on timer t1 { ... } einen Event-Handler implementieren.
Gast
Danke für die Antworten.
Ich wollte dass die Entladung sich für 5s verzögert aber ich kriege das 
nicht hin.

Das Programm sieht so aus:

char Hochladen = 0;
char Entladen = 0;

on timer t1
{

/*Lade_spannung hoch*/
 if (t <= 10)
  {
    setTimer (t1 , 10);
    t+=0.01;
    y = ymax*(1-exp(-t));


 /*Entlade Spannung*/
  }else
  {

    Hochladen = 0;
    if ($Botschaft_1::Signal_1 == 0)
    {
      setTimer(t2,10);
      t = 0;
      Entladen = 1;
    }
  }
}

on timer t2
{
 if (t <= 5)
  {
    setTimer (t2 , 10);
    t+=0.01;
    y = ymax*(exp(-t));
  }else
  {
    Entladen = 0;
  }

}

on timer Entladeverzoegerung
{
  ?
}
Gast
Es wurde doch schon 2x geschrieben wie man einen Timer in CAPL 
programmiert.

Läuft deine Simulation? Teste mal folgenden Code. Dann Taste 'a' 
drücken.

msTimer tmrTest;

on key 'a'
{
  setTimer(tmrTest, 5000);
}

on timer tmrTest
{
  write("Timer abgelaufen");
}
Du brauhst nur einen Timer. Etwa so:
1
ladestatus = 0; // 0 = laden, 1 = warten, 2 = entladen
2

3
on timer t1
4
{
5
  if(ladestatus == 0) /* bin beim laden */
6
  {
7
    if( /* laden noch nicht fertig */ )
8
    {
9
      /* lade weiter */
10
      setTimer (t1, 10)
11
    } 
12
    else
13
    {
14
       /* laden fertig - jetzt 5 sek warten */
15
       ladestatus = 1
16
       setTimer(t1, 5000)
17
    }
18
  }
19
  else if (ladestatus == 1) /* warten */
20
  {
21
    /* warte timer abgelaufen - jetzt entladen */
22
    ladestatus = 2
23
    setTimer(t1, 10)
24
  }
25
  else if(ladestatus == 2) /* jetzt entladen */
26
  {
27
    if( /* entladen noch nicht fertig */ )
28
    {
29
      /* entlade weiter */
30
      setTimer (t1, 10)
31
    } 
32
    else
33
    {
34
       /* entladen fertig */
35
    }
36
  }
37
  else
38
  {
39
     /* Ungültige ladestatus- Fehler melden! */
40
  }
41
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.