EtherCAT Error Handling -
Fehlersuche und Diagnose

zurück

Kabelbrucherkennung und Fehlersuche im EtherCAT-Feldbus

Sporadische Kabelprobleme im EtherCAT-Feldbussystem sind oft schwer zu finden. Daher bieten der EtherCAT-Master-Stack und der Ethernet-Core verschiedene Bibliotheksfunktionen und -elemente (z. B. Fehlerzähler) zur Problemaufdeckung.

Diagramm zur EtherCAT-Fehlererkennung – Übersicht zu Kabelbrucherkennung und Diagnosefunktionen

EtherCAT – Zyklische Fehlererkennung

Die Erkennung zyklischer Fehler ist typischerweise der erste Schritt zur Auffindung sporadischer Busfehler. Hierfür kann das Ereignisflag IRQ innerhalb des RX-Telegramms verwendet werden. Dieses Flag wird vom EtherCAT-Kern gesetzt, wenn sich die RX- und TX-Arbeitszähler des Telegramms nicht unterscheiden (der Arbeitszähler wird vom Gerät bei erfolgreicher Befehlsverarbeitung in jedem Zyklus inkrementiert). Dadurch kann auch die Position des Geräts im Netzwerk ermittelt werden, an der der Fehler aufgetreten ist. Mit dem Flag ERR_FLAG liefert der Ethernet-Kern außerdem Informationen darüber, ob während der PHY-Übertragung des Ethernet-Adapters ein Fehler aufgetreten ist.

 
__inline void __CheckError(void)
{
      //Check station error
      for (int i=0; i<__StationNum; i++)
            if (__pSystemList[i].RxTel.s.hdr.irq & (1<<15))
            {
                  //Reset error
                  __pSystemList[i].RxTel.s.hdr.irq &= ~(1<<15);
 
                  //Set error count and station index
                  __ErrStationIndex = i;
                  __ErrCnt++;
            }
 
      //Check general PHY error
      __bErrFlag = __pSystemStack->hdr.err_flag;
}

EtherCAT – Azyklische Fehlererkennung

Wurde im zyklischen Betrieb ein Fehler festgestellt, kann dieser nun mittels eines azyklischen Ethercat-Befehls überprüft werden. Zu diesem Zweck muss zunächst das Flag ERR_FLAG des Ethernet-Cores zurückgesetzt werden, damit der Fehlerzähler anschließend ausgelesen werden kann.

__inline void __CheckStationError(PSTATION_INFO pStation)
{
      RX_ERR_CNT    RxErrCnts = { 0 };
      ADD_ERR_CNT   AddErrCnts = { 0 };
      LOST_LINK_CNT LostLinkCnts = { 0 };
 
      //First try to reset ethernet core error flag
      if (__pUserStack->hdr.err_flag)
          __pUserStack->hdr.err_flag = FALSE;
 
      //Do some delay
      Sleep(100);
 
      //Check flag again
      if (__pUserStack->hdr.err_flag == FALSE)
      {
            //Send ethercat command
            if (ERROR_SUCCESS == Ecat64SendCommand(
                                          FPRD_CMD,
                                          pStation->PhysAddr,
                                          0x300,
                                          sizeof(RX_ERR_CNT),
                                          (PUCHAR)&RxErrCnts))
 
            if (ERROR_SUCCESS == Ecat64SendCommand(
                                          FPRD_CMD,
                                          pStation->PhysAddr,
                                          0x308,
                                          sizeof(ADD_ERR_CNT),
                                          (PUCHAR)&AddErrCnts))
 
            if (ERROR_SUCCESS == Ecat64SendCommand(
                                          FPRD_CMD,
                                          pStation->PhysAddr,
                                          0x310,
                                          sizeof(LOST_LINK_CNT),
                                          (PUCHAR)&LostLinkCnts))
            {
                 
            }
      }
}
 

Die Fehleranalyse kann weiter verfeinert werden, indem die Fehlerzähler des Ethernet-Adapters mit der Funktion Sha64EthCheckStatus aufgerufen werden.