EtherCat Synchronisation mit CAN Interface EL6751

Grashalm4

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,

ich arbeite Gerade an der Kommunikation mit CAN (nicht CANopen).
Ich sende von meinem PC über Busmaster einige Testsignale an die Klemme. (wechselnde Botschaften mit gleichem Identifier)

In den Outputs der CAN-Box findet sich ein Element RxMessages. In diesem sind die CAN-Botschaften zu finden.
Es Handelt sich um ein Array mit 10 Elementen (Also 10 Nachrichten).
Die Bezeichnung des DatenTyps CANQUEUE legt nah, dass es sich um eine Warteschlange handelt.
Das Problem ist, dass diese sich nicht aktualisiert, bzw füllt.
Starte ich mein Programm, werden einmalig Botschaften geladen, dann nichtmehr.

in einem POU frage ich alle 10ms das Array mit den Botschaften ab, jedoch ändert sich dort auch nichts.
Ich dachte das reicht für die Synchronisation mit der Klemme.

Es scheint mir als läge der Fehler darin, dass die Klemme, oder alle meine EtherCat Klemmen nicht richtig Synchronisiert werden.
Betreibe die Klemme über eine Buskoppler EK1100 direkt am Rechner.

Grüße
 
Es gibt ein Handshake das du aktiv betreiben musst.
Dies gilt für das Senden genauso wie für das Empfangen.
Konkret: Es gibt irgendwo ein ControlWort (oder Byte) das Bitcodiert ist (eventuell auch irgendwo ein Zähler...). U.a. musst du dort sagen das du die im Puffer anstehenden (10) Nachrichten abgeholt hast. Erst wenn dies erfolgt ist wird von der Klemme der Puffer erneut gefüllt.
Gleiches fürs Senden. Du darfst erst dann neue Informationen in den Sendepuffer kopieren wenn die Klemme dir über den Status mitgeteilt hat das diese Daten tatsächlich abgeholt wurden.

Irgendwo im Infosys gibt es für das Can-Interface auch ein Beispiel ....(gegebenenfalls bei TC2)

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das macht aufjedenfall sinn!
in der Dokumentation zur Klemme habe ich folgendes gefunden.
Code:
if Outputs.RxCounter <> Inputs.RxCounter 
then       for I := 0 to (Inputs.NoOfRxMessages-1) do                  
MessageReceived[i] := Inputs.RxMessage [i];       
End_for       
Outputs.RxCounter := Outputs.RxCounter+1;
end_if

Ich verstehe das so, dass in NoOfRxMessages die Anzahl der "nicht abgeholten" Nachrichten steht, ich diese dann abholen und anschließend den RxCounter um 1 erhöhe.
Der Vergleich von Outputs.RxCounter und Inputs.RxCounter verstehe ich allerdings nicht. Handelt es sich bei Inputs.RxCounter um eine Variable die ich in meinem Code erzeuge ?

ein Beispiel Projekt würde mir wirklich helften. Finde leider nur diesen Code Ausschnitt.

Grüße
 
Du hast auf dem CanInterface (im EA-Baum) jeweils einen Counter im Status und Control. Wie du schon so schön erkannt hast wird der Eingangszähler (vermutlich mit den Namen RxCounter) um 1 erhöht wenn es neue (bis zu 10) Nachrichten gibt.

Damit du das aus der PLC steuern kannst brauchst du entsprechende Variablen die du mit diesen EA-Variablen verknüpfst...
Soo schwierig ist es nicht.
 
Vielen Dank, meine Kommunikation läuft jetzt!

Habe ein Array mit CAN Massages erstellt, in welches die Nachrichten abgeholt werden, und in der Zwischenzeit werden sie dann weiterverarbeitet.
 
Zurück
Oben