Forum: PC-Programmierung EMIS USB-Interface iSMIF


von SaKiDi (Gast)


Lesenswert?

Hallo,

ich versuche gerade eine CNC-Steuerung für Schrittmotoren zu 
programmieren mit Hilfe des EMIS USB-Interface.
Hat jemand von euch Erfahrung bzgl beschreiben und auslesen des 
Interface über eine serielle Schnittstelle in C#?

Grüße

von Arc N. (arc)


Lesenswert?

SaKiDi schrieb:
> Hallo,
>
> ich versuche gerade eine CNC-Steuerung für Schrittmotoren zu
> programmieren mit Hilfe des EMIS USB-Interface.
> Hat jemand von euch Erfahrung bzgl beschreiben und auslesen des
> Interface über eine serielle Schnittstelle in C#?
>
> Grüße

Mal auf der Homepage des Herstellers geschaut? 
https://emisgmbh.de/downloads/
USB->Seriell scheint von FTDI zu kommen, d.h. die können wie ganz 
normale serielle Schnittstellen angesprochen werden (Klasse SerialPort 
in System.IO.Ports). Zudem gibt's auf 
https://emisgmbh.de/downloads-software/  noch eine DLL, die mit P/Invoke 
in C# eingebunden werden könnte.

von SaKiDi (Gast)


Lesenswert?

Hallo Arc N.,

Danke für deine Information.
Ich werde es versuchen und hoffe, dass ich dann eine erfolgreiche 
Kommunikation zwischen INterface und Software herstellen kann

Grüße

von SaKiDi (Gast)


Lesenswert?

Hallo Arc N.,

ich habe versucht die DLL-Datei mit einzubinden, jedoch war die 
erfolglos, da VS immer einen Error anzeigt...

Es konnte kein Verweis auf "... .dll" hinzugefügt werden.
Stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass 
sie eine gültige Assembly oder COM-Komponente ist.

Leider bin ich mit meinem Problem somit nicht weiter gekommen.

Hat jemand noch eine Idee oder einen Hinweis?

Grüße

von Arc N. (arc)


Lesenswert?

SaKiDi schrieb:
> Hallo Arc N.,
>
> ich habe versucht die DLL-Datei mit einzubinden, jedoch war die
> erfolglos, da VS immer einen Error anzeigt...
>
> Es konnte kein Verweis auf "... .dll" hinzugefügt werden.
> Stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass
> sie eine gültige Assembly oder COM-Komponente ist.
>
> Leider bin ich mit meinem Problem somit nicht weiter gekommen.
>
> Hat jemand noch eine Idee oder einen Hinweis?
>
> Grüße

Die DLL nicht als Verweis zum Projekt hinzufügen, dass funktioniert, wie 
die Fehlermeldung schon sagt, bei .NET nur für .NET-Assemblies/DLLs oder 
COM-Komponenten. Bei nativen DLLs reicht es, wenn diese im Suchpfad (der 
Anwendung) liegen. Einbindung, wenn es bspw. die emis_com.dll ist, dann 
bspw. so:
1
[DllImport("emis_com.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
2
[return: MarshalAs(UnmanagedType.Bool)]
3
public static extern bool Oeffne_Schnittstelle(int iSerComNr);
4
5
// danach kann die Funktion ganz normal aufgerufen werden z.B.
6
bool open = Oeffne_Schnittstelle(1);

von SaKiDi (Gast)


Lesenswert?

Danke für deine Rückmeldung.

Leider bin ich bei dem Thema DLL-Dateien noch sehr unerfahren.
Ich habe leider keine Ahnung wie ich die Befehle in das char schreibe 
und wie das alles in meine Funktion eingebunden wird.

von Arc N. (arc)


Lesenswert?

SaKiDi schrieb:
> Danke für deine Rückmeldung.
>
> Leider bin ich bei dem Thema DLL-Dateien noch sehr unerfahren.
> Ich habe leider keine Ahnung wie ich die Befehle in das char schreibe
> und wie das alles in meine Funktion eingebunden wird.

Die "komplizierteren" DLL-Funktionen dürften
1
        // extern "C" __declspec(dllexport) void _stdcall SendBefehl(char* befstr, int endekenn);
2
        [DllImport("emis_com.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
3
        public static extern void SendBefehl(
4
            [MarshalAs(UnmanagedType.LPStr)]
5
            string befstr, // string sollte hier reichen außer die DLL schreibt in den String, dann StringBuilder nehmen
6
            int endekenn);
7
8
        // extern "C" __declspec (dllexport) long _stdcall GetRueckgabe(char* sRueckgabe, long lRueckgabe);
9
        [DllImport("emis_com.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
10
        public static extern long GetRueckgabe(
11
            [MarshalAs(UnmanagedType.LPStr)]
12
            StringBuilder sRueckgabe, // siehe oben
13
            int lRueckgabe); // int statt long, da long in C# 64-Bit hat
sein.
Wenn das wirklich nur einfache FTDI-COM-Ports sind, sollte eigentlich 
SerialPort reichen (Encoding auf Encoding.GetEncoding(28591) setzen, 
ergibt 8-Bit ASCII (ISO 8859-1 Latin 1; Western European (ISO)) und die 
Befehle wie dokumentiert senden. Zur Not mit bspw. 
https://docs.microsoft.com/en-us/sysinternals/downloads/portmon 
mitschneiden was da gesendet wird.

von sakidi (Gast)


Lesenswert?

Danke für deine Ausführliche Antwort

> Wenn das wirklich nur einfache FTDI-COM-Ports sind, sollte eigentlich
> SerialPort reichen (Encoding auf Encoding.GetEncoding(28591) setzen,
> ergibt 8-Bit ASCII (ISO 8859-1 Latin 1; Western European (ISO)) und die
> Befehle wie dokumentiert senden

Die DLL konnte ich dank deiner Hilfe jetzt komplett einbinden.
leider ist mir die Funktion mit dem serialPort noch unklar...
Sollte dies ungefähr so aussehen ?

 public bool Open()
        {
            openport = Oeffne_Schnittstelle(1);

            SerialPort serialport = new SerialPort();
            serialport.BaudRate = 115200;
            serialport.DataBits = 8;
            serialport.Parity = Parity.None;
            serialport.StopBits = StopBits.One;
            serialport.Encoding = 
System.Text.Encoding.GetEncoding(28591);

            if (serialport.IsOpen == true)
            {
                return true;
            }
            else
            {
                return false;
            }
        }


Die weiteren DLL Funktionen können ihre zugewiesenen Variablen über eine 
Methode erhalten, richtig?

Dankeschön

von Arc N. (arc)


Lesenswert?

sakidi schrieb:
> Danke für deine Ausführliche Antwort
>
>> Wenn das wirklich nur einfache FTDI-COM-Ports sind, sollte eigentlich
>> SerialPort reichen (Encoding auf Encoding.GetEncoding(28591) setzen,
>> ergibt 8-Bit ASCII (ISO 8859-1 Latin 1; Western European (ISO)) und die
>> Befehle wie dokumentiert senden
>
> Die DLL konnte ich dank deiner Hilfe jetzt komplett einbinden.
> leider ist mir die Funktion mit dem serialPort noch unklar...
> Sollte dies ungefähr so aussehen ?

War vielleicht etwas missverständlich: Entweder mit der emis_com.dll 
arbeiten oder mit der Klasse SerialPort. Nicht beide zusammen.

> Die weiteren DLL Funktionen können ihre zugewiesenen Variablen über eine
> Methode erhalten, richtig?

? Wenn damit die Argumente der Funktionen (tatsächlichen Parameter) 
gemeint sind, ja.

von sakidi (Gast)


Lesenswert?

Hallo arc,

noch einmal vielen Dank für deine Unterstützung.

Grüße

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.