Emergency Errors

Managing Emergency Errors

The CANopen stack provides service API functions for managing the emergency events within the application. The handling of EMCY transmission events, the error register and EMCY history management within the object directory is handled within the CANopen stack. For managing the emergency errors the service function group COEmcy…() is provided.

Emergency Codes

The emergency error codes and the properties of the emergency errors are specified within the configuration. The following example shows the emergency error specification table:

  const CO_EMCY_TBL DemoEmcyCode[CO_EMCY_N] = {
      {  /*--- emercency: #0 -----*/
        CO_EMCY_REG_GENERAL,            /* error register bit    */
        CO_EMCY_CODE_GEN_ERR + 0x0010   /* emergency error code  */
      },
      {  /*--- emercency: #1 -----*/
        CO_EMCY_REG_VOLTAGE,            /* error register bit    */
        CO_EMCY_CODE_VOL_ERR + 0x0001   /* emergency error code  */
      },
       :
  };

When using the emergency errors, the emergency code is the key for the service functions. Additional to the specific emergency code, user data may be stored or transmitted with each emergency change event. The user data is typical a local structure which will be given as parameter to the service functions. Due to the fact, that the user data for transmission and internal history has different sizes, the following structure is provided for the user data fields:

  CO_EMCY_USR DemoEmcyUsr = {
      0x1234,                            /* 16bit User Data for History  */
      { 0x11, 0x22, 0x33, 0x44, 0x55 }   /* 5byte User Data for EMCY-Msg */
  };

Note: The user data fields for history and/or message can be disabled with two separate configuration settings.

Emergency Event

The application can focus on the detection of the system situations, which shall rise an emergency event. For setting and clearing the emergency #0 on a application specific emergency condition, the typical sequence is:

  if (DemoEmcyCondition == TRUE) {
      COEmcySet  (&demo.Emcy, 0, &DemoEmcyUsr);
  } else {
      COEmcyClear(&demo.Emcy, 0);
  }

The setting and clearing functions are very similar. Therefore the following diagram shows the internal behavior of the service for setting an emergency error:

sequenceDiagram
    participant A as Application
    participant E as demo.Emcy
    participant D as demo.Dir
    participant I as demo.If
    A->>+E: COEmcySet()
    alt new emergency
    E->>D: add emcy to history
    E->>D: set error register
    E->>I: send EMCY message
    end
    E-->>-A: ok

Emergency State

The CANopen stack provides service functions to get internal information of the emergency error management. This simplifies the realization of a central error management within the CANopen device.

The following example returns the number of currently active emergency errors:

  num = COEmcyCnt(&demo.Emcy);