COM Server C#

OP
Gibt es denn gar keine Möglichkeit, bestimmte Botschaften bzw. Signale 
über C# anzusprechen? Man sagte mir, man kann über die Loggingblöcke 
(u.a. Stichwort LoggingFilter) steuern, welche Signale in ein 
signalorientiertes Format (MDF) geschrieben werden und diese dann extern 
oder mit CANalyzer wieder analysieren.

Weiß aber nicht genau, was damit gemeint ist.

Gruß
Gast
Du kannst mit C# so ziemlich alles machen, nicht immer nativ, dann aber 
mit C++ Code der über C# aufgerufen wird. Aber ich verstehe dein Problem 
einfach nicht. Formulier das einmal etwas genauer.
Gast
Alan G. schrieb:
> Gibt es denn gar keine Möglichkeit, bestimmte Botschaften bzw.
> Signale über C# anzusprechen? Man sagte mir, man kann über die
> Loggingblöcke (u.a. Stichwort LoggingFilter) steuern, welche Signale in
> ein signalorientiertes Format (MDF) geschrieben werden und diese dann
> extern oder mit CANalyzer wieder analysieren.
>
> Weiß aber nicht genau, was damit gemeint ist.
>
> Gruß

Was ist denn genau dein Problem?
Du kannst über C# COM Komponenten ansprechen. Du musst halt die ID der 
Komponente kennen, diese in C# als Klasse nachbilden und das COMVisible 
Attribut drüber setzen. Wenn du jedoch unmanaged Code ansprechen willst 
musst du dich in die P/Invole Technik und Interop Layering Einlesen. Das 
normale Vorgehen wäre hierbei einen Managed C++ Layer zu basteln, der 
den nativen Code wrapped und in C# ansprechbar ist. Wenn du dein problem 
näher ausführst kann ich dir weiterhelfen, hab schon einige COM 
Komponenten über C# angesteuert.
Gast
Ich gehe davon aus, das du dich auf den CANalyzer von Vector Informatik 
beziehst.

Du kannst beim Aufruf des COM die Konfiguration angeben, die du starten 
möchtest. Es gibt dazu eine Appliction Note von Vector.
OP
Ing schrieb:
> Was ist denn genau dein Problem?
> Du kannst über C# COM Komponenten ansprechen. Du musst halt die ID der
> Komponente kennen, diese in C# als Klasse nachbilden und das COMVisible
> Attribut drüber setzen. Wenn du jedoch unmanaged Code ansprechen willst
> musst du dich in die P/Invole Technik und Interop Layering Einlesen. Das
> normale Vorgehen wäre hierbei einen Managed C++ Layer zu basteln, der
> den nativen Code wrapped und in C# ansprechbar ist. Wenn du dein problem
> näher ausführst kann ich dir weiterhelfen, hab schon einige COM
> Komponenten über C# angesteuert.

Danke für die Antwort!
Da ich noch ein frischer Anfänger bin, was CANalyzer angeht, wusste ich 
erstmal nicht, dass mal das Grafik Fenster über die COM-Schnittstelle 
gar nicht ansprchen kann. Die Grundidee war, bestimmte Botschaften (aus 
welcher Quelle auch immer (DBC oder EXCEL)) automatisch (sprich über die 
COM-Schnittstelle) zu messen und den grafischen Verlauf der Signale 
darzustellen. Da ich jedoch das Grafik Fenster von außen gar nicht 
ansprechen kann, dachte ich mir, den Verlauf über Uniplot darzustellen.
Gast
Alan G. schrieb:
> Ing schrieb:
>> Was ist denn genau dein Problem?
>> Du kannst über C# COM Komponenten ansprechen. Du musst halt die ID der
>> Komponente kennen, diese in C# als Klasse nachbilden und das COMVisible
>> Attribut drüber setzen. Wenn du jedoch unmanaged Code ansprechen willst
>> musst du dich in die P/Invole Technik und Interop Layering Einlesen. Das
>> normale Vorgehen wäre hierbei einen Managed C++ Layer zu basteln, der
>> den nativen Code wrapped und in C# ansprechbar ist. Wenn du dein problem
>> näher ausführst kann ich dir weiterhelfen, hab schon einige COM
>> Komponenten über C# angesteuert.
>
> Danke für die Antwort!
> Da ich noch ein frischer Anfänger bin, was CANalyzer angeht, wusste ich
> erstmal nicht, dass mal das Grafik Fenster über die COM-Schnittstelle
> gar nicht ansprchen kann. Die Grundidee war, bestimmte Botschaften (aus
> welcher Quelle auch immer (DBC oder EXCEL)) automatisch (sprich über die
> COM-Schnittstelle) zu messen und den grafischen Verlauf der Signale
> darzustellen. Da ich jedoch das Grafik Fenster von außen gar nicht
> ansprechen kann, dachte ich mir, den Verlauf über Uniplot darzustellen.

Das Grafikfenster an sich ist doch keine COM Komponente oder? Ich 
vermute mal das es einen COM Server gibt denn du ansprechen kannst bzw. 
über welchen du auf die Signale zugreifen kannst. Was du dann brauchst 
wäre die IID von dem COM Server. Wenn du die rausgefunden hast kannst du 
in C# einen COM Klasse Wrapper bauen und damit direkt auf das API des 
Canalyzer COM Servers zugreifen. Wie du so einen Wrapper baust ist hier 
beschrieben: 
https://msdn.microsoft.com/en-us/library/aa645736(v=VS.71).aspx

Falls du noch Fragen hast, immer her damit
OP
Danke für eure Antworten!
Ich hätte mal eine andere Frage. Ich möchte eine Offline Messung am 
CANalyzer durchführen. Die soll ebenfalls über C# (COM-Schnittstelle) 
gehen. Eine Messung wurde an einem Steuergerät durchgeführt und ein 
ASC-File wurde erstell, in dem die Botschaften drin sind bzw. die IDs 
der Botschaften, Länge (in Bytes) usw.
Jetzt möchte ich bestimmte IDs der Botschaften aus der ASC-Datei über C# 
einlesen und die Signale dieser Botschaften messen. Wie geht man am 
besten dabei vor? Mir ist nicht der Code an sich wichtig, da ich das 
Programmieren selbst hinbekomme, sondern die Schritte, wie ich dabei 
vorgehen soll.

Gruß
Gast
Alan G. schrieb:
> Danke für eure Antworten!
> Ich hätte mal eine andere Frage. Ich möchte eine Offline Messung am
> CANalyzer durchführen. Die soll ebenfalls über C# (COM-Schnittstelle)
> gehen. Eine Messung wurde an einem Steuergerät durchgeführt und ein
> ASC-File wurde erstell, in dem die Botschaften drin sind bzw. die IDs
> der Botschaften, Länge (in Bytes) usw.
> Jetzt möchte ich bestimmte IDs der Botschaften aus der ASC-Datei über C#
> einlesen und die Signale dieser Botschaften messen. Wie geht man am
> besten dabei vor? Mir ist nicht der Code an sich wichtig, da ich das
> Programmieren selbst hinbekomme, sondern die Schritte, wie ich dabei
> vorgehen soll.
>
> Gruß

1. Datei einlesen, z.B. mittels StreamReader
2. Mittels RegEx zunächst alle IDs herausfiltern (wird dir als Liste von 
strings zurückgegeben
3. Liste auf die IDs filtern die du haben möchtest (zB über LINQ)

Hoffe das hilft die weiter
OP
Ing schrieb:
> Alan G. schrieb:
>> Danke für eure Antworten!
>> Ich hätte mal eine andere Frage. Ich möchte eine Offline Messung am
>> CANalyzer durchführen. Die soll ebenfalls über C# (COM-Schnittstelle)
>> gehen. Eine Messung wurde an einem Steuergerät durchgeführt und ein
>> ASC-File wurde erstell, in dem die Botschaften drin sind bzw. die IDs
>> der Botschaften, Länge (in Bytes) usw.
>> Jetzt möchte ich bestimmte IDs der Botschaften aus der ASC-Datei über C#
>> einlesen und die Signale dieser Botschaften messen. Wie geht man am
>> besten dabei vor? Mir ist nicht der Code an sich wichtig, da ich das
>> Programmieren selbst hinbekomme, sondern die Schritte, wie ich dabei
>> vorgehen soll.
>>
>> Gruß
>
> 1. Datei einlesen, z.B. mittels StreamReader
> 2. Mittels RegEx zunächst alle IDs herausfiltern (wird dir als Liste von
> strings zurückgegeben
> 3. Liste auf die IDs filtern die du haben möchtest (zB über LINQ)
>
> Hoffe das hilft die weiter

Das hilft mir sehr! Danke dir!
Meine nächste Frage wäre, wenn ich mir beispielsweise eine bestimmte 
Botschaft herausgesucht habe, wie kann ich genau diese eine Botschaft 
messen?

Gruß
Gast
Alan G. schrieb:

> Hoffe das hilft die weiter
>
> Das hilft mir sehr! Danke dir!
> Meine nächste Frage wäre, wenn ich mir beispielsweise eine bestimmte
> Botschaft herausgesucht habe, wie kann ich genau diese eine Botschaft
> messen?
>
> Gruß

Das kommt auf die API des CanAnalyzers an. Da ich die nicht kenne kann 
ich dir nicht sagen wie du die Signale messen kannst. Du kannst ja mal 
die COM Schnittstelle hier posten, sofern sie recht klein ist, evtl. 
Hilft uns das weiter
Gast
Alan G. schrieb:


> Das hilft mir sehr! Danke dir!
> Meine nächste Frage wäre, wenn ich mir beispielsweise eine bestimmte
> Botschaft herausgesucht habe, wie kann ich genau diese eine Botschaft
> messen?
>
> Gruß

So, ich hab mir mal kurz die Mühe gemacht und ins API Manual vom 
Canalyzer geschaut (zu finden unter 
https://vector.com/portal/medien/cmc/application_notes/AN-AND-1-117_CANoe_CANalyzer_as_a_COM_Server.pdf#page2)

Auf Seite 6, Abschnitt 2.3 Accessing Communication Data ist folgendes 
Codebsnippet zum Zugriff auf die Signale zu finden:

The method GetSignal of object Bus can be used to assign the signal to 
the mCANalyzerEngineSpeed variable. Therefore, it is necessary to pass 
the channel number on which the signal is sent, the message name to 
which the signal belongs und the signal name itself as parameters. The 
Bus object itself is accessed with the mCANalyzerApp variable:

CANalyzer.Bus CANalyzerBus = 
(CANalyzer.Bus)mCANalyzerApp.get_Bus("CAN"); mCANalyzerEngineSpeed = 
(CANalyzer.Signal)CANalyzerBus.GetSignal(1, "EngineData",
 "EngineSpeed");

Du musst also den Kanal mitgeben, die Nachricht und den Signalnamen. So 
erfolgt der Zugriff.

Hoffe das hilft
OP
> CANalyzer.Bus CANalyzerBus =
> (CANalyzer.Bus)mCANalyzerApp.get_Bus("CAN"); mCANalyzerEngineSpeed =
> (CANalyzer.Signal)CANalyzerBus.GetSignal(1, "EngineData",
>  "EngineSpeed");
>
> Du musst also den Kanal mitgeben, die Nachricht und den Signalnamen. So
> erfolgt der Zugriff.
>
> Hoffe das hilft

Danke dir für deine Mühe!
Das hatte ich mir auch angeschaut. Jedoch liefert mir die Funktion nur 
den Wert des Signals. Die Frage ist dabei, was dieser überhaupt 
aussaget?

Gruß
OP
Hallo, allerseits!

Im CANalyzer gibt es die "benutzdefinierte" und "systemdefinierte" 
Systemvariablen. Wie man übern COM Server die "systemdefinierte" anlegt, 
ist mir bewusst. Was ist eigentlich mit den "benutzdefinierten"? Wie 
legt man sie an?
Kann mir da vielleicht jemand helfen? Oder wenigstens sagen, ob es so 
möglich ist?

Gruß

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.