DB via LIBNODAVE auslesen und in EXCEL darstellen / Neu

mlohmann

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

Ich habe eine CPU315-2 PN/DP und möchte via LIBNODAVE Werte aus einem Datenbaustein auslesen und in Excel auswerten. Der Auslesevorgang sollte über eine Schaltfläche gestartet werden und nur einmal durchlaufen.
Es wäre kein Problem die Werte hintereinander als INT in einen DB zusammen zu fassen.

Ich habe mir schon das Beispiel ( http://www.sps-forum.de/faq/62825-libnodave-beispiel-tcp-verbindung-zu-s7-welt.html ) angeschaut und denke ansatzweise zu verstehen wie das mit dem daveReadBytes Befehl funktioniert.

res2 = daveReadBytes(dc, daveDB, 30, 1020, 12, 0) //Hier steht ja die 30 für den DB, die 1020 für das Startbyte und die 12 für die Bytes die ausgelesen werden nur wofür ist die 0?

If res2 <> 0 Then Exit Do //warum muss res2 =0 sein?

Um die Werte in die Zellen zu schreiben benutzt man ja
z = Range("RWDF").Row
s = Range("RWDF").Column
Cells(z, s) = daveGetS32(dc) / 100 //die 32 steht ja für 32 Bit nur wofür die /100?

Was ich nur noch nicht verstehe ist wie ich den Header aufbauen muss um eine Verbindung zur SPS aufbauen zu können. Die Verbindung soll via Ethernet aufgebaut werden die IP wäre für den ersten Test egal da ich eine Test CPU am Schreibtisch habe die beliebig konfiguriert werden kann. Wir haben in der Firma auch eine kleine Box die via Ethernet angeschlossen wird und dann ein WLAN-Netzwerk aufbaut über das man dann mit der SPS kommunizieren kann. Ist es möglich, dass über dies WLAN-Netzwerk Daten ausgelesen werden?

Ich muss dazu sagen, dass ich mit VBA und LIBNODAVE noch keine Erfahrungen habe.

EDIT:

Ich habe ein Testprogram auf die CPU geladen... ich würde jetzt gerne aus dem DB1 die Wörter 0-6 auslesen
 
res2 = daveReadBytes(dc, daveDB, 30, 1020, 12, 0) //Hier steht ja die 30 für den DB, die 1020 für das Startbyte und die 12 für die Bytes die ausgelesen werden nur wofür ist die 0?

If res2 <> 0 Then Exit Do //warum muss res2 =0 sein?
Als letzten Parameter von daveReadBytes(...) kann man einen Pointer auf einen eigenen Pufferbereich angegeben, wo daveReadBytes(...) die gelesenen Bytes ablegt. Bei 0 wird ein interner Puffer von Libnodave benutzt.
Wenn der Result von daveReadBytes(...) <> 0 ist, dann ist ein Fehler aufgetreten, der Inhalt von dem Puffer darf nicht ausgewertet werden.

In dem Libnodave-Package ist ein Ordner doc
darin sind die Funktionen ausführlich erklärt
daveReadBytes.html schrieb:
daveReadBytes

Reads a sequence of bytes from PLC memory.

int daveReadBytes(daveConnection * dc, int area, int DB, int start, int len, void * buffer);

Parameters:
  • dc: A pointer to a daveConnection structure representing an established connection.
  • area: A constant that specifies a memory area in the PLC.
  • DB: The number of a data block. Only meaningful if area is daveDB. Use 0 oterwise.
  • start: The address of the first byte in the block.
  • len: The number of bytes to read.
  • buffer: A pointer to some memory space where you want the result to be copied too.

Result:

The function returns 0 on success. Nonzero return codes may be passed to daveStrerror() to get a textual explanation of what happened. Generally, positive error codes represent errors reported by the PLC, while negative ones represent errors detected by LIBNODAVE, e.g. no response from the PLC.

Hints:

buffer:

You may call daveReadBytes() without a buffer specifying NULL (C) or nil (Pascal). There is, however, an internal buffer that is part of the daveConnection structure. This internal buffer allways holds the result from the last read operation.


Um die Werte in die Zellen zu schreiben benutzt man ja
z = Range("RWDF").Row
s = Range("RWDF").Column
Cells(z, s) = daveGetS32(dc) / 100 //die 32 steht ja für 32 Bit nur wofür die /100?
"RWDF" ist der Name einer Zelle in dem Excel-Blatt ("D25")
Das habe ich gemacht, um den Anfangsbereich der Datenausgabe in der Tabelle verschiebbar zu machen, ohne alle Zell-Adressen anpassen zu müssen.
Weil "RWDF" = "D25" ist, könnte man statt
z = Range("RWDF").Row
s = Range("RWDF").Column

auch fest schreiben
z = 25
s = 4


Mit daveGetS32(dc) wird ein 32Bit-Wert (DINT) aus dem Puffer von daveReadBytes(...) entnommen
und mit "/ 100" werden 2 Nachkommastellen "hervorgezaubert".
Der Wert ist ein DINT-Zähler, der in 0.01m³-Einheiten zählt. Wenn der Zählerstand 12345 ist, dann wird durch das "/ 100" in der Excel-Zelle "123.45 m³" angezeigt


Ich habe eine CPU315-2 PN/DP [...]
Was ich nur noch nicht verstehe ist wie ich den Header aufbauen muss um eine Verbindung zur SPS aufbauen zu können. Die Verbindung soll via Ethernet aufgebaut werden [...]
Ist es möglich, dass über dies WLAN-Netzwerk Daten ausgelesen werden?
Ja klar, WLAN ist kein Problem.

Der Verbindungsaufbau muß aussehen wie bei der Function connectBEA(...)
Da mußt Du nur bei peer$ = "192.168.100.13" die IP-Adresse Deiner 315-2PN/DP eintragen.


Ich habe ein Testprogram auf die CPU geladen... ich würde jetzt gerne aus dem DB1 die Wörter 0-6 auslesen
Code:
...
res2 = daveReadBytes(dc, daveDB, 1, 0, 14, 0)
...
z = ...
s = ...
Cells(z, s) = daveGetU16(dc)      [COLOR="#008000"]' DB1.DBW0[/COLOR]
Cells(z + 1, s) = daveGetU16(dc)  [COLOR="#008000"]' DB1.DBW2[/COLOR]
...
Cells(z + 6, s) = daveGetU16(dc)  [COLOR="#008000"]' DB1.DBW12[/COLOR]

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke schon mal dafür. Ich habe das nun in dem Beispielcode für mein Program angepasst bekomme aber die Fehlermeldung "Fehler beim Öffnen TCP-Socket!" woran kann das liegen?
 
Libnodave kann zu dem in der Meldung angegebenen Port an der angegebenen IP-Adresse keine Verbindung aufbauen.
( Fehler bei der Zeile: ph = openSocket(102, peer$) )
- falsche IP-Adresse?
- falscher Port? muß normalerweise Port 102 sein
- CPU nicht erreichbar? Funktioniert Ping zu der CPU?

Harald
 
Code:
Private Function connectBEA(ByRef ph As Long, ByRef di As Long, ByRef dc As Long) As Long
Dim res, resmb, peer$, MpiPpi, Rack, slot
ph = 0: di = 0: dc = 0
connectBEA = -1
res = -1
' Verbindungsparameter TCP: peer$, Rack, Slot (MpiPpi wird nicht genutzt)
peer$ = "192.168.1.239"
MpiPpi = 2: Rack = 0: slot = 2
' port-Handle erzeugen
ph = openSocket(102, peer$) ' for ISO over TCP
If (ph > 0) Then
    di = daveNewInterface(ph, ph, "IF1", 0, daveProtoISOTCP, daveSpeed187k)
'    Call daveSetTimeout(di, 500000)
    res = daveInitAdapter(di)
    If res = 0 Then
        dc = daveNewConnection(di, MpiPpi, Rack, slot)
        res = daveConnectPLC(dc)
        If res = 0 Then ' Verbindung zu PLC erfolgreich aufgebaut
            connectBEA = 0
        Else ' Fehler daveNewConnection() + daveConnectPLC()
            resmb = MsgBox("Keine Verbindung zu BEA-PLC!" & Chr(13) _
                         & "(" & peer$ & ":102, Rack 0, Slot " & slot & ")", vbExclamation, "Fehler bei Verbindungsaufbau")
        End If
    Else ' Fehler daveNewInterface() + daveInitAdapter()
        resmb = MsgBox("Fehler beim Initialisieren TCP-Interface!", vbExclamation, "Fehler bei Verbindungsaufbau")
    End If
Else ' Fehler openSocket()
    resmb = MsgBox("Fehler beim Öffnen TCP-Socket!" & Chr(13) _
                 & "(" & peer$ & ":102)", vbExclamation, "Fehler bei Verbindungsaufbau")
End If
End Function
#

so stehts drin.

Erreichbar ist die CPU. Ich hab die mit der testiso_tcp.exe auch schon gesteuert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stammt denn die Fehlermeldung von connectBEA(..)?
Steht in der Fehlermeldung tatsächlich "Fehler beim Öffnen TCP-Socket! (192.168.1.239:102)"?

Die Schaltfläche [Werte aus PLC lesen] auf dem Blatt "Wasseraufbereitung" ruft die Function readFromWA() welche dann connectWA() aufruft. Hast Du den Aufruf zu connectBEA() geändert? Oder Du mußt in connectWA() den Verbindungsaufbau so ändern, daß er wie connectBEA() aussieht. connectBEA() ist für eine Verbindung zu einer CPU31x-PN auf Port 102 oder über CP343-1. Die connectWA() ist für eine Verbindung über einen IBH NetLink auf Port 1099.

Harald
 
Ich habe den code abgeändert und konnte nachdem ich einmal mit dem PC über den Simatic Manager onlinge gegangen bin auch eine Verbindung aufbauen und die Daten auslesen.
Nur wenn ich das heute wieder versuch bekommen ich keine Verbindung zur CPU. Ich denke mal wenn ich erst wieder über den Simatic Manager gehe wirds funktionieren...
als Fehlermeldung kommt in der Ecxel Tabelle fehler.JPG
Und wenn ich die CPU anping bzw. bei der testISO_TCP.exe kommt die meldung fehler2.JPG

Wie kann ich denn eine verbindung aufbauen ohne den Manager?
 
Sieht so aus als würde die Verbindung geblockt, z.Bsp im Switch bzw. einer Firewall.
Die Libnodave Geschichte läuft unabhängig vom Manager. Schau das du einen ordentlichen Ping zur Steuerung hinbekommst, vorher brauchste garnichts anderes probieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So Problem gelöst...
Ganz einfach und ganz logisch...

Der Simatic Manager stellt automatisch die Ip des PG passend zu der vom AG um. Da ich von unserem Firmennetzwerk die 192.168.102.XXX Ip bekommen habe und die SPS die IP 192.168.1.239 hat konnte es ja nicht klappen.
Nachdem ich die SPS IP umgestellt habe funktionierte die Verbindung.

Jetzt habe ich nur das Problem das ich beim weiten Versuch auf einmal eine 192.168.60.XXX IP zugewiesen bekommen habe und wieder nichts geklappt hat... Kann ich auch ohne Adminrechte mit ner Batch Datei die IP Adresse umstellen oder mit in dem VBAcode in der Exceltabelle? Die IP Adresse muss trotzdem automatisch beziehbar sein damit ich zurück am Schreibtisch auch in Firmennetz komme.
 
Die PG/PC-Schnittstellenparametrierung "TCP/IP(Auto)" darf nur benutzt werden, wenn das PG direkt mit einem Patchkabel mit der SPS verbunden ist oder höchstens ein einfacher Switch dazwischen ist (das "Auto" hat Siemens extra "erfunden" für diejenigen SPS-Programmierer welche Null Ahnung von Netzwerktechnik haben). Sobald Router in der Netzwerk-Infrastruktur vorhanden sind, funktioniert das Routing vom PG zur Ziel-SPS nicht mehr, wenn die PG/PC-Schnittstelle sich selbst eine IP aus dem Ziel-Subnetz gibt.

Es nützt genausowenig, der Ziel-SPS eine IP zu geben, welche zum Subnetz des PG passt. Auch dann funktioniert das Routing nicht, weil Routing ja scheinbar nicht nötig ist, wenn sich PG und SPS im selben Subnetz befinden.

Was kannst Du nun tun, wenn Du keine Administratorrechte auf Deinem PG hast?
- zunächst die PG/PC-Schnittstelle umstellen auf "TCP/IP <netzwerkkarte>" - auf KEINEN Fall "TCP/IP(Auto)"!!!
- die blöde Auto-IP-Adresse wieder loswerden: das Windows bzw. den Computer neu starten
- der SPS eine IP geben, welche zur Netzwerkinfrastruktur passt: dazu befrage Euren Netzwerkadministrator

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Gateway MUSS in der SPS eingetragen sein, wenn sie in einem anderen Subnetz als das PG ist.
Nur das Eintragen des Gateway nützt aber nichts, wenn die Anfragen des PG schon gar nicht bis zur SPS gelangen, weil durch falsche PG-Einstellung das Routing totgelegt wird.

Harald
 
Jetzt habt ihr mich glaub ich falsch verstanden..
Die Kommunikation zur SPS funktioniert ohne Probleme..

Was ich brauch wäre ein Script oder ähnliches was sich ohne Adminrechte ausführen lässt und meine IP von automatisch beziehen auf ne festeingestellte IP umschaltet die Daten ausliest und dann wieder auf automatisch beziehen stellt.
Denn die Situation ist wie folgt...

Ich habe mein Laptop am Schreibtisch und bin da dann im Firmennetzwerk unterwegs. Es kommt aber vor das ich für Versuche in unser Technikum gehe und dort Daten aus der SPS auslesen möchte.
Für den Schreibtisch muss ich die IP auf Automatisch beziehen haben und für die SPS die feste IP damit ich die Verbindung aufbauen kann ohne vorher die IP übern Manger einstellen zu lassen.

edit:

es ist übrigens keine Option die Netzwerkeinstellungen der SPS zu ändern.
 
Zuletzt bearbeitet:
Was für einen Computer hast Du? Was für ein Windows?
Hat der Computer/Notebook 2 Netzwerkschnittstellen (wie z.B. Siemens PG)?

Bei Windows XP einfach für die Netzwerkkarte 2 Konfigurationen eintragen:
- Allgemein: (x) IP-Adresse automatisch beziehen
- Alternative Konfiguration: (x) Benutzerdefiniert und IP passend zu Deinem SPS-Netz

Es gibt auch Tools, ich weiß aber nicht ob die ohne Administratorrechte funktionieren?
z.B. NetSetMan und in Beitrag #13 ist ein Scriptbeispiel

Noch besser:
Einen (alten) (DSL-)WLAN-Router mit integriertem Switch wie Fritzbox, D-Lan, Speedport und ähnliche.
Da hängst Du Deine Versuchs-SPS mit fester IP 'dran und aktivierst DHCP für Dein PG/Notebook.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

alle Probleme die bis jetzt mit Libnodave und der Verbindung wurden jetzt beseitigt. Access Point an die CPU gehängt und schon klappt es einwandfrei mit der IP Vergabe.
Aber jetzt kommt die nächste Schwierigkeit. Mit der erstellten Exceltabelle soll auch noch Daten von einem Automation PC 810 der Firma B&R geholt werden, der in einer anderen Anlage verbaut ist. Von dem Hersteller der Anlage habe ich die Information bekommen, dass ich die Daten mit einem OPC Server, der auf meinem Laptop läuft, abrufen kann. Zusätzlich hat er mir zu Testzwecken eine Serversoftware zukommen lassen und mich auf den OPC Client von Softig verwiesen der kostenlos als Demoversion heruntergeladen werden kann.

Wie bekomme ich das nun hin, dass ich mit Libnodave auf den OPC Server zugreifen kann? Ich habe im Forum gesucht aber anscheinend nicht die richtigen Suchbegriffe genutzt denn ich bin immer nur bei Beiträgen gelandet in denen erwähnt wurde, dass es genügend Beispiele im Forum gibt. Diese Beispiele konnte ich aber leider nicht finden.

Also in Kurzform
Via OPC Server auf den Automation PC 810 zugreifen.
Mit dem OPC Client die Daten auslesen.
Mit Libnodave die Daten in die Exceltabelle schreiben.

Funktioniert das überhaupt?

Gruß Matthias
 
Zurück
Oben