Forum: Mikrocontroller und Digitale Elektronik CANoe CAPL: Daten einer Massege manipulieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von PorPra (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Ich habe folgendes Problem: (Ich verwende CANoe VERSION 8.0.87 (SP4) )

Auf CAN 1 sende ich mit einem IG eine 1byte Message im loop(100ms) und 
möchte diese in einem CAPL knoten auslesen (siehe Code) und sie in eine 
8byte Message ins erste byte einfügen und auf CAN 2 weitersenden. (die 
beiden Messages sind in einer db definiert)

Anbei mein Code,sowie ein Screenshot vom Trace der als Ergebnis das 
kopierte erste byte immer mit null anzeigt, obwohl ich es im IG mit 1 
eingestellt habe.

****CODE****
includes
{
}
variables
{
  message Wasserhoehe_aktuell wa
  message Wasserhoehen wh;
      
  msTimer t;
}

on start
{
  setTimer(t, 100);  
}

on timer t
{ 
  wh.byte(0) = wa.byte(0);   // HIER LIEGT DAS PROBELM

  wh.byte(1) = 2 //funktioniert
  wh.byte(2) ++; //funktioert
  if (wh.byte(2) > 10) {wh.byte(2) = 1;} //funktioniert
  
  output (wh);

  setTimer(t, 100);
}
************

Wo liegt mein Fehler? ich bin relativ unerfahren mit CAPL und habe mich 
an das Handbuch gehalten und glaube eigentlich auch, dass das was ich 
machen will, eigentlich sehr einfach sein sollte.

Vielen Dank im Voraus für eure Hilfe!

: Bearbeitet durch Moderator
von PorPra (Gast)


Bewertung
0 lesenswert
nicht lesenswert
EDIT: kleiner Fehler, wie man im Trace sieht, habe ich als Data in der 
message wa auf den Wert "2" nicht "1" im IG loop eingestellt

von Pit (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich würde das eher mit "on message" machen anstatt mit dem timer

von PorPra (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hall Pit, danke für die schnelle Antwort.

Wenn ich es mit On Message mache, wird die message wh nur einmal 
versendet, nicht im loop.
Und der Wert bleibt trotzdem 0. Hast du da eine Idee wieso?

Das verstehe ich zum beispiel auch nicht, weil ja die message wa 
weiterhin im loop vom IG versendet wird.

von PorPra (Gast)


Bewertung
0 lesenswert
nicht lesenswert
EDIT: ich habs jetzt nochmal ganz neu mit "on message gemacht" udn es 
funktioniert im loop, der Wert bleibt jedoch trotzdem auf Null, macht 
also keinen unterschied.

von Pit (Gast)


Bewertung
0 lesenswert
nicht lesenswert
schreibst du vielleicht deine generierte Nachricht mit der gleichen ID 
auf CAN 1 anstelle von CAN 2?

von PorPra (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nein ich glaube nicht.
Das sieht man doch auch im Screenshot unter "Chn" und "Dir"

von Pit (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mir ist das ganze schleierhaft. Wie sendest du überhaupt auf CAN 2? Das 
steht nirgend was drin.
on message 0x01
   {
   wh.DLC = wa.DLC;
   wh.BYTE(0) = wa.BYTE(0);
   wh.ID = wa.ID;
   wh.CAN = 2;
   output(wh);
   }



Irgendwie so sollte es aussehen.

von PorPra (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1. Wieso setzt du die DLC der beiden messages gleich?
wa ist 1byte lang und wh soll 8 byte lang bleiben (die beiden sind in 
einer db definiert)

2.wieso setzt du die ID von wh und wa gleich?
wa hat ID 0x00 und wh hat ID 0x01.

3.nach deinem code wird das "0byte" auch nicht richtig überschrieben :/

von Christopher (Gast)


Bewertung
0 lesenswert
nicht lesenswert
wenn ich mich richtig erinnere gab es doch sowas wie printf oder debug. 
Kannst du den Wert von wa.byte(0) mal anzeigen? Vielleicht stimmt da 
schon was nicht.

von PorPra (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Christopher, habe ich mir auch schon gedacht.
Weißt du wie ich mir den Wert anzeigen lassen kann?
mit "write" kann man sich nur chars ausgeben lassen...

von PorPra (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ist es denn generell möglich mit dem Befehl:
wh.byte(0) = wa.byte(0);
Daten eines Signals einer Message zu kopieren und in das Signal einer 
anderen Message einzusetzen und generell noch weiter zu manipulieren?

Oder gibt es dafür eine andere Vorgehensweise?

Ich wäre sehr dnakbar wenn mir da jemand helfen könnte, sollte doch 
wirklich machbar sein :/ ?

von Pit (Gast)


Bewertung
0 lesenswert
nicht lesenswert
PorPra schrieb:
> 1. Wieso setzt du die DLC der beiden messages gleich?
> wa ist 1byte lang und wh soll 8 byte lang bleiben (die beiden sind in
> einer db definiert)
>
> 2.wieso setzt du die ID von wh und wa gleich?
> wa hat ID 0x00 und wh hat ID 0x01.
>
> 3.nach deinem code wird das "0byte" auch nicht richtig überschrieben :/

Ich schreib dir doch nicht das fertige Script. Ich hab da schnell was 
aus meinem Script kopiert und angepasst. Ein wenig Transferleistung 
solltest du schon schaffen.

Mach doch einen Schritt nach dem anderen. Lies erst die einkommende 
Nachricht und gib sie aus, auf einer GUI oder so. Dann sende eine 
Nacchricht, die du im Script erstellst. Wenn das alles funktioniert 
musst du nur noch Werte aus Nachricht 1 in Nachricht 2 packen.

von PorPra (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir jetzt den Wert wa.byte(0) mit write anzeigen lassen. Und 
der ist Null, was man ja aber auch schon im Trace sieht.

Wenn ich mir wh.byte(0) anzeigen lasse ist der Wert Null, wenn ich mir 
jedoch Wasserhoehen.Wasserhoehe_0_10 anzeigen lasse ist der Wert 
plötzlich 271833944, obwohl das laut db genau das selbe sein sollte 
(siehe Screenshot zu meiner db, da ist Wasserhoehe_0_10 auf byte 0

von Eric B. (beric)


Bewertung
0 lesenswert
nicht lesenswert
PorPra schrieb:
> mit "write" kann man sich nur chars ausgeben lassen...

Quatsch: write ist so gut wie äquivalent zum printf in C. zB:
write("Wasserhoehe ist %d", wh);

[EDIT:]
> Ich habe mir jetzt den Wert wa.byte(0) mit write anzeigen lassen.
> Und der ist Null, was man ja aber auch schon im Trace sieht.

Das heisst dann doch, du empfängst keine Messages, oder?

: Bearbeitet durch User
von PorPra (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Eric, ja das könnte es bedeuten.
Aber woran liegts? Bzw was soll ich ändern?
Ich dachte ich hätte den Versuchsaufbau so einfach wie möglich gehalten 
:/

von Peter (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

im Listing (oben) definierst du zwar ein message object wa, es wird aber 
nicht per on message eingelesen und hat damit nur den "Default-Inhalt"

Wenn ich dich richtig verstanden habe, soll es so funktionieren:

IG generiert wa, Capl-Knoten empfängt die Botschaft und sendet dann 
("ereignisgetriggert" / oder zyklisch) wh.

on message wa
{
 wh.byte(0) = ha.byte(0); ....
 output(wh);
}

wh lässt sich natürlich über einen timer auch zyklisch versenden - dann 
müsstest du nur die Inhalte aus wa, die du weiterverwenden möchtest, in 
der on message function in globale Variablen zwischenspeichern ...

Gruß

P

von Martin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kann man denn überhaupt CAN1 und CAN2 mit dem gleichen CAPL Knoten 
bedienen? Es gibt doch zwei Layouts, eins für CAN1 und eins für CAN2.

Versuch doch mal beim CAN1 ein CAPL Knoten, welcher das Byte in eine 
Umgebungsvariable schreibt.
Dann bei CAN2 ein 'on envvar xxx' und da die Botschaft raussenden

von Peter (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

einem Knoten kann man mehrere Busse zuweisen, dann funktioniert er als 
Gateway.

Gruß

P

von Till X. (till_n)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin,

Peter hat dir schon den entscheidenden Hinweis gegeben. Du musst 
zwischen Datenbasisobjekt der CAN Botschaft und dem Botschaftsobjekt 
unterscheiden.

Du instanzierst nur ein Botschaftsobjekt "wa" des Datenbasisobjekt 
"Wasserhoehe_aktuell". Das ist esrst mal eine leere Botschaft und hat 
nichts mit der Botschaft im Trace gemeinsam, außer, dass beide vom 
gleichen Datenbasisobjekt abstammen.

//alle Nachrichten von diesem Typ, welche auf CAN1 gesendet werden, 
//lösen diesen Ereignishandler aus
on message CAN1::Wasserhoehe_aktuell
{
  //Neues leeres Botschaftsobjekt vom Typ Wasserhoehen erzeugen
  message Wasserhoehen wh;

// Erstes Byte der Botschaft vom Typ Wasserhoehe_aktuell dem neuen 
//Botschaftsobjekt zuweisen

  wh.byte(0) = this.byte(0);

  output(wh); //neues Botschaftsobjekt senden
}

Mit Rechtsklick auf einen Knoten und unter "Konfiguration" kannst du 
einstellen, in welchen Bussen (CAN1, CAN2 usw.) der Knoten aktiv ist. 
(Gateway)

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.