Goedeavond

Ik heb een velleman v140 USB interface bordje. Ik wil in C# software schrijven die dit bordje aanstuurt.

Ik heb al veel info gevonden, ook op dit forum maar toch zit ik met een probleem.

Om te beginnen moet ik het dll bestand toevoegen, ik doe dit door:


[DllImport("K8061.dll")]
        private static extern int OpenDevice(int CardAddress);

private void Form1_Load(object sender, EventArgs e)
        {
            if (OpenDevice(0) > 1)
            {
                MessageBox.Show("succes");
            }
            else
            {
                MessageBox.Show("error");
            }

        }


Maar ik krijg een did not found exception.

-gebruik ik de juiste DLL? Kan hier niet aan liggen, want dan kreeg ik geen dit not found melding
- Ik heb het dll bestand in mijn projectmap geplaatst

Waar kan dit nog aan liggen?

zit hij in je System32 folder?

Yep, dat had ik hier ook ergens voorbij zien komen...

Maar niet iedereen vindt dat een goed idee precies?

*edit*

Als ik een dll aanroep die niet bestaat, krijg ik geen didnotfound error :)

[Bericht gewijzigd door LJ Chris op (29%)]

hoezo is het toevoegen van de DLL aan je system32 folder geen goed idee?
dat is de standaard plek zo ongeveer.

Ofwel moet je een reference doen naar waar de dll staat.

overgens is je import wel goed.
proberen zoals in het dit topic: http://www.circuitsonline.net/forum/view/46314/1

[Bericht gewijzigd door timmie op (12%)]

Je kunt DLL's ook in dezelfde directory als de .exe zetten (bin/debug en bin/release). References zijn alleen voor .NET DLLs (voor zover ik weet).

je kan K8055D meegeven als reference de pest is echter wel dat het geen DotNet liberary is dus moet je nog alles gaan importeren(net getest).

/edit:
heb de verkeerde lib zitten testen(had de K8061 dll moeten zijn).

[Bericht gewijzigd door timmie op (21%)]

Ik heb ondertussen de k8055 gebruikt op voorgaande manier, dat geeft geen error.

Na lang googlen was het een compabiliteitsprobleem.

Nu hopen dat ik alles aan het werken krijg :)

Bedankt voor de reactie!

De K8055 is toch een ander type dan de VM140?

Ik kan geen connectie maken..

de K8055 is een andere ja
de VM110 is een opgebouwde versie

de K8061 en vm140 zijn ook de zelfde.

Ik geloof dat het ook te maken heeft met de verschillende lengtes van int's, booleand,longs etc etc.

zoals bij het aanroepen van het versie nummer van de dll wordt het in het voorbeeld in VB zo gedaan :

Private Declare Sub ReadVersion Lib "k8061.dll" (ByVal CardAddress As Long, Buffer As Long)

Wordt als "Long" in dll gebruikt en ook als "Long" opgevraagd, maar bijvoorbeeld

Private Declare Function Connected Lib "k8061.dll" (ByVal CardAddress As Long) As Boolean

hier wordt een long omgezet naar een boolean.
Daar moet je dus even goed naar kijken welke functie je gebruikt.

Er staat trouwens ook hier : http://msdn.microsoft.com/en-us/magazine/cc164123.aspx goed voorbeeld over het gebruik van het aanroepen van DLL's

[Bericht gewijzigd door D-Force op (11%)]

D-Force wel opletten er wordt helemaal nix omgezet.
de eerste is een sub(dus een functie zonder return).
de 2e is een functie die een parameter meekrijgt van het type Long en een return waarde terug geeft van het type boolean.

overgens maakt het in DotNet talen niet meer uit wat de declare is het zijn unified type's dus de type's zijn in alle talen het zelfde.

gebuik in VB een Char dan kan ik dat in VC# ook.
zelfde voor Int, long, single, double, decimal, string, byte, boolean, date, object, short. Signed en unsigned kan ook allemaal uitgewisseld worden.

In VS2010 willen ze daar nog een stap verder in gaan en directe syntax over te nemen uit andere talen

/edit:
er wordt een integer terug gegeven van de functie OpenDevice()

die integer laat ofwel zien: welke kaart(en) er aangesloten zijn. ofwel welke error er aanwezig is.
dat ding neemt geen parameters mee.
zie windows vista pack 2007

/edit 2:
even de vb listing er bij gehaald



    Private Declare Function OpenDevice Lib "k8061.dll" () As Integer
    Private Declare Sub CloseDevices Lib "k8061.dll" ()
    Private Declare Function ReadAnalogChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer) As Integer
    Private Declare Function PowerGood Lib "k8061.dll" (ByVal intCardNumber As Integer) As Boolean
    Private Declare Function Connected Lib "k8061.dll" (ByVal intCardNumber As Integer) As Boolean
    Private Declare Sub ReadVersion Lib "k8061.dll" (ByVal intCardNumber As Integer, ByRef Buffer As Integer)
    Private Declare Sub ReadAllAnalog Lib "k8061.dll" (ByVal intCardNumber As Integer, ByRef Buffer As Integer)
    Private Declare Sub OutputAnalogChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer, ByVal Data As Integer)
    Private Declare Sub OutputAllAnalog Lib "k8061.dll" (ByVal intCardNumber As Integer, ByRef Buffer As Integer)
    Private Declare Sub ClearAnalogChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer)
    Private Declare Sub SetAllAnalog Lib "k8061.dll" (ByVal intCardNumber As Integer)
    Private Declare Sub ClearAllAnalog Lib "k8061.dll" (ByVal intCardNumber As Integer)
    Private Declare Sub SetAnalogChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer)
    Private Declare Sub OutputAllDigital Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Data As Integer)
    Private Declare Sub ClearDigitalChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer)
    Private Declare Sub ClearAllDigital Lib "k8061.dll" (ByVal intCardNumber As Integer)
    Private Declare Sub SetDigitalChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer)
    Private Declare Sub SetAllDigital Lib "k8061.dll" (ByVal intCardNumber As Integer)
    Private Declare Function ReadDigitalChannel Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Channel As Integer) As Boolean
    Private Declare Function ReadAllDigital Lib "k8061.dll" (ByVal intCardNumber As Integer) As Integer
    Private Declare Sub OutputPWM Lib "k8061.dll" (ByVal intCardNumber As Integer, ByVal Data As Integer)
    Private Declare Sub Version Lib "k8061.dll" ()

Ik weet dat het niet helemaal hier thuis hoort, maar weet iemand hoe je een pointer naar een struct meegeeft in C#?
Ik was gisteren de hele avond al aan het knoeien maar krijg het niet voor mekaar.

de functie aanroep is NCTYPE_STATUS ncRead(
NCTYPE_OBJH ObjHandle,
NCTYPE_UINT32 DataSize,
NCTYPE_ANY_P DataPtr);

waarbij de DataPtr een pointer naar een struct is volgens:


        [StructLayout(LayoutKind.Sequential)]
        public struct canFrames
        {
            public byte FrameType;
            public UInt32 ArbitrationId;
            public System.Runtime.InteropServices.ComTypes.FILETIME Timestamp;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
            public Byte[] Data;
            public Byte DataLenght;
        }

Dll aanroep:


        [DllImport("nican.dll")]
        public static extern unsafe UInt32 ncRead(UInt32 objHandle, UInt32 dataSize, out DataPtr);

Functie aanroep:


CAN.canFrames CanData = new CAN.canFrames();
ReturnCan = CAN.ncRead(handle, 8, CAN.canFrames);

Voordat iemand zegt dat het meer iets is voor tweakers, daar heb ik het ook al gevraagt, en het is voor het aansturen van een eigengemaakte print met een CAN Adapter van NI die dus nog niet werkt...

Volgens mij gewoon out of ref meegeven aan de parameter, maar dat moet bij de aanroep ook anders krijg je (overigens vrij duidelijke compile error).
CAN.ncRead(handle, 8, out CAN.canFrames)

edit:
Zie nog iets, je geeft de structure definitie mee aan de functie (CAN.canFrames, beter CanFrames trouwens in de .NET naam conventie, nu lijkt het een variabele ofzo). Bedoel je niet '(out) CanData' mee te geven (en deze naam weer beginnen met een kleine letter, juist om dit soort fouten te voorkomen)?

[Bericht gewijzigd door madwizard op (45%)]