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

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

Kommentar:
Einfügen von HTML im Kommentar:

Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a>
Bild einfügen: <img src="BILDURL">
Text formatieren: <b>fetter Text</b>  <i>kursiver Text</i> <u>unterstrichener Text</u>
Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b>
C2 Quellcode formatieren: <code>Quellcode</code>
ASM Quellcode formatieren: <asm>Quellcode</asm>
(Innerhalb eines Quellcodeabschnitts ist kein html möglich.)
Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst !  

> 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; > } > > }
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB