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

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)