Forum: PC Hard- und Software RBEI BUSMASTER CONVERTER


von An D. (deinbesta)


Lesenswert?

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.

von An D. (deinbesta)


Lesenswert?

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

von Tobias L. (tobylorenz)


Lesenswert?

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

von An D. (deinbesta)


Lesenswert?

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

von An D. (deinbesta)


Lesenswert?

... die letzte Frage hat sich von selbst beantwortet.
Deine Antwort wurde um 04:18 Uhr nachts abgeschickt :-)

von Tobias L. (tobylorenz)


Lesenswert?

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

von An D. (deinbesta)


Lesenswert?

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

von Tobias L. (tobylorenz)


Lesenswert?

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

von An D. (deinbesta)


Lesenswert?

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

von Tobias L. (tobylorenz)


Lesenswert?

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

von An D. (deinbesta)


Lesenswert?

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

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.