Project

General

Profile

Actions

Support Request #1985

closed

CAN Config Codec struct creation

Added by hidden about 6 years ago. Updated almost 6 years ago.

Status:
Closed
Priority:
Normal
Customer:
VW
Department:
CARMEQ
Requester's Priority:
Normal
Support Level:
2nd Level
Resolution:
Solved Issue
Product Issue Numbers:
Platform:
Windows 10 64bit
Topic:
DeviceTB::CAN
FAQ Links:

Description

Supportanfrage

Dear Sir or Madam,
I use the "CAN Config Codec Ext" from the package ADTF Device Toolbox 2.6.0 to convert CAN-Data to C-structs. An example struct looks like this:
struct B { int v; };
struct C { int v; };
struct A { B b; C c; };
I try to convert data to structure A, but some of my samples do not have the value "C". My goal is that nevertheless the structure "A" is created.
Can I somehow achieve this goal, e.g. by setting default values for "C" or by using other data types?

Lösung

Dazu musst du einen Trigger definieren oder mit einen Makro arbeiten, ansonsten wird das Sample erst generiert, wenn alle notwendigen Daten anliegen.
Die dazu das Usermanual der Device TB
  • Kap. 2 Config Codec—Signal Configurator (allgemein)
  • Kap. 2.9.4 Triggers
  • Kap. 2.10 Description of built in Macros

Variante 1: Verwendung eines Triggers
In der Anleitung ist von einem optionalen Trigger die Rede.
Muss dieser beim CAN_Config_Codec_Ext aktiviert werden? Wenn ja, wie?

Im Signal Config Filter Editor (startbar via Kontextmenu/Rechtsklick) des CAN Config Codec Ext Filters.
Dort kannst du bei einem Pin neben Strukturen auch einen Trigger setzen.

Angenommen ich setze die Property „timeout“, wird dann nach der gesetzten Zeit das Objekt am Output generiert?

Ich habe mal versucht deine Struktur nachzubauen und haben einen Timeout von 1 (Sekunde) gesetzt:

Nun wird jede Sekunde die Struktur generiert und am Ausgangspin versendet.
Als Wert ist immer der zuletzt empfangene (also auf dem Busliegende) gesetzt.
In meinem Bsp. wird nur das Kombi Signal (also die Struktur B gesendet) jede Sekunde gesendet (Counter 1), ESP liegt nicht auf dem Bus und hat demnach den default Wert (hier 0):

In einem zweiten Bsp. schicke ich zusätzlich alle 5 Sekunden auch das ESP Signal (Struktur A) mit Counter 2:

Was setzt der Codec für den Wert „c“ in dem strukt A ein?
Oder müssen die fehlenden Werte durch C++-Code ergänzt werden?

Als Wert ist immer der zuletzt empfangene (also auf dem Busliegende) gesetzt.

Die CAN-Daten kommen von einem Harddisk_Player. Womit muss der Trigger verbunden werden?

Der Trigger muss mich nichts "verbunden" werden, die Quelle ist egal.
In meinem Bsp. ist es ein Timeout, ich kenne ja meine Zyklus Zeit.
Du kannst ihn auch auf Botschaften setzen, die müssen dann aus der Database (DBC) kommen.

Variante 2: Nutzung eines Makros
Anscheinend benötige ich das Element Macro $CONSTANT$. Muss das Makro im CAN_Config_Codec_Ext gesetzt werden
oder werden die Daten von dem Makro vorverarbeitet? Wie geschieht das?

Für deinen Use Case eher unbrauchbar, weil der Wert dann immer gesetzt wird, egal was auf dem Bus liegt oder das Signal ankommt oder nicht.
Das Makro Thema würde ich in deinem Use Case ignorieren.


Files

timeout_result.png (43.1 KB) timeout_result.png hidden, 2018-04-05 18:22
timeout_result_2.png (46 KB) timeout_result_2.png hidden, 2018-04-05 18:22
timeout_setup.png (29.4 KB) timeout_setup.png hidden, 2018-04-05 18:22
~WRD000.jpg (823 Bytes) ~WRD000.jpg hidden, 2018-04-09 16:45
Actions #1

Updated by hidden about 6 years ago

Paul Völker wrote:

Dear Sir or Madam,
I use the "CAN Config Codec Ext" from the package ADTF Device Toolbox 2.6.0 to convert CAN-Data to C-structs. An example struct looks like this:
struct B { int v; };
struct C { int v; };
struct A { B b; C c; };
I try to convert data to structure A, but some of my samples do not have the value "C". My goal is that nevertheless the structure "A" is created.
Can I somehow achieve this goal, e.g. by setting default values for "C" or by using other data types?
Best regards
Paul Völker

PS: You can also reply in German

Actions #2

Updated by hidden about 6 years ago

  • Department set to CARMEQ
  • Topic set to DeviceTB::CAN
  • Project changed from Public Support to 20
  • Status changed from New to In Progress
Actions #3

Updated by hidden about 6 years ago

  • Status changed from In Progress to Customer Feedback Required

Hallo Paul,

dazu musst du einen Trigger definieren oder mit einen Makro arbeiten, ansonsten wird das Sample erst generiert, wenn alle notwendigen Daten anliegen.
Die dazu das Usermanual der Device TB
  • Kap. 2 Config Codec—Signal Configurator (allgemein)
  • Kap. 2.9.4 Triggers
  • Kap. 2.10 Description of built in Macros
Actions #4

Updated by hidden about 6 years ago

  • Subject changed from CAN_Config_Codec struct creation to CAN Config Codec struct creation
  • Description updated (diff)
  • Status changed from Customer Feedback Required to To Be Closed
  • Resolution set to No Customer Feedback

Kein weiteres Feedback, Ticket aus unserer Sicht abgeschlossen.

Actions #5

Updated by hidden about 6 years ago

Sehr geehrte Damen und Herren,

ich habe mir die Dokumentation durchgelesen. Jedoch wurde mir nicht ersichtlich, wie ich die beiden Möglichkeiten anwenden kann.

Variante 1: Verwendung eines Triggers
In der Anleitung ist von einem optionalen Trigger die Rede.
Muss dieser beim CAN_Config_Codec_Ext aktiviert werden? Wenn ja, wie?
Angenommen ich setze die Property „timeout“, wird dann nach der gesetzten Zeit das Objekt am Output generiert?
Was setzt der Codec für den Wert „c“ in dem strukt A ein?
Oder müssen die fehlenden Werte durch C++-Code ergänzt werden?
Die CAN-Daten kommen von einem Harddisk_Player. Womit muss der Trigger verbunden werden?

Variante 2: Nutzung eines Makros
Anscheinend benötige ich das Element Macro $CONSTANT$. Muss das Makro im CAN_Config_Codec_Ext gesetzt werden
oder werden die Daten von dem Makro vorverarbeitet? Wie geschieht das?

Ich habe auch die Beispielprojekte der Device-Toolbox gebaut und untersucht. Leider wird mir daraus nicht ersichtlich, wie man ein Makro oder einen Trigger anwendet.
Ich hoffe Sie können mir einen Schritt weiterhelfen.

Mit freundlichen Grüßen
Paul Völker

Actions #6

Updated by hidden about 6 years ago

  • Status changed from To Be Closed to In Progress
Actions #7

Updated by hidden about 6 years ago

Hallo Paul,

Variante 1: Verwendung eines Triggers
In der Anleitung ist von einem optionalen Trigger die Rede.
Muss dieser beim CAN_Config_Codec_Ext aktiviert werden? Wenn ja, wie?

Im Signal Config Filter Editor (startbar via Kontextmenu/Rechtsklick) des CAN Config Codec Ext Filters.
Dort kannst du bei einem Pin neben Strukturen auch einen Trigger setzen.

Angenommen ich setze die Property „timeout“, wird dann nach der gesetzten Zeit das Objekt am Output generiert?

Ich habe mal versucht deine Struktur nachzubauen und haben einen Timeout von 1 (Sekunde) gesetzt:

Nun wird jede Sekunde die Struktur generiert und am Ausgangspin versendet.
Als Wert ist immer der zuletzt empfangene (also auf dem Busliegende) gesetzt.
In meinem Bsp. wird nur das Kombi Signal (also die Struktur B gesendet) jede Sekunde gesendet (Counter 1), ESP liegt nicht auf dem Bus und hat demnach den default Wert (hier 0):

In einem zweiten Bsp. schicke ich zusätzlich alle 5 Sekunden auch das ESP Signal (Struktur A) mit Counter 2:

Was setzt der Codec für den Wert „c“ in dem strukt A ein?
Oder müssen die fehlenden Werte durch C++-Code ergänzt werden?

Als Wert ist immer der zuletzt empfangene (also auf dem Busliegende) gesetzt.

Die CAN-Daten kommen von einem Harddisk_Player. Womit muss der Trigger verbunden werden?

Der Trigger muss mich nichts "verbunden" werden, die Quelle ist egal.
In meinem Bsp. ist es ein Timeout, ich kenne ja meine Zyklus Zeit.
Du kannst ihn auch auf Botschaften setzen, die müssen dann aus der Database (DBC) kommen.

Variante 2: Nutzung eines Makros
Anscheinend benötige ich das Element Macro $CONSTANT$. Muss das Makro im CAN_Config_Codec_Ext gesetzt werden
oder werden die Daten von dem Makro vorverarbeitet? Wie geschieht das?

Für deinen Use Case eher unbrauchbar, weil der Wert dann immer gesetzt wird, egal was auf dem Bus liegt oder das Signal ankommt oder nicht.
Das Makro Thema würde ich in deinem Use Case ignorieren.

Actions #8

Updated by hidden about 6 years ago

  • Status changed from In Progress to Customer Feedback Required
Actions #9

Updated by hidden about 6 years ago

  • Resolution deleted (No Customer Feedback)
Actions #10

Updated by hidden about 6 years ago

  • Description updated (diff)
Actions #11

Updated by hidden about 6 years ago

(Ich mische mich - als Externer - mal ein)

Die Trigger-Verarbeitung findet intern statt. Man definiert nur den Timeout und/oder eine Stop-MsgID.

Für alle nicht aktuell empfangenden Werte bleiben die vorherigen Werte erhalten. Man kann aber für einen Pin die Eigenschaft 'clear_after_transmit' setzen, dann würde 0 drinstehen. (Man könnte auch einen zusätzlich 'c_is_valid'-Eintrag im Struct einführen, der angibt, ob 'c' gesetzt wurde - mit Hilfe des Macros IF_RECEIVED.)

Beispiele für die Benutzung von Macros sind in 'adtf-device-toolbox\src\examples\src\can_config_codec\can_codec_example.xml'.

Actions #12

Updated by hidden about 6 years ago

Danke für den Nachtrag !
  • clear_after_transmit habe ich bewusst nicht angegeben, da es alle Strukturen des Pins betrifft, also auch die "gültigen", was sich imho nicht mit dem beschriebenen Use Case deckt. Aber ja, die Möglichkeit besteht
  • Das Makro IF_RECEIVED wäre möglich, es kommt wie gesagt darauf an, welche Ausgabe Paul möchte. Ich habe es so verstanden, dass es ihm nur wichtig ist, dass die Struktur immer gesendet wird, auch wenn sie nicht vollständig ist. Da der zuletzt empfangene auch der aktuell gültige auf dem Bus ist, würde ich hier von Makros abraten
Actions #13

Updated by hidden about 6 years ago

Ohh. Die lange Antwort von Florian hatte ich gestern gar nicht gesehen. Da hatte ich wohl vergessen zu aktualisieren.
(Insofern ist mein Beitrag nicht als Nachtrag zu verstehen, sondern als kurze Antwort)

Actions #14

Updated by hidden about 6 years ago

Hallo zusammen,

erstmal herzlichen Dank für die vielen Hinweise und die Bilder.

Ich darf keine große Zeitverzögerung erhalten. Daher ist ein Timeout von 1 Sekunde leider unbrauchbar.
Und ich möchte auch wissen ob gerade Daten von C anliegen oder nicht.
Die einfachste Möglichkeit das herauszufinden ist vermutlich das Makro IF_RECIEVED.

Da Timeout anscheinend nur Sekundenweise funktioniert(!?), würde ich versuchen im Trigger die „stop_msg“ zu nutzen.
Wenn ich B als Trigger-Signal benutze habe ich aber vermutlich das Problem, dass evtl. das aktuelle C noch gar nicht angekommen ist.
Ab welcher Verzögerung zwischen dem aktuellen B und dem letzten C würde das Makro IF_RECIEVED dann sagen, dass C nicht mehr angekommen/aktuell ist?

Wenn B und C vorhanden sind, brauche ich von beiden den aktuellen Wert.
Falls zu Beginn nur B existiert und später C hinzukommt, ist es aber nicht notwendig, dass das sofort im ersten Sample erkannt wird.

Viele Grüße und ein schönes Wochenende
Paul Völker

Actions #15

Updated by hidden about 6 years ago

Hallo Paul,

du hast meiner Meinung nach soviele Kombinationsmöglichkeiten und Fehlerquellen... warum erstellst du nicht einfach zwei Pins, einen mit B und einen mit A ?
Dann brauchst du weder Trigger noch Makro, an den Pins wird immer gesendet und du hast damit immer den aktuellen Wert.

Für den Fall dass du diese beiden Werte zwangsläufig in einer Struktur brauchst, würde ich einen einfachen Filter nachschalten, der beide Werte empfängt und hält.
Dann kannst du mittels eigenen Timer und überschaubaren Codezeilen selbst triggern und kannst dich darauf verlassen, dass alles aktuell ist, Timings eingehalten werden etc.
Sofern das deinen Use Case trifft...

Actions #16

Updated by hidden about 6 years ago

Hallo Florian,

das war die ursprüngliche Idee, jedoch verzögert sich dadurch jedes Sample.
Da wir nicht wissen ob der Wert C anliegt, müssen wir auf B triggern.
Da C auch immer kurz nach B ankommen kann, hab ich die Wahl ob ich das C aus dem letzten Sample nutze und das aktuelle B nehme oder ob ich beides in einen Puffer schreiben und beide Werte „veraltet“ weiterleite.
Ich kann natürlich auch einen Timer nutzen, um kurz nach dem ankommen von B die Struktur zusammenzubauen.
Hatte nur gehofft, dass es bereits ein einfaches Standardvorgehen gibt.

Vielen Dank für die Hilfe.
Ihr könnt das Ticket schließen.

Viele Grüße
Paul

Actions #17

Updated by hidden about 6 years ago

  • Status changed from Customer Feedback Required to To Be Closed
  • Resolution set to Solved Issue
Actions #18

Updated by hidden almost 6 years ago

  • Project changed from 20 to Public Support
  • Private changed from Yes to No
Actions #19

Updated by hidden almost 6 years ago

  • Status changed from To Be Closed to Closed
Actions

Also available in: Atom PDF