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
messageWasserhoehe_aktuellwa
7
messageWasserhoehenwh;
8
9
msTimert;
10
}
11
12
onstart
13
{
14
setTimer(t,100);
15
}
16
17
ontimert
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!
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.
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.
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 :/
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.
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...
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 :/ ?
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.
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
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?
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
:/
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
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
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)