Hallo,
weiß einer wie der RBEI Busmaster Converter richtig funktioniert?
Bei mir scheint er nicht zu funktionieren.
Ich habe alles richtig installiert:
RBEI Busmaster von Bosch V.1.7.2 und
MinGW GCC
Danach habe ich ein kleines CANoe Projekt versucht, ins RBEI Busmaster
zu überführen.
Bei dem Converter habe ich die CANoe .DBC File und die CAPL .CAN files
eingesetzt und konvertiert zu: .dbc->.dbf .can->.cpp
Wenn ich im RBEI BUSMASTER nun alle konvertierten files(.dbf und .cpp)
richtig implementiere und dann aus den .cpp files versuche eine .dll
file zu builden, dann erscheinen da Fehler...
---> Ein nennenswerter Fehler ist der, dass eine ...unions.h file nicht
existiert. Wenn jemand auch diesen Fehler schon gelöst hat, dann wäre es
sehr nett, wenn er mir die Lösung verrät.
---> Ein weiterer markanter Fehler ist der, dass der Capl2CPP Converter
schon bei der Konvertierung der Capl .can files den Fehler ausgibt, dass
er mit den CAPL Funktionen..... getvalue()//////putvalue() ... Probleme
hat und diese nicht umkonvertieren kann.
kennt da jemand eine Lösung? Sei es, z.B. diese Funktionen irgendwie in
CAPL so umzuschreiben, dass der CAPL2CPP Converter damit zurechtkommt.
Vielen Dank für die MÜHEN!
PS: Bei konkreteren Anfragen nach bestimmten Codes werde ich diese zur
Verfügung stellen.
Hallo,
das Problem mit der unions.h Datei habe ich selber gelöst. Dieser Fehler
erscheint dann nicht mehr -sollte man den MinGW-Compiler richtig
installiert haben- wenn man die Datenbank über File->Associate
aktiviert.
Bei mir wurde dann der Fehler, dass eine unions.h Datei fehlt,
ausgemerzt.
Weiterhin besteht das Problem mit den Capl-Funktionen:
getvalue & putvalue
Hi An Dre,
musste mir erstmal einen Account hier besorgen :-)
Die wichtigsten Event-Handler von CAPL referenzieren auf die
Nachrichtennamen. Deswegen ist für die Konvertierung die Datenbank
erforderlich.
Die Konvertierung macht zwei Dinge.
Sie erstellt aus der DBC-Datei eine DBF-Datei und auch eine C-Code
Header Datei (...Union.h). Diese Datei enthält die Beschreibung der
Signale in den jeweiligen Nachrichten, so dass sie im C-Code genutzt
werden können.
Bezüglich GetValue/PutValue. Das Problem ist, dass wir in der Node
Simulation noch nicht sowas, wie ein Signal Interaction Layer haben.
Deswegen gibt es die Funktionen noch nicht und deswegen enthält die
Union-Datei auch nur Raw Values und nicht schon umgerechnete Physical
Values.
Die CAPL-Sprache ist in 1500 DIN A4 Seiten beschrieben. Ungefähr 300
davon sind alleine CAN + allgemeine Funktionen. Wir unterstützten
vielleicht 50 Seiten davon. Aber mit jedem nicht funktionierenden
CAPL-Skript, bauen wir den Support weiter aus. In BUSMASTER v1.6.7 oder
.8 haben wir daher den Compiler von GCC 2.95.3 auf GCC 3 gewechselt, um
auch die objektorientierten Aspekte abdecken zu können.
Über Verbesserungen, insbesondere in Form von Source Code, freuen wir
uns natürlich ;-)
Viele Grüße,
Tobias
Hallo,
vielen großen Dank für die Mühe, die Anmeldung auf µC.net und für die
deutschsprachige Antwort.
Wenn ich das Problem nochmal kurz veranschaulichen darf:
Ich wollte ein kleines Vector CANoe Beispiel, bei dem über zwei Panels
(GUIs) auf dem einen ein Schalter aktiviert/deaktiviert wird und auf dem
anderen ein Lämpchen aufleuchtet, ins RBEI BUSMASTER überführen.
Über die händisch betätigten Panels (GUIs) werden Umgebungsvariablen
gesetzt, sodass bei den beiden CANoe Knoten daraufhin entsprechende
Messages/Botschaften untereinander ausgetauscht werden.
Dabei hat sich nun die Konvertierung der CANoe Knoten in das für RBEI
BUSMASTER taugliche .cpp komplizierter herausgestellt, als zunächst in
meiner Euphorie über den Konverter angenommen.
Ich habe bereits mittels RBEI BUSMASTER und Visual Basic und einer
selbst erstellten GUI es geschafft, den Verbinden/Trennen Butten in
RBEI BUSMASTER zu betätigen.
ZIEL:
Wenn ich es mittels einer selbsterstellten GUI (Graphical User
Interface) in Visual schaffen würde, bestimmte Signale einer Botschaft
zu setzen, diese in den RBEI BUSMASTER Knoten zu empfangen und an andere
Knoten zu schicken, dann wäre ich für mein kleines Projekt schon sehr
zufrieden.
FRAGE:
Wüsstest du eine Alternative zu meinem Problem, sodass ich mein kleines
Projekt in RBEI BUSMASTER verwirklichen könnte. Vielleicht auch eine
Alternative mit Verzicht auf die GUI, jedoch mit Interaction.
Automatisierte Prozesse möchte ich zunächst vernachlässigen.
STATUS:
Leider bin ich noch ein Laie in C++ und bin dabei, dies zu erlernen.
Dass Ihr noch keinen Interaction Layer habt, sagt mir zunächst nichts.
Hört sich jedoch für mich negativ an:-(
Und Raw Value und Physical Values sagen mir auch noch nichts :-(
Ich hoffe ich finds noch demnächst heraus.
Mein persönlicher kleiner Erfolg ist, dass ich es geschafft habe, die
Warnmeldung:
warning: malformed '#pragma pack(pop[, id])' - ignored [-Wpragmas]
... zu lösen. (Werde ich vielleicht demnächst noch hier irgendwann
posten)
FRAGE:
Naja, wie dem auch sei. Bedeutet es, dass aufgrund des Fehlens eines
Interaction Layers und der Raw und Physical Values in der ...Unions.h
Header Datei, dass ich persönlich es nicht hinkriegen würde, dieses
kleine Beispiel zu verwirklichen?
Oder brauche ich nur der erstellten ...Unions.h Header Datei und in den
beiden aus CAPL-Knoten erstellten CPP.files nur etwas händisch
hinzuzufügen , um es zu verwirklichen?
Über kleine Hinweise oder ein kleines Minimal-Beispiel wäre ich wirklich
sehr dankbar, weil es ein größeren Projekt eventuell zum Laufen bringen
würde.
Andere Frage:
Du bist jetzt aber nicht in Indien? Damit ich die Zeitumrechnung für das
Warten auf mögliche Antworten nicht weiter berücksichtigen brauche.
Viele Grüße,
Andreas
Hi Andreas,
bin diesmal sogar noch etwas östlicher Unterwegs: Japan mit +8h
Zeitdifferenz nach Deutschland. War also nicht 04:18, sondern schon
12:18 hier :-)
Zu den Raw/Physical Values:
Normalerweise steht in einer CAN-Datenbank drin, wie die Signale in den
Nachrichten verteilt sind, und wie sie umgerechnet werden. Sprich,
häufig werden Signale mit irgendeinem Offset + Faktor linear
umgerechnet, um einerseits die begrenzten Platzverhältnisse in einer
CAN-Nachricht optimal zu nutzen, und dennoch den benötigten Wertebereich
zu schaffen. Was real übertragen wird, nennt sich Raw Value. Umgerechnet
in z.B. SI-Einheiten, ergibt sich der Physical Value.
physicalValue = (rawValue * factor) + offset
bzw.
rawValue = (physicalValue - offset) / factor
Zum Signal Interaction Layer:
In der Datenbank findet sich außerdem häufig das Sendeverhalten, z.B.
wird eine Nachricht zyklisch ausgesendet, oder immer wenn die Signale
neu gesetzt werden, oder nur wenn sich deren Werte geändert haben. Als
das wird im Signal Interaction Layer normalerweise abstrahiert. Du
tauschst oben Physical Values mittels GetValue/PutValue aus und unten
wird die gesamte CAN-Nachrichtenkommunikation automatisch abgewickelt.
Ja und eben das fehlt leider bisher noch. Insofern wird das wohl auch
das Hauptproblem bei der Konvertierung sein und dir ein manuelles Coden
nicht ersparen...
Du kannst dennoch direkt auf der Nachrichtenebene arbeiten, sprich
CAN-Nachrichten empfangen und senden. Du arbeitest dann halt mit Raw
Values, musst also derzeit in deinem Programm die Umrechnung in Physical
Values vornehmen.
Wenn es ohne GUI auch geht, kannst du auch das Tx Message Fenster
benutzen. Das hat den Vorteil, dass man recht simpel Aussendungen auf
Timer oder Tasten legen kann und man die Signale dann mit Physical
Values richtig einstellen kann. Da steckt ein rudimentäres Signal
Interaction Layer quasi schon drin. Rudimentär, weil das Zeitverhalten
nicht aus der Datenbank kommt.
Was noch? Die Unions-Datei kann auch erzeugt werden, wenn du die
Datenbank importierst (.h Datei wird erzeugt) und assozierst (wird als
Header-Datei dann eingebunden).
Mal sehen, ich habe irgendwo ein kleines Beispielsprogramm, wie man
Nachrichten durch einen Gateway leitet und dabei eine Signalmanipulation
vornimmt. Das ist der Signal Routing & Manipulation Use Case. Wenn ich
es finde, poste ich es hier morgen noch.
Viele Grüße aus Yokohama,
Tobias
Wow, vielen Dank für die seeehr ausführlichen Erklärungen und Hinweise
;-)
Leider ist es so, dass ich als Student mich erstmal eine Woche
anderweitig beschäftigen muss (Klausurenphase:-/) und dementsprechend
mich damit erstmal nicht weiter auseinander setzen kann bis zum nächsten
Mittwoch.
Danach werde ich mich wieder dem spannenden Thema und vor allem deinen
Hinweisen widmen und hoffe, dass ich damit dann mehr anfangen kann.
Bis dahin wäre es schön, wenn auch das von dir vorgeschlagene
Minimal-Beispiel geuploaded ist.
Ich bedanke mich nochmals und melde mich bestimmt bald wieder;)
Viele Grüße und viel Spass in Yokohama,
Andreas
Hi Andreas,
ich bin wieder zurück aus Japan.
Hier ist das versprochene Beispiel. Es schickt alle Nachrichten von
einem Kanal zum anderen und manipuliert dabei gezielt ein Signal.
1
void OnMsg_All(STCAN_MSG RxMsg)
2
{
3
/* Messages from channel 1 to channel 2 */
4
if (RxMsg.m_ucChannel == 1) {
5
6
/* Manipulate messages with id 0x100 */
7
if (RxMsg.m_unMsgID == 0x100) {
8
/* Signal manipulation goes here ... */
9
}
10
11
/* Prepare to send it on channel 2 */
12
RxMsg.m_ucChannel = 2;
13
}
14
15
/* Message from channel 2 to channel 1 */
16
else {
17
/* Prepare to send it on channel 1 */
18
RxMsg.m_ucChannel = 1;
19
}
20
21
/* Send message */
22
SendMsg(RxMsg);
23
}
Viel Erfolg bei deinen Klausuren!
Viele Grüße,
Tobias
Hallo Tobias,
bin wieder am werkeln mit RBEI BUSMASTER.
Ich glaube ich habe deine Tipps verstanden.
Blos mein Problem war es nicht, Signale von einem Kanal auf ein anderes
zu schicken und dabei bestimmte Signale zu manipulieren, sondern
1)ein Signal von Visual Basic aus zu Busmaster zu schicken und
2)ein Signal wieder von RBEI BUSMASTER zu Visual Basic zurück zu
schicken.
Prinzipfrage:
In Visual Basic muss man, um eine Kommunikation zu Busmaster
herzustellen, unter Projekt->Verweis->Com->CAN_MonitorApp eine
Schnittstelle CAN_MonitorApp angeben.
Wenn ich ein Signal aus einer Visual Basic Anwendung heraus mit...
Dim gBUSMASTERApp As CAN_MonitorApp.Application
gBUSMASTERApp = New CAN_MonitorApp.Application
gBUSMASTERApp.Connect(1)
... im Busmaster gesetzt habe und anschließend dessen Wertänderung in
der Visual Basic Anwendung (GUI) empfangen möchte, muss ich da im
BUSMASTER nicht auch so eine Schnittstelle angeben?
Ist es prinzipiell möglich Werte aus RBEI BUSMASTER in Visual Basic zu
empfangen?
Viele Grüße,
Andreas
Hallo Andreas,
sorry, dass meine Antwort etwas lange gedauert hat.
Seit der letzten Version 1.7.3 veröffentlichen wir auch Examples-Codes.
Das erste seiner Art zeigt, wie man mit aus einem C-Programm das
COM-Interface für die Fernsteuerung nutzt. Evtl. kannst du das auf
Visual Basic übertragen.
Ohne jetzt im Detail drin zu stecken... Es gibt eine Callback-Funktion
für empfangene CAN-Frames. Die sollte von Visual Basic aus nutzbar sein.
Das herausholen der Signale aus den Frames müsste dann wieder im eigenen
Code erfolgen, weil wir eben diese Schnittstelle noch nicht anbieten.
Ansonsten bin ich leider relativ blank, was Visual Basic angeht.
BUSMASTER ist mein erstes Windows-Projekt ;-)
Viele Grüße,
Tobias
Hallo Tobias,
schön wieder von dir zu hören:)
Ich arbeite zur Zeit mit Visual Studio C++ 2012 Express.
Damit bin ich bisher wunderbar zurecht gekommen (bin da als Laie sehr
stolz drauf). Vorallem gefällt mir bei dieser Version der WindowsForms
Editor, womit ich Buttons etc. per drag and drop kinderleicht anordnen
kann.
Bisher habe ich es auch geschafft, alles mögliche an BUSMASTER zu
senden. Nur fehlt mir eben noch die Möglichkeit mit Visual Studio 2012
Express C++/CLI, das Datenfeld einer Botschaft auszulesen.
Das Example aus der Version 1.7.3 gefällt mir sehr gut und das Beispiel
läuft relativ stabil und zufriedenstellend.
-Gut finde ich an dem Beispiel, dass das Datenfeld ausgelesen wird.
-Jedoch fehlt mir hier der Windows Forms Editor.
-Das Beispiel ist auch leider in MFC geschrieben und leider besitzt
nicht jedermann eine Visual Studio Version mit MFC.
Du sprichst von einer "Callback-Funktion". Gibt es eine Möglichkeit mit
Visual Studio 2012 C++/CLI Express so eine "Callback-Funktion"
einzurichten?
Könntest du eventuell ein Prinzip Beispiel mit Visual Studio 2012
C++/CLI Express einrichten, das einfach ein Button besitzt, wo man drauf
klickt und das Datenfeld angezeigt wird auf einem Textfeld?
Wäre damit sehr zufrieden und würde in meinem Projekt um einiges
vorankommen.
Ansonsten müsste ich mich in MFC einlesen:-(
Denke mal, dass da die MFC Funktionen "CDialog" und "DoDataExchange"
verantwortlich sind, dass das Datenfeld gelesen werden kann.
Auch müsste ich mich in MFC einlernen, wie man Buttons etc. anordnet
°finde ich noch etwas schwierig°
Frage:
-Wird in naher Zukunft vielleicht das Com Interface um eine
Funktion/Befehl erweitert, womit man das Datenfeld "auslesen" kann?
So wie es bisher die Busmaster "schreibenden" Funktionen/Befehle gibt,
Viele Grüße,
Andreas
Eine eigene Frage?
Dieser Thread ist über 13 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.