Probleme mit LibNoDave 8.4.4 und NetlinkUSB

Jochen Kühner

Level-3
Beiträge
4.291
Reaktionspunkte
527
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, Ich will mit LibNoDave und einem Netlink USB über die Siemens DLL's auf meine Steuerung Zugreifen.

Doch immer nach dem myDaveConnection.connectPLC() hängt die PC Software...

Achso, noch weiters: Ich nutze die libnodave.net.dll welche bei libnodave dabei ist.

Hier mein Verbindungsaufbau:

myPH.rfd = libnodave.openS7online("S7ONLINE");
myPH.wfd = myPH.rfd;
myDaveInterface = new libnodave.daveInterface(myPH, "ProtokollInterface", 1, 50, 2);
myDaveConnection = new libnodave.daveConnection(myDaveInterface, 2, 0, 2);
res = myDaveConnection.connectPLC();
 
Netlink USB...

Also das Problem scheint nur der Netlink USB zu sein, mit einem anderen S7Online treiber hängt es sich nicht auf. Gibts da schon Lösungen???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

von welchem Hersteller ist der NetLink-USB? Welchen Firmwarestand er? Welche Treiberversion für Step7 (ich meine den Treiber, der den NetLink-USB in den Dialog PG/PC-Schnittstelle einstellen bringt) verwenden Sie? Funktioniert der Zugriff von Step7 über den NetLink-USB (z.B. Status Variablen oder Übertragen von Bausteinen)?

Bernhard Götz
 
Netlink...

NetLink:

Hersteller: Helmholz
Treiber: neuster S7 Net treiber (2.6)
Firmware: neuste Firmware auf dem Netlink (1.40 und Bios 1.42)


Zugriff von S7 aus funktioniert wunderbar, keine Probleme.



nach dem myDaveConnection.connectPLC(); hängt die Software....
 
Hallo,

testen Sie doch bitte einmal mit ACCON-AGLink (Setup). Nach Ausführen des Setup starten Sie bitte das Programm AGLink40_Config.exe aus dem Ordner C:\Programme\DELTALOGIC\ACCON-AGLink\Tools und stellen es wie auf dem angehängten Screenshot ersichtlich ein. Beenden Sie das Programm und starten Sie AGLink40_Performance.exe ebenfalls aus dem Ordner C:\Programme\DELTALOGIC\ACCON-AGLink\Tools.

Da Programm baut über den NetLink-PRO eine Verbindung zur SPS aus und liest Daten aus. Bitte machen Sie vom Programmfenster einen Screenshot und hängen ihn hier an.

Vielen Dank
Bernhard Götz
 

Anhänge

  • S7-NET.jpg
    S7-NET.jpg
    177,3 KB · Aufrufe: 39
Geht...

Mit der Acon AgLink DLL gehts... Hm, schein wohl der Zugriff über die S7 Dlls von LibNoDave Seite aus noch nicht ganz astrein zu sein!
 

Anhänge

  • ttt.jpg
    ttt.jpg
    55,6 KB · Aufrufe: 32
@Jochen

Warum willst du eigentlich das Protokoll "S7Online" benutzen? Das ist leider noch nicht so richtig fehlerfrei (Man kann z.Bsp. nur auf eine SPS zugreifen). Geht für den Netlink-USB kein anderes Protokoll von Libnodave? Das wäre auf jeden Fall immer dem S7Online-Protokoll vorzuziehen.
 
ja welches protokoll soll denn gehen??? soweit ich weis geht nur der netlink lite direkt!!

Das wußte ich nicht, daher die Nachfrage. Ich hab einen Netlink Pro, da stellt sich die Frage nicht, der geht. Ist der USB-Port nicht wie ein Comport am System angemeldet? Vielleicht geht das einfache MPI-Protkoll mit dem entsprechenden Port? Da ich dein Gerät noch nie in den Händen hatte, kann ich leider nur raten :confused:.
 
Guten morgen,

mit folgendem Code kann ich eine Verbindung aufbauen, die Rückgabewerte sind 0, also OK.

Wenn ich aber dann mit 'res2 = daveReadBytes(dc, daveDB, Datablock, Startbyte, Length, 0)' auslese kommt als Rückgabewert -128 :cry:

hat das schon jemand über die S7Online-Schnittstelle gelöst?


Code:
Private Declare Function openS7online Lib "libnodave.dll" (ByVal peer As String, ByVal handle As Integer) As Long

Private Function initialize(ByRef ph As Long, ByRef di As Long, ByRef dc As Long)
ph = 0
di = 0
dc = 0

Dim res As Long
Dim acspnt$
Dim MpiPpi As Long
Dim slot As Long
Dim rack As Long

initialize = -1
res = -1
acspnt$ = "S7ONLINE"

ph = openS7online(acspnt$, 0)
If (ph > 0) Then

di = daveNewInterface(ph, ph, "IF1", 0, daveProtoS7online, daveSpeed187k)
    res = daveInitAdapter(di)
    If res = 0 Then
        MpiPpi = 2

        rack = 0
        slot = 2
        
        dc = daveNewConnection(di, MpiPpi, rack, slot)
        res = daveConnectPLC(dc)
        If res = 0 Then
            initialize = 0
        End If
    End If
End If
End Function
 
Hallo,

ist bei dem Thema was rausgekommen? Ich versuche auch gerade mich über einen NetLinkUSB und Libnodave mit einer SPS zu verbinden, aber ohne Erfolg.:confused:

Gruß
markham

Bin zwar nicht der Experte, aber da ich zuletzt selbst damit zu tun hatte:
die Funktion openS7online hat bei mir nur mit zweite Argumenten funktioniert, siehe auch dieser Thread

Guten morgen,

mit folgendem Code kann ich eine Verbindung aufbauen, die Rückgabewerte sind 0, also OK.

Wenn ich aber dann mit 'res2 = daveReadBytes(dc, daveDB, Datablock, Startbyte, Length, 0)' auslese kommt als Rückgabewert -128 :cry:

hat das schon jemand über die S7Online-Schnittstelle gelöst?


Code:
Private Declare Function openS7online Lib "libnodave.dll" (ByVal peer As String, ByVal handle As Integer) As Long

Private Function initialize(ByRef ph As Long, ByRef di As Long, ByRef dc As Long)
ph = 0
di = 0
dc = 0

Dim res As Long
Dim acspnt$
Dim MpiPpi As Long
Dim slot As Long
Dim rack As Long

initialize = -1
res = -1
acspnt$ = "S7ONLINE"

ph = openS7online(acspnt$, 0)
[COLOR=#ff0000][B]If (ph > 0) Then[/B][/COLOR]

di = daveNewInterface(ph, ph, "IF1", 0, daveProtoS7online, daveSpeed187k)
    res = daveInitAdapter(di)
    If res = 0 Then
        MpiPpi = 2

        rack = 0
        slot = 2
        
        dc = daveNewConnection(di, MpiPpi, rack, slot)
        res = daveConnectPLC(dc)
        If res = 0 Then
            initialize = 0
        End If
    End If
End If
End Function

ph als Rückgabewert sollte > 0 sein, ist das bei dir der Fall?
Stell mal die Sub für daveRead... ein.



MfG MK
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit Herrn Kühners VarTab Online Programm kann ich mich verbinden und variablen online ansehen. Müsste also dann an meinem Code liegen!?


Code:
' Read the datas
Private Sub Read_Click()
  
   
   Worksheets("Main").Select
   Range("H3").Select
   ActiveCell.FormulaR1C1 = "Read Datas"
   Dim Act_Cell As Long
   Dim i As Integer
   Dim j As Integer
   Dim Datablock As Integer
   Dim Startbyte As Integer
   Dim Length As Integer
   Dim ph As Long
   Dim di As Long
   Dim dc As Long
   Dim res As Long
   Dim res2 As Long
      
   ' Initialize
    res = initialize(ph, di, dc)
                    
   Worksheets("Main").Select
          
' Read statistic
   Length = 20
   Act_Cell = 56
   Worksheets("Statistic1").Select
    For Datablock = 61 To 61
        Startbyte = 20
        For j = 1 To 50
            res2 = daveReadBytes(dc, daveDB, Datablock, Startbyte, Length, 0)
            If res2 = 0 Then
                For i = 1 To 16
                    Range("E" & Act_Cell).Select             
                    ActiveCell.FormulaR1C1 = daveGetU8(dc)  
                    Act_Cell = Act_Cell + 1                  
                Next i
                For i = 1 To 2
                    Range("E" & Act_Cell).Select             
                    ActiveCell.FormulaR1C1 = daveGetU16(dc)  
                    Act_Cell = Act_Cell + 1                  
                Next i
            Else
                Worksheets("Main").Select
                Range("L20").Select
                 ActiveCell.FormulaR1C1 = res2
                Range("H22").Select
                ActiveCell.FormulaR1C1 = daveStrError(res)
                Worksheets("Statistic1").Select
            End If
        Startbyte = Startbyte + Length
        Next j
    Next Datablock
        
Call cleanUp(ph, di, dc)
          
End Sub

Ich habe mir die ph Variable bei der Initialisierung mal angesehen. Beim ersten Mal, wenn die Initialisierung gestartet wird, ist ph = 0 und durch if then springt er über die Verbindungsanweisung drüber. Dann läuft er immer durch, da ph bei jeder Initialisierung um 1 hochgezählt wird. Ist das so richtig?
Dann stürzt Excel ein paar mal bei der Anweisung res = daveConnectPLC(dc) ab. Irgendwann funktioniert es dann an dieser Stelle und später beim Auslesevorgang kommt -128

Gruß markham
 
Ich habe mir die ph Variable bei der Initialisierung mal angesehen. Beim ersten Mal, wenn die Initialisierung gestartet wird, ist ph = 0 und durch if then springt er über die Verbindungsanweisung drüber. Dann läuft er immer durch, da ph bei jeder Initialisierung um 1 hochgezählt wird. Ist das so richtig?

Nein ist so nicht richtig, da jedes Mal eine neue verbindung aufgemacht wird, irgendwann sind es zuviele und das Ganze schmiert ab.
Versuche deinen Code oben so zu ändern, dass nur so lange initialisiert wird bis ph > 0. Beachte dann aber auch das Cleanup die Verbindung wieder abbaut, die rufst ja auch bei jeden Programmdurchlauf auf. Vielleicht einfach mal ein Button "Verbinden"(Initialisieren) bzw. "Trennen"(Cleanup) implementieren.

Mfg MK
 
Nein ist so nicht richtig, da jedes Mal eine neue verbindung aufgemacht wird, irgendwann sind es zuviele und das Ganze schmiert ab.
Versuche deinen Code oben so zu ändern, dass nur so lange initialisiert wird bis ph > 0.

Hier mein Code mit einer Schleife:
Code:
For i = 1 To 10
    ph = openS7online(acspnt$, 0)  
    Range("S" & i).Select
    ActiveCell.FormulaR1C1 = ph
    If (ph > 0) Then Exit For
Next i
Also das gleiche wie gestern: Beim ersten Durchlauf ist ph 0, dann zweiter Durchlauf ph ist 1 und Schleife wird beendet, weiter unten dann bei res = daveInitAdapter(di) ist res 0 und wieder weiter unten bei Anweisung res = daveConnectPLC(dc) ist res 0, kann aber auch sein, dass er sich an dieser Stelle aufhängt und Excel beendet wird, mal so mal so. Ist res 0 an dieser Stelle, wird später bei der AusleseSub als Fehler -128 zurückgeliefert.
Hab mal spasseshalber im Code oben die If Abfrage rausgenommen um mal zusehen wie weit er ph hochzählt. Dabei ist Zelle S1 = 0, S2 = 1, S3 = 2, S4 = 3, S5 = 4, S6 = 5, S7 = 6 und ab Zelle S8 kommt -1

Ich habe mir auch die Variable ph mal bei meiner funktionierenden Version mit IBH NetLink MPI to ethernet gateway angesehen, da ist ph mal 1852 oder 5634 usw. also viel größer als hier mit USB.

Beachte dann aber auch das Cleanup die Verbindung wieder abbaut, die rufst ja auch bei jeden Programmdurchlauf auf.

Sollte doch auch so sein, dass nach dem Auslesen der Daten mit CleanUp alles zurückgesetzt wird, oder :confused:

Den Code, den du beschreibst unter siehe auch dieser Thread. Funktioniert der bei dir? Falls ja, kannst du mir da mal ein lauffähiges Beispielprogramm zukommen lassen?

Danke schon mal vorab für deine Unterstützung

Gruß markham
 
Zurück
Oben