AIN in C#

  • hi,
    Hat jemand einen Lösungsvorschlag den Analogwert mit C# einzulesen?(beim NetDCU8)


    Mein Ansatz:


    Dieser funktioniert leider nicht! ("val" läuft mehrmals über!!)
    auch mit ReadByte(), oder anderen Variationen des BinaryReader funktioniert es leider nicht!!


    Ich hoffe es kann mir jemand weiterhelfen!!


    Danke schon im vorraus!!


    Grüße, Mike

  • Quote from "Mike"

    ("val" läuft mehrmals über!!)


    Als was ist val deklariert?


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • Hallo,


    haben Sie auch die Registrierung geprüft? "AIN0:" ist normalerweise nicht die Standardeinstellung! Unter http://fs-net.de/phpBB2/viewtopic.php?t=259 finden Sie ein ganz einfaches Beispiel für C++ und VB. Das sollte sich problemlos nach C# übertragen lassen.

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • Hi,
    "val" ist als "uint" deklariert!
    Der Wert sollte ja nur zwischen 0 und 1024liegen!!
    Deshalb ist ein Überlauf eigenlich unmöglich!!



    ...In C++ funktioniert es ja einwandfrei!!
    Vielleicht arbeiten die zwei Methoden anders!(C++ u. C#)
    Wie schauen die Daten genau aus die eingelesen werden müssen?
    Ich weiß es sind zwei Bytes, aber wie sind diese zu interpretieren?
    Ist das erste Byte das höherwertige??

  • Hallo,


    Mike schrieb:
    ...In C++ funktioniert es ja einwandfrei!!
    Vielleicht arbeiten die zwei Methoden anders!(C++ u. C#)


    Ja , das kann schon sein. Aber das VB Beispiel, das ich oben referenziere muss auch in C# funktionieren. Beides basiert auf .NET!


    Haben Sie das schon getestet?

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • Hallo,
    es funktioniert!!!



    Hab hier nochmal die wichtigsten Zeilen für die Umsetzung in C# angeführt!!



    An dieser Stelle nochmal ein großes Dankeschön an Hr. Zutter u. Hr. Keller!!


    Grüße, Mike

  • Bleibt dennoch die Frage, warum es mit den Bordmitteln von C# nicht funktioniert hat. Ich hätte erwartet, dass diese FileStream- und BinaryReader-Funktionen letztendlich auch auf das CreateFile(), ReadFile() und CloseHandle() zurückgreifen.


    Kann es sein, dass hier vielleicht eine Pufferung stattfindet, der FileStream gleich mal 512 Bytes am Stück einliest und dann der BinaryReader alte Werte aus dem Puffer liest?


    Das würde aber immer noch nicht den Überlauf erklären. OK, der Binary Reader liest Low-Byte-First ein, während die Daten High-Byte-First sind. Aber dennoch müsste so ein Wert am Ende in ein uint passen. Kann es sein dass da bei der Umwandlung von UInt16 nach uint (=UInt32) ein Fehler auftritt? Sie verwenden ja nicht die Funktion Convert.ToUInt32().


    Vielleicht testen Sie Ihren ursprünglichen Ansatz ja nochmal, indem Sie val als UInt16 deklarieren oder die obige Konvertierung dazwischenschieben.


    Mit freundlichen Grüßen,


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • So, hab jetzt nachmal ein paar Varianten durchprobiert!!(mittels FileStream)


    Erfolgreich war ich bei der Umsetzung für das lesen und schreiben der DIO's!!!


    Info: "SetFilePointer" entspricht "fs.Position=port"


    Leider ist es mir noch immer nicht möglich den AIN (ohne dll import )zu realisieren!!!
    Hier liegt das Problem beim zweiten Byte!!!!
    Es ist irrgendwie nicht möglich das zweite Byte einzulesen!!!
    1.Byte müsste stimmen!!(Low-Byte)


    Würd mich ja mit der dll-import Methode zufrieden geben, aber diese Variante dauert komischerweise extrem lange!!!
    max.3 Messungen pro sec!!!
    Mit FileStream hingegen gehts extrem schnell!!!


    Hab alle 80ms(mittels Timer) einen Pin Hi/low schalten lassen.
    mit dll Import: Puls war ca. 500ms lang!!!
    mit FileStream: Puls war exakt 80ms lang!!!!


    Vielleicht habt ihr eine Antort auf dieses Phänomen,
    bzw. noch eine Idee für die Umsetzung mit C# Methoden.


    Grüße,
    Michael

  • Quote from "Mike"

    Leider ist es mir noch immer nicht möglich den AIN (ohne dll import )zu realisieren!!!
    Hier liegt das Problem beim zweiten Byte!!!!
    Es ist irrgendwie nicht möglich das zweite Byte einzulesen!!!
    1.Byte müsste stimmen!!(Low-Byte)


    OK, ich habe mal einen Blick in den Treiber geworfen und das Problem entdeckt. Der C-Treiber arbeitet etwas inkonsistent zur Definition von ReadFile(). Beim AIN-Treiber wird der Count-Value in "Samples" anstatt in Bytes angegeben. Jedes Sample ist aber 2 Bytes. Das heißt wenn man zwei Bytes lesen will (für ein short), dann liefert der Treiber zurück, dass 1 Sample gelesen wurde. Der C#-Treiber interpretiert dies aber in der eigentlichen Art und Weise, dass nur 1 Byte gelesen wurde -- und fällt prompt auf die Schnauze.


    Wir sind gerade am diskutieren, wie man das im Treiber ändern kann, so dass bestehende Applikationen, die die (eigentlich falsche) Interpretation von count benutzen, trotzdem weiter funktionieren.


    Quote

    Würd mich ja mit der dll-import Methode zufrieden geben, aber diese Variante dauert komischerweise extrem lange!!!
    max.3 Messungen pro sec!!!
    Mit FileStream hingegen gehts extrem schnell!!!


    Hab alle 80ms(mittels Timer) einen Pin Hi/low schalten lassen.
    mit dll Import: Puls war ca. 500ms lang!!!
    mit FileStream: Puls war exakt 80ms lang!!!!


    Das finde ich extrem interessant, wobei ich keine so rechte Erklärung dafür habe. Höchstens, dass bei der dll-import-Methode eben die Daten vom Marshaller automatisch von der C#-Struktur im Speicher auf das C-Format umkopiert und dort fixiert werden müssen, dann kommt der Aufruf des C-Treibers und danach müssen die Ergebnisdaten wieder vom C-Format in das C#-Format zurückkopiert werden. Vielleicht ist das so zeitaufwändig. Die C#-internen Varianten (BinaryReader, etc) sind da möglicherweise effizienter.


    Das ist aber nur ein Schuss ins Blaue, keine Ahnung, ob das wirklich der Grund ist. Das müsste man erst noch genauer untersuchen.


    Mit freundlichen Grüßen,


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • hi!
    Hab mich nochmal a bissal mit der FileStream-Klasse beschäftigt!!
    Wie Hr. Keller schon vermutet hat, werden bei dieser FileStream-Klasse Daten zuerst in einen Puffer geschrieben!!
    Aber blöderweise nicht beide Bytes sondern immer nur das 1.Byte!?!?!
    Jetzt hab ich a bissal herumexperimentiert und bin auf folgende Lösung gestoßen:



    Ich hab diesen Puffer auf 2.Byte reduziert,hab FileAccess und FileShare auf Lesen und Schreiben gesetzt.
    ...und siehe da es funktioniert!!!


    Was mir jetzt noch nicht ganz klar ist,...warum schreibt er mir jetzt beide Bytes richtig hinein!!! ... nur weil ich ihn reduziert habe auf 2 Byte????
    Müsste man vermutlich genau nachforschen wie diese Klasse/Methoden aufgebaut ist!?!?!

  • Hallo!


    Um welchen Datentyp der Varaiblen readAIN handelt es sich im Beitrag über diesem? Welchen Wert muss man dieser übergeben?


    ---


    Laut der NetDCU8 Doku können Pin 11 und 12 (AD0 & AD1) als analoge Eingänge benutzt werden. In WinNDCUCfg ist jedoch Pin 12 nicht vorhanden? Wie werden die Pins richtig konfiguriert?


    MfG

  • Hallo,


    ich denke Sie verwechseln etwas!


    1. Die AIN befinden sich nicht am J5 (bei den NetDCUs) sondern am J7 und können z.Z. auch nicht mit WinNDCUCfg (die "DIO Seite" referenziert J5) bearbeitet werden.
    2. Es kann jeweils ein WORD gelesen werden (Wertebereich = 0...1023).
    3. Wie Sie den Treiber ansprechen/konfigurieren finden Sie im "Device Driver" Dokument.

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • stimmt, hatte etwas verdreht.


    bzgl. der .net Lösung,


    bereits bei der Zeile

    Code
    1. FileStream fs = new FileStream("AIN0:", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 2);


    bekomme ich eine IOException (ohne weiterer Bezeichnung)

  • Hallo,
    standardmäßig steht der Index des "AIN" auf "1" in der Registry. Da der Kode von Mike funktioniert vermute ich die Ursache darin. Sie können nun zur Lösung die Registry (Index von "1" nach "0") oder Ihr Programm (Device "AIN0:" nach AIN1:") anpassen.

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • Hallo!


    das Auslesen funktioniert, jedoch erhalte ich sehr willkührliche Daten. Zum Einen erhalte ich oft eine 0 zurück (von 100 Versuchen ca. 50), zudem schwankt der Wert wirklich stark, z.B. bei 1,8 V zwischen 2 und 277. Bei einmaligen Auslesen kommt der Wert umgerechnet in die Spannung der realen Spannung nahe, oder ist null.


    MfG
    all-finder

  • Hallo,

    Quote

    das Auslesen funktioniert, jedoch erhalte ich sehr willkührliche Daten. Zum Einen erhalte ich oft eine 0 zurück (von 100 Versuchen ca. 50), zudem schwankt der Wert wirklich stark, z.B. bei 1,8 V zwischen 2 und 277. Bei einmaligen Auslesen kommt der Wert umgerechnet in die Spannung der realen Spannung nahe, oder ist null.


    ohne weitere Daten ist es schwer zu sagen wo genau der Knackpunk liegt!
    Könnten Sie mir einen Quellkodeauszug und die Registryeinträge in das Forum stellen?

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • Ich konnte mit dem angegebenen FileStream Code die analogen Eingänge auslesen.


    Quote


    So, hab jetzt nachmal ein paar Varianten durchprobiert!!(mittels FileStream)


    Erfolgreich war ich bei der Umsetzung für das lesen und schreiben der DIO's!!!


    Wie ist das gemeint? Ist es möglich mittels FileStream die digitalen Portausgänge zu schalten? Hat jemande entsprechenden Quellcode?


    Gruß Christian

  • Hallo


    Quote

    Wie ist das gemeint? Ist es möglich mittels FileStream die digitalen Portausgänge zu schalten? Hat jemande entsprechenden Quellcode?


    Das Prinzip ist für alle Schnittstellen gleich:
    in der Registry finden Sie unter HKLM\Drivers\BuilitIn\<Schnittstelle> die Werte aus denen der <name> zu bilden ist.
    <name>="Prefix"+"Index"+":" für den DIO also "DIO1:" (Standardregisrty).

    Code
    1. FileStream fs = new FileStream(<name>, FileMode.Open, FileAccess.Read))
    2. fs.Read(...)
    3. ...

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • hallo!


    folgender ausschnitte:



    finde irgendwie den upload für bilder nicht mehr?


    folgendes wird ausgegeben (for schleife die 100 werte abruft):


    0, 0, 0, 0, 121, 0, 123, 15, 0, 175, 0, 132, 0, 92, 148, 26, 101, 0, 0, 0, 165, 0, 5, 0, 0, 66, ....


    bei angelegten 1,8 V, hätte ich diese normalerweise durch ca. 312 geteilt, damit ich die spannung anzeigen kann.


    in der registry ist folgendes unter ANALOGIN
    Index 0
    FriendlyName Analog driver for NetDCU
    Prefix AIN
    Dll ANALOGIN.dll
    Order 151
    Channel 0


    MfG
    all-finder

  • all-finder


    Kleiner Tipp: wenn man statt "quote" den Tag "code" benutzt, dann klappt es auch mit dem Einrücken. Ich habe mir erlaubt, der Übersichtlichkeit wegen den obigen Beitrag entsprechend anzupassen.


    Bilder konnten bei uns meines Wissens noch nie hochgeladen werden.


    Mit freundlichen Grüßen,


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.