Fehler beim auslesen der Counterports in Verbindung mit mehreren Treads Kategorie: Programmierung (von Volker - 18.09.2003 20:23) | |
| |
Hallo CC2 Anwender, ich habe Probleme mit Impulsverlusten am Zählerport 0. Mein Programm lie�t in einem Thread Geschwindigkeitsimpulse vom CAN, addiert diese auf und gibt sie am externen LCD aus. Im zweiten Thread lie�t es Geschwindigkeitsimpulse von der RS485-Schnittstelle aus und addiert diese genau so wie in Tread 1 auf und gibt sie am externen Display aus. Achtung, dieser Thread läuft noch nicht, wira auch nicht mit run gestartet. Im dritten Thread lie�t es Digitale Impulse vom Zählerport 0, summiert sie auf und gibt sie wie die beiden anderen Threads am externen Display aus. Der main-Thread erledigt initialisierungen und startet die anderen Threads. Der CAN- und der RS-Thread sind aktiviert. Werden nur CAN-Impulse gelesen, werden diese verlustfrei gezählt. Werden nur Digitalipulse gelesen funktioniert das Zählen ebenfalls verlustfrei. Das Problem: Werden gleichzeitig CAN und Digitalimpulse empfangen und aufsummiert, habe ich fast immer einen Verlust an Signalen vom Zählerport 0 (Thread 3). Die CAN-Signale werden immer verlustfrei gezählt. Wie kann das sein ?? Ich lese doch nur den Zählport aus, das Zählen der Impulse läuft doch am Betriebssystem vorbei oder ? Ich vermute die Problematik im Multithreading, bitte um Hilfe. Anbei das Programm: /******************************************************************************* RIZ-Auswertung über CAN, RS 485 und diskret riz_auswertung *******************************************************************************/ //--Variablendeklarationen------------------------------------------------------ string s; // Variable für Testausgeben string s1; byte capture_flag; // Capture-Variable byte can_data[8]; long CAN_Riz_neu, CAN_Riz_alt, CAN_Ueberlauf; long RS_Riz_neu, RS_Riz_alt, RS_Ueberlauf; long CAN_Zstand, RS_Zstand, D_Zstand; //------------------------------------------------------------------------------ thread CAN //------------------------------------------------------------------------------ { if can.rxd (0) // Test auf Empfang einer Nachricht { can.get(0,can_data); // Nutzdaten in Variable kopieren CAN_Riz_alt = CAN_Riz_neu; //Neue Daten der Variablen zuweisen CAN_Riz_neu = can_data[0]; //Vergl. ob ungültiger Wert => Alter Wert rückkopieren if (CAN_Riz_neu == 255) CAN_Riz_neu = CAN_Riz_alt; //Vergl. ob Byte-�berlauf => Variable inkrementieren if (CAN_Riz_neu < CAN_Riz_alt) CAN_Ueberlauf = CAN_Ueberlauf + 1; //Algorüthmus zur Zählerstandberrechnung CAN_Zstand = ((256 * CAN_Ueberlauf) + CAN_Riz_neu); //�berlauf der Anzeige verhindern if CAN_Zstand == 10000000 CAN_Zstand = 0; //Ausgabe des Zählerstandes capture capture_flag; // Anfang Capture s1 = "C"; str.putlongf(s1,CAN_Zstand,7); lcdext.goto(1,0); lcdext.print(s1); release; // Ende Capture //sleep 10; } } //------------------------------------------------------------------------------ thread RS485 //läuft noch nicht !!!!!!!!!!!!!!!!! //------------------------------------------------------------------------------ { //�berlauf der Anzeige verhindern if RS_Zstand == 10000000 RS_Zstand = 0; //Ausgabe des Zählerstandes capture capture_flag; // Anfang Capture s1 = "R"; str.putlongf(s1,RS_Zstand,7); lcdext.goto(1,8); lcdext.print(s1); release; // Ende Capture } //------------------------------------------------------------------------------ thread Diskret //------------------------------------------------------------------------------ { D_Zstand = D_Zstand + ports.getcount(0); //�berlauf der Anzeige verhindern if D_Zstand == 10000000 D_Zstand = 0; //Ausgabe des Zählerstandes capture capture_flag; // Anfang Capture s1 = "D"; str.putlongf(s1,D_Zstand,7); lcdext.goto(2,0); lcdext.print(s1); release; // Ende Capture } //------------------------------------------------------------------------------ thread main //------------------------------------------------------------------------------ { //--Initialisierungen----------------------------------------------------------- lcdext.init(); lcdext.goto(1,0); // Display Voreinstellungen lcdext.print("C R "); lcdext.goto(2,0); lcdext.print("D "); can.init(0,0x07ff,0x07ff); // Baudratenwahl und Maskeninitialisierung can.expect(0,0x03b2); // Einstellung Empfangs ID für RIZ_VL //--Variablen-Initialisierung--------------------------------------------------- CAN_Riz_neu = 0; CAN_Riz_alt = 0; CAN_Ueberlauf = 0; CAN_Zstand = 0; RS_Riz_neu = 0; RS_Riz_alt = 0; RS_Ueberlauf = 0; RS_Zstand = 0; D_Zstand = 0; loop { run CAN; //run RS485; run Diskret; } } | |
Antwort schreiben Antworten: Re: Fehler beim auslesen der Counterports in Verbindung mit mehreren Treads (von André H. - 21.09.2003 9:35) Re: Fehler beim auslesen der Counterports in Verbindung mit mehreren Treads (von Volker - 29.09.2003 20:49) |