Forum: PC-Programmierung COM Server C#


von Alan G. (alangraf)


Lesenswert?

Hallo!
Ist es möglich, mit C# bestimmte Signale im CANalyzer auf dem Grafik 
Fenster beim Start der Konfig-Datei (ebenfalls über C#) anzeigen zu 
lassen, ohne dass man sie manuell einfügt?

Gruß

von Horst (Gast)


Lesenswert?

Mit C#? Nein.

von Alan G. (alangraf)


Lesenswert?

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ß

von Donni D. (Gast)


Lesenswert?

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.

von Ing (Gast)


Lesenswert?

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.

von Besucher (Gast)


Lesenswert?

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.

von Alan G. (alangraf)


Lesenswert?

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.

von Ing (Gast)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

Vector unterstützt C# TestModule etc und eben COM, ausserdem gibt es 
noch die XL Driver, die kannst Du in C# benutzen.

von Alan G. (alangraf)


Lesenswert?

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ß

von Ing (Gast)


Lesenswert?

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

von Alan G. (alangraf)


Lesenswert?

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ß

von Ing (Gast)


Lesenswert?

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

von Ing (Gast)


Lesenswert?

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

von Alan G. (alangraf)


Lesenswert?

> 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ß

von Alan G. (alangraf)


Lesenswert?

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ß

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.