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