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


von PorPra (Gast)


Angehängte Dateien:

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****
1
includes
2
{
3
}
4
variables
5
{
6
  message Wasserhoehe_aktuell wa
7
  message Wasserhoehen wh;
8
      
9
  msTimer t;
10
}
11
12
on start
13
{
14
  setTimer(t, 100);  
15
}
16
17
on timer t
18
{ 
19
  wh.byte(0) = wa.byte(0);   // HIER LIEGT DAS PROBELM
20
21
  wh.byte(1) = 2 //funktioniert
22
  wh.byte(2) ++; //funktioert
23
  if (wh.byte(2) > 10) {wh.byte(2) = 1;} //funktioniert
24
  
25
  output (wh);
26
27
  setTimer(t, 100);
28
}
************

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 User
von PorPra (Gast)


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)


Lesenswert?

Ich würde das eher mit "on message" machen anstatt mit dem timer

von PorPra (Gast)


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)


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)


Lesenswert?

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

von PorPra (Gast)


Lesenswert?

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

von Pit (Gast)


Lesenswert?

Mir ist das ganze schleierhaft. Wie sendest du überhaupt auf CAN 2? Das 
steht nirgend was drin.
1
on message 0x01
2
   {
3
   wh.DLC = wa.DLC;
4
   wh.BYTE(0) = wa.BYTE(0);
5
   wh.ID = wa.ID;
6
   wh.CAN = 2;
7
   output(wh);
8
   }



Irgendwie so sollte es aussehen.

von PorPra (Gast)


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)


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)


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)


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)


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:

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)


Lesenswert?

PorPra schrieb:
> mit "write" kann man sich nur chars ausgeben lassen...

Quatsch: write ist so gut wie äquivalent zum printf in C. zB:
1
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)


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)


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)


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)


Lesenswert?

Hallo,

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

Gruß

P

von Till X. (till_n)


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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.