CANoe CAPL: Daten einer Massege manipulieren

Gast #4054597
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!
Angehängte Dateien:
Gast #4054614
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.
Gast #4054641
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.
Gast #4054656
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 :/
Gast #4055262
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 :/ ?
Gast #4055298
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.
Gast #4055327
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
Angehängte Dateien:
#4055338
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?
Gast #4089933
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
Gast #4089950
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
#4090663
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren