# S7 <--> tcp/ip



## tobl2002 (17 Februar 2009)

Hallo.

Ich habe folgende Aufgabenstellung: 
Es soll eine Verbindung zu einer PC erstellt werden, welcher über Ethernet mit meiner S7-300 CPU vernetzt ist. 
Dazu habe ich bereits einiges über LIBNODAVE gefunden und für die SPS mit AG_Send usw. Das ist soweit auch erst mal alles klar.

jetzt zu meinem Problem: die Daten vom pc sollen im folgenden Aufbau gesendet bzw. empfangen werden: <stx>C|Daten|etx>
Wie mache ich das?
muss ich das noch irgendwie als String in meinen DB schreiben, oder macht das meine baustein? 

Danke für eure hilfe.

Gruß
Tobl


----------



## jabba (17 Februar 2009)

Das sind zwei verschiedene Wege.

Bei Libodave braucht Du auf der SPS eigentlich gar nix zu machen, da Du mit dem Treiber direkt auf die variablen der SPS zugreifen kannst.

Wenn Du einen AG_Send einsetzen mußt/willst geht das mit Linodave nicht, dann must Due am PC einen TCP/IP Port abfragen der der Daten empfängt.

Falls es keine konkrete Vorgabe gibt, wäre Libnodave wahrscheinlich die bessere Wahl.


----------



## tobl2002 (18 Februar 2009)

ok also kein AG_send^^

konkrete Vorgaben gibt es keine. Die Software soll mit C# erstellt werden, was ein anderer macht. und Libodave war da der erste gedanke.

gibt es ein sinnvolles beispiel in dem irgendwas von in die SPS geschrieben bzw. ausgelesen wird? Ich habe bis jetzt nur ein beispiel von vierlagig gefunden, in dem neue Db´s angelgt werden. Damit kann ich aber gar nix anfangen. 

Sehr wichtig ist mir auch noch das oben genannte Format. wie bekomme ich das hin???


----------



## MW (18 Februar 2009)

tobl2002 schrieb:


> konkrete Vorgaben gibt es keine. Die Software soll mit C# erstellt werden, was ein anderer macht. und Libodave war da der erste gedanke.
> 
> gibt es ein sinnvolles beispiel in dem irgendwas von in die SPS geschrieben bzw. ausgelesen wird? Ich habe bis jetzt nur ein beispiel von vierlagig gefunden, in dem neue Db´s angelgt werden. Damit kann ich aber gar nix anfangen.
> 
> Sehr wichtig ist mir auch noch das oben genannte Format. wie bekomme ich das hin???



Wenn du dir Libnodave runtergeladen hast, dann solltest du dir dort mal im Ordner "Dot.NET\CS\" die Beispiele anschauen, die sollten dir weiterhelfen.


----------



## tobl2002 (18 Februar 2009)

MW schrieb:


> Wenn du dir Libnodave runtergeladen hast, dann solltest du dir dort mal im Ordner "Dot.NET\CS\" die Beispiele anschauen, die sollten dir weiterhelfen.


 
ich denke mal die datei kann ich mir nur mit c# anschauen, was ich aber leider nicht da habe. und wie geschrieben macht diesen bereich ein anderer und habe ich auch nix mit am hut (nur später die genauen daten absprechen). mir geht es nur um die sps.


----------



## MW (18 Februar 2009)

tobl2002 schrieb:


> ich denke mal die datei kann ich mir nur mit c# anschauen, was ich aber leider nicht da habe. und wie geschrieben macht diesen bereich ein anderer und habe ich auch nix mit am hut (nur später die genauen daten absprechen). mir geht es nur um die sps.



Na dann bist du fein raus , da muss sich der PC Programmierer was ausdenken, was für diesen allerdings kein Problem sein dürfte. Bei der Verwendung Von Libnodave brauchst du auf der Seite der SPS nur den Bereich bereitstellen wo die Daten geschrieben bzw. gelesen werden sollen.


----------



## tobl2002 (19 Februar 2009)

*Excel*

Hallo.

Ich bin gerade dabei das Excel beispiel von vierlagig zu testen. 
Ich arbeite mit einer Soft-SPS die auch richtig eingerichtet ist und auch online alles funktioniert. 
beim aufrufen des befehls daveconnectPLC(dc) hängt sich jedesmal mein Excel auf.

ist die übertragungsgeschwindigkeit bei Isoontcp egal? 


Gruß
Tobi


----------



## tobl2002 (19 Februar 2009)

so, ich bin dann mal einen schritt weiter gekommen, daten schreiben und lesen funktioniert. aber leider nur 1x... danach hängt sich wieder alles auf^^

hier ist mal der code den ich verwende:

```
Sub Byte_schreiben()
Dim buffer(1024) As Byte
Dim ph As Long, di As Long, dc As Long
res = initialize(ph, di, dc)
Db = 200
If res = 0 Then
'daveWriteBytes(dc, daveDB, Datenbausteinnummer, Startadresse, länge, Buffer)
If res = 0 Then
    a = davePut16(buffer(0), Cells(16, 2))
    res2 = daveWriteBytes(dc, daveDB, Db, 0, 2, buffer(0))
 
    Else
        e$ = daveStrError(res)
 
    End If
End If
Call cleanUp(ph, di, dc)
End Sub
 
Private Function initialize(ByRef ph As Long, ByRef di As Long, ByRef dc As Long)
ph = 0
di = 0
dc = 0
Rem uncomment the daveSetDebug... line, save your sheet
Rem run excel from dos box with: excel yoursheet >debugout.txt
Rem send me the file debugout.txt if you have trouble.
'Call daveSetDebug(daveDebugAll)
initialize = -1
port$ = "102"
peer$ = "192.168.0.5"
ph = openSocket(port$, peer$)    ' for ISO over TCP
Cells(2, 1) = "port handle:"
Cells(2, 2) = ph
If (ph > 0) Then
di = daveNewInterface(ph, ph, "IF1", 0, daveProtoISOTCP, daveSpeed187k)
'
'You can set longer timeout here, if you have  a slow connection
'    Call daveSetTimeout(di, 500000)
    res = daveInitAdapter(di)
    Cells(3, 1) = "result from initAdapter:"
    Cells(3, 2) = res
    If res = 0 Then
' with ISO over TCP, set correct values for rack and slot of the CPU
Rack$ = Cells(5, 2)
Slot$ = Cells(6, 2)
        dc = daveNewConnection(di, 0, Rack$, Slot$)
        res = daveConnectPLC(dc)
        Cells(4, 1) = "result from connectPLC:"
        Cells(4, 2) = res
        If res = 0 Then
            initialize = 0
        End If
    End If
End If
End Function
 
'
' Disconnect from PLC, disconnect from Adapter, close the serial interface or TCP/IP socket
'
Private Sub cleanUp(ByRef ph As Long, ByRef di As Long, ByRef dc As Long)
If dc <> 0 Then
    res = daveDisconnectPLC(dc)
    Call daveFree(dc)
    dc = 0
End If
If di <> 0 Then
    res = daveDisconnectAdapter(di)
    Call daveFree(di)
    di = 0
End If
If ph <> 0 Then
    res = closePort(ph)
    ph = 0
End If
End Sub
```
 
Kann mir irgendjemand dabei schnell helfen? wenn nicht muss ich wohl oder übel eine OPC server nehmen, da die Anlage schon bald fertig sein muss.


----------



## Chefmech (20 Februar 2009)

Wie bereits von jabba gesagt, sind kannst du mit LibNoDave direkt auf die CPU daten zugreiffen (braucht eine PG-Kommunikations Ressource auf der SPS).
So wie du schreibst, brauchst du aber eine TCP-IP Kommunikation um deine Protokollvorgabe mit Start und Endzeichen zu erfüllen. Da kämen dann AG_SEND / AG_RECV zum einsatz.


----------



## pvbrowser (20 Februar 2009)

Wenn Du eine reine TCP/IP Kommunikation machen willst, haben wir dafür eine C++ Klasse.
http://pvbrowser.de/pvbrowser/sf/manual/rllib/html/classrlSocket.html

Damit kannst Du Dein Format problemlos realisieren.

Als Alternative zu libnodave gibt es noch unsere Implementierung.
http://pvbrowser.de/pvbrowser/sf/manual/rllib/html/classrlSiemensTCP.html

Wenn Ihr C# verwendet, vermute ich mal, ist das unter Windows.
Da sollte es kein Problem sein unsere rllib.lib von C# aus anzusprechen,
der PC Programmierer muss nur noch die Anbindung an das C++ Interface machen, was er ja schon öfters gemacht haben sollte.

Du findest unser Projekt unter:
http://pvbrowser.org

Unter
http://tech.groups.yahoo.com/group/pvbrowser/
kann da auch diskutiert werden.

Zur Not auch auf Deutsch


----------

