# Libnodave über S7Online



## bqstony (2 Juni 2009)

Guten Tag allerseits

Seit kurzem befasse ich mich mit der Libnodave Bibliothek. Und möchte gleich mal ein grosses lob aussprechen.

Nun habe ich einige Tests mit der Kommunikation erstellt. Über TCP funktioniert auch alles einwandfrei.

Jedoch ist mir ein seltsames Symphtom aufgeallen, sobald die Verbindung über S7Online hergestellt wird.

Wen ich nur meine Applikation offen habe, funktioniert eine Verbindung einwandfrei. Öffnen und schliessen läst sich sich auch.

Öffne ich aber eine Verbindung mit Libnodave, und starte anschliessend, Step7 Variablentable und gehe online (über S7Online), Läst sich die verbindugn in Libnodave zwar schliessen, und öffnen, jedoch beim auslesen der Werte erhalte ich den Fehler "Unexpected function code in answer" war glaub ich ErrNr -128

Schliesse ich die Applikation und die Variablentabelle, funktioniert alles wieder einwandfrei. 

Weis jemand an was dies liegenkönnte? Oder hatte schon wer dieses Problem?


PS: Noch mein Test Code

```
Class test
    Public fds As libnodave.daveOSserialType
    Public di As libnodave.daveInterface
    Public dc As libnodave.daveConnection

   Public Function LibnodaveOpenS7Online() As Boolean
        Try
            Dim localMPI As Integer = 0
            Dim plcMPI As Integer = 2

            Dim res As Integer
            Dim str As String = "S7Online"
            Dim intPartner As Integer
            Dim buf1(libnodave.davePartnerListSize) As Byte

            fds.rfd = libnodave.openS7online(str, Form1.Handle) 'S7Online)  


            fds.wfd = fds.rfd

            If fds.rfd >= 0 Then       ' if step 1 is ok
                di = New libnodave.daveInterface(fds, "IF1", localMPI, libnodave.daveProtoS7online, libnodave.daveSpeed187k)
                di.setTimeout(5000000)  ' Make this longer if you have a very long response time

                If di.initAdapter = 0 Then
                    res = 0
                    intPartner = di.listReachablePartners(buf1)
                    Debug.Print("Anzahl Partner: " & intPartner)
                    If (intPartner > 0) Then
                        For j As Integer = 0 To intPartner - 1
                            If buf1(j) = libnodave.daveMPIReachable Then
                                Debug.Print("Device at Address: " & j)
                            End If
                        Next

                    End If
                End If
            

                '
                If res = 0 Then       ' init Adapter is ok
                    dc = New libnodave.daveConnection(di, plcMPI, 0, 0)  ' rack amd slot don't matter in case of MPI

                    res = dc.connectPLC

                    If res = 0 Then
                        Return True

                    Else
                        Debug.Print("Error {0:d}={1:s} in connectPLC.", res, libnodave.daveStrerror(res))
                    End If

                Else
                    Debug.Print(libnodave.daveStrerror(res))

                End If

            Else
                MessageBox.Show("Couldn't open S7Online Connection", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

                Return False
            End If 'fds.rfd >0

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Function


    Public Function LibnodaveCloseS7Online() As Boolean
        Try
            Dim res As Integer = 0
            res = di.disconnectAdapter() ' End connection to adapter
            res = libnodave.closeS7online(fds.rfd)
            res = dc.disconnectPLC()
            res = libnodave.closePort(fds.rfd)    ' Clean up

            If res = 0 Then
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Function


'.......
'Lesen
        res = dc.readBytes(libnodave.daveDB, 1, 0, 100, buf)

'Fehler meldung!

        If res = 0 Then
            a = dc.getU8At(0)
```


----------



## Ralle (2 Juni 2009)

Also mir zumindest ist das bekannt, hab das auch so beobachtet. Wenn ich aber normal mit Ethernet arbeite, ohne S7Online gibt es keine Probleme. Die S7Online-Schnittstelle ist von Zottel zwar implementiert worden, aber er hat das sicher nicht als Hauptbaustelle betrachtet, da man sich ja hier praktisch in ein installiertes Step7-System auf dem PC reinhängt. Und darum gings ja bei libnodave nicht primär. Hast du mal 2 SPS gleichzeitig per S7Online angesprochen? dabei hatte ich das Problem, daß die Daten immer von der ersten SPS kamen, mit der ich mich verbunden hatte. Daten von der zweiten waren dann immer die gleichen, wie von der 1. SPS. Würde mich mal interessieren, ob das auch bei anderen Nutzern so ist.


----------



## Human (4 Juni 2009)

Bei mir sieht das gerade so aus, dass ich mich über S7Online über MPI auf 2 315er verbinden will (2x TNoDave-Komponente von afk). Beide scheinen sich auch zu verbinden, aber ich kann weder aus der einen noch aus der anderen etwas lesen.
Dann habe ich es einmal probiert, dass ich die MPI-Remote-Adresse im einen Zyklus auf 2 (1. CPU) und dann mal 3 (2. CPU) gestellt habe... auch nichts.
Irgendwelche Ideen oder Vorschläge oder soll ich wie meine Vorfahren auch schon in dem Fall einfach zum ProDave greifen?


----------



## Ralle (4 Juni 2009)

Human schrieb:


> Bei mir sieht das gerade so aus, dass ich mich über S7Online über MPI auf 2 315er verbinden will (2x TNoDave-Komponente von afk). Beide scheinen sich auch zu verbinden, aber ich kann weder aus der einen noch aus der anderen etwas lesen.
> Dann habe ich es einmal probiert, dass ich die MPI-Remote-Adresse im einen Zyklus auf 2 (1. CPU) und dann mal 3 (2. CPU) gestellt habe... auch nichts.
> Irgendwelche Ideen oder Vorschläge oder soll ich wie meine Vorfahren auch schon in dem Fall einfach zum ProDave greifen?



Da du ja Step7 installiert hast (S7Online) reicht es, wenn du die entsprechende Prodave-DLL nutzt. Zumindest in der alten Version (ohne Ethernet) gibt es noch keine Authorisierung. Prodave wird dann so ähnlich wie libnodave eingesetzt, man muß halt ein paar andere Funktionen aufrufen. Ich nutze die Proodave-DLL, wenn ich mal ein paar Daten über meine CP5511 einlesen will. Damit kann libnodave leider nicht umgehen.


----------



## Rainer Hönle (4 Juni 2009)

Human schrieb:


> Bei mir sieht das gerade so aus, dass ich mich über S7Online über MPI auf 2 315er verbinden will (2x TNoDave-Komponente von afk). Beide scheinen sich auch zu verbinden, aber ich kann weder aus der einen noch aus der anderen etwas lesen.
> Dann habe ich es einmal probiert, dass ich die MPI-Remote-Adresse im einen Zyklus auf 2 (1. CPU) und dann mal 3 (2. CPU) gestellt habe... auch nichts.
> Irgendwelche Ideen oder Vorschläge oder soll ich wie meine Vorfahren auch schon in dem Fall einfach zum ProDave greifen?


Aber es gibt doch Alternativen zu prodave ;-)


----------



## Human (4 Juni 2009)

Rainer Hönle schrieb:


> Aber es gibt doch Alternativen zu prodave ;-)


 
Und die da wären?


----------



## Rainer Hönle (4 Juni 2009)

Human schrieb:


> Und die da wären?



Selbstverständlich ACCON-AGLink. Wir unterstützen auch S7-Online und das stabil mit mehreren Verbindungen gleichzeitig. Demo bei uns zum Download.


----------

