Beispiele

<< Click to Display Table of Contents >>

Navigation:  Plug-ins > User-Plug-ins > User-Plug-in erstellen >

Beispiele

 

Die folgenden Beispiele zeigen nur Vorschläge zur Implementierung einer bestimmten Funktionalität und keinen Lösungsansatz zur Implementierung eines vollständigen User-Plug-ins.

 

 

Reaktion auf Änderung der Datenbasis

Um auf Änderung der Datenbasis reagieren zu können, muss eine entsprechende Callback-Funktion (OnDatabaseChanged) registriert werden. Dies kann beispielsweise in der Export-Funktion DLL_vInit geschehen. Bei laufender Simulation ist dies nicht möglich.

 

// OnDatabaseChanged registrieren.

if(CAND_enRegisterCallback(OnDatabaseChanged,

 CAND_enDBChanged,

 CAND_hNullHandle(),

 0)

 == CAND_nERR_OK)

{

  // Registrierung war erfolgreich.

}

 

Die Deregistrierung kann in der Export-Funktion DLL_vDeInit vorgenommen werden.

 

// OnDatabaseChanged deregistrieren.

if(CAND_enUnRegisterCallback(OnDatabaseChanged,

                            CAND_enDBChanged,

                            CAND_hNullHandle(),

                            0)

 == CAND_nERR_OK)

{

  // Deregistrierung war erfolgreich.

}

 

Die Callback-Funktion muss den folgenden Aufbau haben:

 

ANSI_C void USERDLL_CALL OnDatabaseChanged(CAND_tenDBChangedReason iReason,

                                          CAND_tHandle hObject)

{

  // Hier Code einfügen zur Reaktion auf Änderung der Datenbasis.

}

 

Jedes Mal, wenn nun die Datenbasis verändert wird, wird diese Funktion aufgerufen, z.B. wenn eine neue geladen oder wenn ein Datenbasis-Objekt verändert wird.

 

 

Beispiel: Aktionen vor Senden einer Botschaft

Für Benachrichtigungen bevor eine Botschaft auf dem Bus versendet wird, kann ein sogenannter Pre-Transmit-Callback registriert werden:

 

// OnPreTransmitMsg registrieren.

if(CAND_enRegisterCallback(OnPreTransmitMsg,

                          CAND_enPreTransmit,

                          m_hRegMsg,

                          0)

   == CAND_nERR_OK)

{

// Registrierung war erfolgreich.

}

 

Wird der Callback nicht mehr verwendet, muss dieser abgemeldet werden:

 

if(CAND_enUnRegisterCallback(OnPreTransmitMsg,

                            CAND_enPreTransmit,

                            m_hRegMsg,

                            0)

  == CAND_nERR_OK)

{

  // Deregistrierung war erfolgreich.

}

 

Die folgende Implementation der Callback-Funktion bewirkt, dass vor dem Senden der Botschaft MS_308h der Signalwert des Signals NMOT inkrementiert wird.

 

ANSI_C unsigned char USERDLL_CALL OnPreTransmitMsg(

                                       CAND_tHandle hMsg,

                                       CAND_tstCanMessage* pstMsg,

                                       DWORD dwUserData)

{

  // Handle auf Botschaft "MS_308h" holen.

  CAND_tHandle hMs308h = CAND_hFindObject(NULL, NULL, "MS_308h",

                                          -1, NULL, CAND_hNullHandle());

 

  // Handle zum Signal aus der Botschaft holen.

  CAND_tHandle hAliveCounter = CAND_hGetSignalByName(hMs308h, "NMOT");

 

  // Signalwert holen

  QWORD qwSigVal = 0;

  if (CAND_enGetSigData(hAliveCounter, &qwSigVal, sizeof(qwSigVal)) == CAND_nERR_OK)

  {

     // Signalwert erhöhen und zurückschreiben

     qwSigVal++;

 

     if(CAND_enSetSigDataHex(hAliveCounter, qwSigVal) == CAND_nERR_OK)

     {

        // Signalwert wurde gesetzt.

     }

  }

  return 1;

}