# Libnodave und S5



## StefanK (4 November 2009)

Hallo ich möchte mit Libnodave (aktuelle Version) per RS232/AS511 auf eine S5-95U zugreifen.
Ich habe Libnodave mit S7 schon einige male erfolgreich eingesetzt, nur bei der Verbindung zur S5 komm ich nicht weiter. Programmiert wird das ganze mit VB.NET 2008.
Bis jetzt habe ich:


```
fds.rfd = libnodave.setPort("COM2", "9600", 1)
fds.wfd = fds.rfd
If fds.rfd > 0 Then
  di = New libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoAS511, libnodave.daveSpeed9k)
  res = di.initAdapter()
  If res = 0 Then
    di.setTimeout(1000000)
    dc = New libnodave.daveConnection(di, 0, 0, 2)
    res = dc.connectPLC
    If res = 0 Then
      Return True
    Else
      libnodave.closePort(fds.rfd)
      Return False
    End If
  Else
    Return False
  End If
  Else
  Return False
End If
```
 
Als Rückgabe in dieser Zeile "res = dc.connectPLC" bekomme ich: -22
Ich habe schon gesucht, habe aber keinen Hinweis auf die richtigen Parameter für S5 per AS511 gefunden.

Für ein paar Tips bin ich immer dankbar.
Gruß
Stefan


----------



## Ralle (4 November 2009)

Ok, ich hab das unter Delphi 7.

Bei 

```
fds.rfd = libnodave.setPort("COM2", "9600", 1)
```

steht bei mir: 

```
Adress:= ComPort_to_Str(SimDatenListe.SimEintrag[I].ComPort) + #0;
DaveInterface.Remote[I].DaveFDS.rfd:=SetPort(@Adress[1], '9600', 'E');
```
Das ist in der Initialisierung auch schon der einzigste Unterschied zu MPI. dort steht bei mir:

```
Adress:= ComPort_to_Str(SimDatenListe.SimEintrag[I].ComPort) + #0;
DaveInterface.Remote[I].DaveFDS.rfd:=SetPort(@Adress[1], '38400', 'O');
```


----------



## StefanK (4 November 2009)

Danke für die schnelle Antwort,

bei der Parität hatte ich schon einmal einen Fehler (nicht einfach 0/1 sondern Asc(E) ).

Jetzt bekomme ich allerdings in der Zeile "res = dc.connectPLC" : -42

Einen Fehler weniger, danke. Doch leider funktioniert es immer noch nicht. Ich verwende ein PG-COM-Kabel von PI, welches auch funktioniert (getestet mit IBH S5 für Win).

Muss ich aus meiner Applikation den Comport einstellen o.ä.

Welche Einstellungen sind hier notwendig?


```
dc = New libnodave.daveConnection(di, 0, 0, 0)
```

Bisher kann ich hier einstellen was ich möchte, keine Reaktion.


----------



## Ralle (4 November 2009)

Gar nicht so einfach für mich, das in meinem Delphicode zu finden, da ich da mit einem Array of Struct arbeite anstatt direkt mit den Werten.

Ich hab das mal im Debugger angesehen und meine Variablen ersetzt, soweit es ging:

dein Code

```
di = New libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoAS511, libnodave.daveSpeed9k)
```

mein Code

```
DaveInterface.Remote[I].DaveIntf:=daveNewInterface(DaveInterface.Remote[I].DaveFDS, 'IFS3'#0, 1, daveProtoAS511), _daveSpeed187K);
```

Die Geschwindigkeitsangabe spielt u.U. gar keine Rolle, da das ja in Setport für dem Comport erledigt wurde, ich hab hier einfach die MPI-Angaben belassen.

dein Code

```
dc = New libnodave.daveConnection(di, 0, 0, 0)
```

mein Code

```
DaveInterface.Remote[I].DaveConn:=daveNewConnection(DaveInterface.Remote[I].DaveIntf, 2, 0, 0);
```


----------



## StefanK (4 November 2009)

*Danke, danke, danke.. doch leider...*

...funzt immer noch nicht...!!

Vielen Dank erst mal an Ralle!

Ich schaue mir das nochmal genau an und teste ein wenig. Ich bekomme in der oben erwähnten Zeile immer noch eine -42 zurück. Kann ich irgendwo nachlesen, was die Rückgabewerte bedeuten?
Ich bin zwar die nächsten 2-3 Std. nicht online, melde mich aber mit dem Ergebnis.

Gruß


----------



## Ralle (4 November 2009)

Um es prinzipiell zu testen, würde ich mal die AS511Test.exe durchlaufen lassen. Mit Debugmode, bekommt man da schon mal raus, ob es denn überhaupt mit dem Rechner und der SPS und dem Kabel funktioniert.


----------



## StefanK (4 November 2009)

*Test durchgeführt...*

Jo, danke für den Hinweis.
Hier mal die "Testergebnisse".

Wow, wenn ich jetzt noch den Source hätte...
aber mal im ernst, wenn ich das nicht ganz falsch interpretiere, funktioniert das.
Irgendetwas mache ich falsch, aber was?


----------



## pm (5 November 2009)

Hallo,

habe mich letzte Woche damit beschäftigt, anbei mein Code:


```
#Region "Variablendeklaration"
    'Libnodave
    Public ph As New libnodave.daveOSserialType
    Public di As libnodave.daveInterface
    Public dc As libnodave.daveConnection
    Public res As Integer
#End Region

    Private Sub ConnectSPS()

        ph.rfd = libnodave.setPort("COM2", "9600", AscW("E"))
        ph.wfd = ph.rfd

        If ph.rfd > 0 Then
            di = New libnodave.daveInterface(ph, "S5", 0, libnodave.daveProtoAS511, libnodave.daveSpeed187k)
            res = di.initAdapter

            If res = 0 Then
                di.setTimeout(500000)
                dc = New libnodave.daveConnection(di, 2, 0, 0)
                res = dc.connectPLC
                If res = 0 Then
                    Timer1.Enabled = True
                Else
                    Timer1.Enabled = False
                    Call DisconnectSPS()
                    End
                End If
            Else
                libnodave.closePort(ph.rfd)
            End If
        End If

    End Sub

    Private Sub DisconnectSPS()
        If ph.rfd > 0 Then
            res = dc.disconnectPLC()
            di.disconnectAdapter()
            libnodave.closePort(ph.rfd)
        End If
    End Sub
```


----------



## StefanK (5 November 2009)

*Danke, das funktioniert...*

Hallo pm, Ralle,

danke, es funktioniert. Letztendlich habe ich einfach den Source von pm genutzt (wobei ich den groben Fehler in meinem nicht sehe).
Danke, Gruß


----------



## pm (5 November 2009)

Freud mich das es funktioniert...
Glaube Dein "Fehler" liegt am Timeout "di.setTimeout(1000000)", der muss auf (500000) eingestellt werden.

MfG
Peter


----------



## RobiHerb (5 November 2009)

*Magie?*



pm schrieb:


> Freud mich das es funktioniert...
> Glaube Dein "Fehler" liegt am Timeout "di.setTimeout(1000000)", der muss auf (500000) eingestellt werden.
> 
> MfG
> Peter



Was sind das für magische Zahlen? 

Mysec oder welche Bedeutung haben sie?


----------



## StefanK (5 November 2009)

pm schrieb:


> Freud mich das es funktioniert...
> Glaube Dein "Fehler" liegt am Timeout "di.setTimeout(1000000)", der muss auf (500000) eingestellt werden.
> 
> MfG
> Peter


 
Hmmm, ich hatte dem Timeout nicht so viel Beachtung geschenkt, werds aber nacher testen, danke für den Hinweis.

Gruß
Stefan


----------



## argv_user (5 November 2009)

Timeouts kommen in der Regel im Fehlerfall zum tragen.
Daher glaube ich eher nicht, dass die Verkürzung von einer Sekunde auf eine halbe hier viel ausmacht.
Bin aber auf Deinen Bericht gespannt, StefanK.


----------



## StefanK (6 November 2009)

*Timeout*



argv_user schrieb:


> Timeouts kommen in der Regel im Fehlerfall zum tragen.
> Daher glaube ich eher nicht, dass die Verkürzung von einer Sekunde auf eine halbe hier viel ausmacht.
> Bin aber auf Deinen Bericht gespannt, StefanK.


 
Das dachte ich bis jetzt auch...

Also, bei 


```
di.setTimeout(500000)
```
 
funktioniert es. Bei


```
di.setTimeout(1000000)
```
 
nicht.

Danke nochmal!
Gruß
Stefan


----------



## RobiHerb (6 November 2009)

*Verstehe ich nicht*

Also entweder kann ich schlecht die Nullen zählen oder ich verstehe nicht, im 2. Falle ist doch der Timeout länger, also sollte es im Problemfall eher besser werden?


----------



## Ralle (6 November 2009)

RobiHerb schrieb:


> Also entweder kann ich schlecht die Nullen zählen oder ich verstehe nicht, im 2. Falle ist doch der Timeout länger, also sollte es im Problemfall eher besser werden?



Vielleicht ist der tTmeout zu groß und verursacht dadurch einen Überlauf oder sonst was in der Art?


----------



## tld70 (4 Juli 2021)

Hallo,
hat schon jemand versucht über die DotNetSiemensPLCToolBoxLibrary.dll und AS511 eine Verbindung mit einer 810M Steuerung herzustellen?
Eine Verbindung bekomme ich hin,
 if (myConn != null) myConn.Dispose();
                myConn = new PLCConnection((string) lstConnections.SelectedItem);

             //   myConn.plc
                myConn.Connect();

                var tag = new PLCTag("EB97");
                myConn.ReadValue(tag);
                label3.Text = tag.ValueName.ToString();

Wenn myConn.Connect aufgerufen wird, zeigt er auch conntcted an.
Aber sobald ich myConn.Readvalue aufrufe kommt eine Meldung -5 zurück.
Das Eingangsbyte EB97 ist vorhanden, es gehen die Tasten vom Bedienfeld in diesen Bereich.
Was mache ich falsch?
Hat jemand ein funktionierendes Beispiel?
Danke
Thomas


----------

