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 | ||
| ||
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: |