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

Re: Einsetzen von Captures Kategorie: Programmierung (von André H. - 15.09.2011 11:31)
Als Antwort auf Einsetzen von Captures von Newbie - 15.09.2011 10:06
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, C-Control II Station, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.1
Hallo Michael,

> Die Struktur ist folgende:
>
> Modul Global:
>
> long Antwort;
>
>
> Modul Kommunikation:
>
>
> function Kommando1 returns long
> {hwcom send&receive stuff....;return timer}
>
> function Kommando2 returns long
> {hwcom send&receive stuff....;return timer}
>
> function Status
> {hwcom send&receive stuff....;return timer}
>
> thread main
>
> loop
> {
> cap.Capture(0);
> Global.Antwort=Status();
> cap.Release(0);
>
> sleep 1000;
> }
>

>
> Modul Regelung:
>
>
> thread main
> loop
> {if x==Event
> {cap.Capture(0);
> Global.Antwort=Kommunikation.Kommando1();
> cap.Release(0);}
>
> if x=Event2
> {cap.Capture(0);
> Global.Antwort=Kommunikation.Kommando1();
> cap.Release(0);}
> sleep 1000;
>
> }
>
>

>
> Wenn ich jetzt mit einem Terminalprogramm dies manuell teste, dann senden die Threads trotzdem
> durcheinander..  Was habe ich falsch gemacht? cap.init() wurde ausgeführt.

Ich sehe hier mehrere mögliche Probleme:
1. cap.init() wird evtl. in einer Schleife aufgerufen, und somit die Captures bei jedem
   Durchlauf zurückgesetzt?
2. Alle Deine Threads heiÃ?en main. Somit laufen diese bei Programmstart sofort an.
   (Threads mit dem Namen "main" werden vom Compiler mit der Prio 32 compiliert, alle
    anderen mit Prio 0.)
   Dies kann man machen, wenn diese komplett eigenständig laufen könne, was bei Dir
   aber nicht der Fall ist. Denn beide Threads sind darauf angewiesen, daÃ?
   die erweiterten Captures vor dem Anlaufen bereits initialisiert wurden.
   Benenne also beide Threads um, und starte diese aus dem eigentlichen Main-Thread per run.
   Das ist der Thread, in dem Du die Initialisierungen vornimmst.

Ich sehe hier allerdings noch ein Problem mit der Variable "Global.Antwort".
Beide Threads scheiben auf dieselbe Variable. Es kann (und wird) jetzt vorkommen, daÃ?
nach dem cap.Release() der jeweils andere Thread zum Zuge kommt, während Du
noch mit "Global.Antwort" arbeitest. Evtl. wäre es hier besser, mit verschiedenen
Variablen zu arbeiten.

Ich weiÃ? jetzt nicht, wie die Struktur Deiner Kommunikation im Detail aussehen soll, aber
es wäre besser, die Threads nach Aufgaben und Ressourcen zu erstellen.
Also ein Thread für die Kommunikation RS232, ein andere für die Bedienung (LCD+Tastatur) etc.
Denn, die sekündliche Statusabfrage bekommst Du normalerweise leicht
in die Kommunikation mit rein.


MfG André H.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten: