Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Libnodave getXXXfrom()

  1. #1
    Registriert seit
    14.05.2010
    Beiträge
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich hab Mal wieder ein Problem mit Libnodave.

    Ich wollte die getS32from(buf) benutzen, um einen DINT aus einem DB zu lesen, jedoch ist die Funktion im Wrapper nicht implementiert.

    Mein Aufruf:
    Private Declare Function daveGetS32from Lib "libnodave.dll" (ByRef buffer as Byte) as Integer

    Variable= daveGetS32from(buf)

    Fehler:
    die funktion konnte in der dll nicht gefunden werden.

    Vielleicht ist der Aufruf falsch.

    Wäre schön wenn jemand etwas weiß!

    VB.net
    Libnodave 0.8.4.5

    MfG

    Olli
    Zitieren Zitieren Libnodave getXXXfrom()  

  2. #2
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.759
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    ich hab in meiner LibNoDave Connection Library eine erweiterte version des Wrappers mit mehr Funktionen....

    siehe hier: http://www.sps-forum.de/showthread.php?t=36363

    Kannst aber auch gleich die Connection Library verwenden...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren So..  

  3. #3
    Olli0285 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.05.2010
    Beiträge
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Jochen,

    wie alt ist denn der Wrapper? ich hab letzte Woche deine aktuelleste Version runtergeladen! Ich weiß nur nicht wie man die fehlenden funktion von Libnodave in das VB Projekt implementiert.
    Ich lese in einem Sub vier Buffer Arrays aus und ich weiß nicht ob dann die Zeigerfunktion mit getS32at(buf) das richtige array benutzt. Ich poste gerne Mal den ganzen Code wenn es hilft. Mit der Bitabfrage funktioniert alles.

    Das Problem ist das ich aus den Bytes keinen 4Byte langen Integer kriege. Das Auslesen in den Buffer funktioniert problemlos

    Ich denke es hängt am:

    Privat Function........

    Ich weiß es aber nicht!

    MfG

    Olli
    Geändert von Olli0285 (02.06.2010 um 00:25 Uhr)

  4. #4
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.759
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von Olli0285 Beitrag anzeigen
    Hallo Jochen,

    wie alt ist denn der Wrapper? ich hab letzte Woche deine aktuelleste Version runtergeladen! Ich weiß nur nicht wie man die fehlenden funktion von Libnodave in das VB Projekt implementiert.
    Ich lese in einem Sub vier Buffer Arrays aus und ich weiß nicht ob dann die Zeigerfunktion mit getS32at(buf) das richtige array benutzt. Ich poste gerne Mal den ganzen Code wenn es hilft. Mit der Bitabfrage funktioniert alles.

    Das Problem ist das ich aus den Bytes keinen 4Byte langen Integer kriege. Das Auslesen in den Buffer funktioniert problemlos

    Ich denke es hängt am:

    Privat Function........

    Ich weiß es aber nicht!

    MfG

    Olli
    JO poste mal Code....

    Aber wie gesagt mit meiner Connection Lib kannst du mehrer Variablen einfach in ein Array Packen und dann einfach alle auf einmal lesen lassen.

    Bsp:

    Code:
    private List<LibNoDaveValue> myValues = new List<LibNoDaveValue>();
    
    myValues.Add(new LibNoDaveValue
                                       {
                                           LibNoDaveDataSource = LibNoDaveDataSource.Datablock,
                                           ByteAddress = 10 ,
                                           BitAddress = 0,
                                           DatablockNumber = 1,
                                           ArraySize = 0,
                                           LibNoDaveDataType = LibNoDaveDataType.Dword
                                       });
    myValues = myConn.ReadValues(myValues);
    Und schon sind alle Werte in der myValues Liste gelesen (hier nur db1.dbd10)
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  5. #5
    Olli0285 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.05.2010
    Beiträge
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Mein Code:

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    Dim bufi(2) As Byte 'buffer inputs
    Dim bufo(0) As Byte 'buffer outputs
    Dim buff(0) As Byte 'buffer merker^^^^
    Dim bufdb(21) As Byte 'buffer DB
    Dim a123 As Integer

    dc.readBytes(daveInputs, 0, 0, 3, bufi) 'Eingänge laden
    dc.readBytes(daveOutputs, 0, 0, 1, bufo) 'Ausgänge laden
    dc.readBytes(daveFlags, 0, 0, 1, buff) 'Merker laden
    dc.readBytes(daveDB, 10, 0, 21, bufdb) 'Datenbaustein laden

    If bufi(0) And 64 Then 'E0.6
    PStanzeOben.Location = New Point(446, 259)
    Else : PStanzeOben.Location = New Point(446, 274)
    End If
    If bufi(0) And 128 Then 'E0.7
    PKlemmehi.Location = New Point(PBoxVorschub.Location.X, PKlemmehi.Location.Y)
    PBoxVorschub.Location = New Point(225, 291)
    ElseIf bufi(1) And 1 Then 'E1.0
    PKlemmehi.Location = New Point(PBoxVorschub.Location.X, PKlemmehi.Location.Y)
    PBoxVorschub.Location = New Point(158, 291)
    End If
    If bufi(1) And 2 Then 'E1.1
    PBand1.Visible = True
    PBand2.Visible = True
    Else
    PBand1.Visible = False
    PBand2.Visible = False
    End If
    If bufi(1) And 4 Then 'E1.2
    LblSiKe.Visible = False
    Else
    LblSiKe.Visible = True
    End If
    If bufi(2) And 16 Then 'E2.4 Autobetrieb
    LblGruSte.ForeColor = Color.LightGray
    LblAuto.BackColor = Color.Lime
    LblEinr.BackColor = Color.Gray
    LblAutoStart.ForeColor = Color.Black
    LblEinzel.ForeColor = Color.LightGray
    LblAutoStop.ForeColor = Color.Black
    ElseIf bufi(2) And 32 Then 'E2.5 Einrichtbetrieb
    LblAuto.BackColor = Color.Gray
    LblEinr.BackColor = Color.Lime
    LblEinzel.ForeColor = Color.Black
    LblAutoStart.ForeColor = Color.LightGray
    LblAutoStop.ForeColor = Color.LightGray
    LblGruSte.ForeColor = Color.Black

    Else 'Drehschalter Mittelstellung
    LblGruSte.ForeColor = Color.LightGray
    LblAuto.BackColor = Color.Gray
    LblEinr.BackColor = Color.Gray
    LblEinzel.ForeColor = Color.LightGray
    LblAutoStart.ForeColor = Color.LightGray
    LblAutoStop.ForeColor = Color.LightGray
    End If
    If bufo(0) And 4 Then
    LblMotStart.ForeColor = Color.LightGray
    LblMotStop.ForeColor = Color.Black
    Else
    LblMotStart.ForeColor = Color.Black
    LblMotStop.ForeColor = Color.LightGray
    End If
    If bufo(0) And 8 Then
    PBoxWickel.Visible = True
    Else
    PBoxWickel.Visible = False
    End If
    If bufo(0) And 32 Then
    PKlemmeVo.Location = New Point(372, 267)
    Else
    PKlemmeVo.Location = New Point(372, 259)
    End If
    If bufo(0) And 64 Then
    PKlemmehi.Location = New Point(PBoxVorschub.Location.X, 267)
    Else
    PKlemmehi.Location = New Point(PBoxVorschub.Location.X, 259)
    End If
    If buff(0) And 1 Then 'M0.0 Länge ein\aus
    CheckBoxLaenge.Checked = True
    Else
    CheckBoxLaenge.Checked = False
    End If
    If buff(0) And 2 Then 'M0.1 Länge ein\aus
    CheckBoxLaenge.Checked = True
    Else
    CheckBoxLaenge.Checked = False
    End If


    End Sub

    Bis hierhin funktioniert alles ich ahbe aber in der bufDB() noch verschiedene Werte die ich auslesen möchte.


    DB
    0 S5t
    2 DINT
    6DINT
    10INT
    12INT
    14 S5T
    16 INT

    Für diesen zweck bräuchte ich die gets16from bzw. die gets32from Funktion.

    MfG

    Olli

  6. #6
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.759
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Also bei mir ist die Funktion public static int getS32from(byte[] b, int pos) in meiner libnodave.net definiert!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  7. #7
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Also bei mir ist die Funktion public static int getS32from(byte[] b, int pos) in meiner libnodave.net definiert!
    Die Funktionen getXXfrom() sind aus folgendem Grund NICHT in den Interfaces für .NET, VB(A), PERL usw. enthalten:
    Diese Sprachen kennen keine Zeiger im Sinne von C und Pascal (Zeiger ist eine Adresse im Speicher, ab dieser Adresse aufwärts existiert ein prinzipiell unbeschränkt langer, fortlaufender und byteweise adressierbarer Speicher, das Hochzählen der Adresse erfolgt in gleicher Weise in C und der Zielsprache).
    getXXfrom() setzt voraus, daß mittels readDaveBytes(...,buffer) ein Zeiger auf einen Puffer übergeben wurde, von dem später gelesen werden kann. Auch das setzt schon die Existenz von Zeigern voraus.

    Es mag z.Z. funktionieren, kann aber auch in der nächsten Variante von .NET in die Hose gehen.

    Die .NET-Sprachen wurden mit dem Ziel entwickelt, der Laufzeitumgebung möglichst viel Kontrolle über das Speichermanagement zu geben.

    Wenn man unbedingt mit Byte-Arrays in .NET arbeiten möchte, kann dieses in sauberer Art so erreicht werden:
    1. benutze daveReadBytes ohne Puffer, d.h. mit null als letztem Parameter.
    2. lies die Bytes mit daveGetBytes byteweise aus und lege sie im Ziel-Array ab.
    3. Wiederhole diesen Vorgang, anstatt daveReadManyBytes aus der DLL zu benutzen.
    4. Auf dieses Array können nun .NET-Varianten von getXXfrom() angewandt werden, die libnodave allerdings nicht mitbringt.

  8. #8
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.759
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von Zottel Beitrag anzeigen
    Die Funktionen getXXfrom() sind aus folgendem Grund NICHT in den Interfaces für .NET, VB(A), PERL usw. enthalten:
    Diese Sprachen kennen keine Zeiger im Sinne von C und Pascal (Zeiger ist eine Adresse im Speicher, ab dieser Adresse aufwärts existiert ein prinzipiell unbeschränkt langer, fortlaufender und byteweise adressierbarer Speicher, das Hochzählen der Adresse erfolgt in gleicher Weise in C und der Zielsprache).
    getXXfrom() setzt voraus, daß mittels readDaveBytes(...,buffer) ein Zeiger auf einen Puffer übergeben wurde, von dem später gelesen werden kann. Auch das setzt schon die Existenz von Zeigern voraus.

    Es mag z.Z. funktionieren, kann aber auch in der nächsten Variante von .NET in die Hose gehen.

    Die .NET-Sprachen wurden mit dem Ziel entwickelt, der Laufzeitumgebung möglichst viel Kontrolle über das Speichermanagement zu geben.

    Wenn man unbedingt mit Byte-Arrays in .NET arbeiten möchte, kann dieses in sauberer Art so erreicht werden:
    1. benutze daveReadBytes ohne Puffer, d.h. mit null als letztem Parameter.
    2. lies die Bytes mit daveGetBytes byteweise aus und lege sie im Ziel-Array ab.
    3. Wiederhole diesen Vorgang, anstatt daveReadManyBytes aus der DLL zu benutzen.
    4. Auf dieses Array können nun .NET-Varianten von getXXfrom() angewandt werden, die libnodave allerdings nicht mitbringt.
    Aber die getS32from ist doch in der libnodave.net enthalten (nicht als dll deklaration sondern als .net funktion). Und wenn er noch meine neueere libnodave.net verwendet, dann sind sogar noch ein paar mehr drin!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  9. #9
    Registriert seit
    04.04.2008
    Beiträge
    389
    Danke
    85
    Erhielt 39 Danke für 24 Beiträge

    Standard

    hallo,

    dass die Funktion in der dll nicht gefunden wird, ist seltsam.

    Bei der Deklaration der daveGetS32from-Funktion ist die Groß- und Kleinschreibung zu beachten. Schreibst Du daveGets16from, kommt eine Fehlermeldung "Einstiegspunkt in dll nicht gefunden...".

    Du kannst auch mal den Versuch machen, die libnodave.dll ins System32 von Windows und außerdem, wenn Du in der Testumgebung von VB.Net arbeitest, in Bin/Debug des aktuellen Projekts zu legen. Ich weiß nicht, wo die libnodave.dll überall automatisch gesucht wird.

    Gruß
    Earny

  10. #10
    Registriert seit
    13.01.2010
    Beiträge
    40
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ich hab Mal wieder ein Problem mit Libnodave.

    Ich wollte die getS32from(buf) benutzen, um einen DINT aus einem DB zu lesen, jedoch ist die Funktion im Wrapper nicht implementiert.

    Mein Aufruf:
    Private Declare Function daveGetS32from Lib "libnodave.dll" (ByRef buffer as Byte) as Integer

    Variable= daveGetS32from(buf)

    DINT ist doch Double Int.
    Int ist 32 Bit lang
    DINT wäre dann 64 Bit lang.

    Falls das bis hier nicht stimmt, ignorier bitte folgendes:

    Du kannst das Ergebnis doch auch aus dem Puffer lesen
    und ihn den gewünschten Datentyp konvertieren.

    angenommen:

    dc.davereadbytes(libnodave.davedb, 1, 0, 4, Puffer)
    Puffer muss halt ein Array von der Mindestgröße 4 sein.

    dannach:
    convert.toint64(Puffer[0])

    und schon hast du den Inhalt des Datenblocks 1 an der Stelle
    0 gelesen und in den Datentyp DoubleInt konvertiert.

    GetS32 ist daher überflüssig. Ich verwende es bei meinem Programm nicht.
    Ich konvertiere das gelesene direkt in aus dem Lesepuffer in den gewünschten Datentyp

    lg Marco*
    "Dem sind keine Grenzen gesetzt, der sie nicht hinnimmt!"

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 09.09.2010, 00:27
  2. ÄÖnderungen am libnodave.net.cs File von libnodave
    Von Jochen Kühner im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 12.05.2010, 16:56
  3. LibNoDave unter VB.Net ohne libnodave.net.dll
    Von Earny im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 09.03.2010, 18:57
  4. libnodave: Woher kommt die "libnodave.net.dll"?
    Von Thomas_v2.1 im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 10.11.2008, 12:07
  5. Libnodave - VB
    Von shuemmer im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 07.07.2006, 18:57

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •