Step 7 DB auslesen Via Excel

Purepain

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe eine Aufgabe zu bewältigen die mir Daten aus einem festem Datenbaustein Daten ausließt und diese in Excel sauber einträgt.

Bei meinem ersten Gedanken bin ich auf OPC Server gestoßen bekomme es aber nicht ohne Hilfe hin.
Hat vielleicht jemand eine Idee, wie es einfacher funktionieren könnte?
 
Werde mir das ganze nun mal genauer zu gemüte ziehen und versuchen die VBA Programmierung zu verstehen, da ich reiner S7`ler bin.

wo füge ich die Libnodave dll´s ein? weil er findet sie nicht... habe sie einfach aus libnodave/win in system32 gepackt.
kann ich es testen ohne eine SPS zur Hand zu haben? also mit PLC Sim? Wenn ja wie? welche IP Adresse?

Zu meiner Anlage, es ist eine 319er mit Profinet
Wenn ich spätermit meinem PC über Ethernet an meiner SPS hänge, welche Verbindungsart muss ich dort auswählen, S7LAN Ethernet Gateway?
Muss ich dann was in meiner SPS konfigurieren?

Naja ist wohl doch ein wenig zu kompliziert für mich... kenne mich zu wenig mit VBA und co aus... so wird das nix
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verwende für das Auslesen von DB's mit EXEL ein Klassenmodul, welches das Handling der SPS übernimmt.
Ein grundsätzliches Problem ist, dass man beim lesen ganzer DB-Blöcke erstmal ByteArrays hat, die man dann noch
entsprechend interpretieren muss. (Bytereihenfolge drehen, zusammenfassen)

benötigt wird folgendes

1. Libnodave Modul für VB, bei Libnodave enthalten.

2. Funktionen zum verarbeiten von Bits bzw. drehen von Bytes.
Ich verwende eine C geschriebene DLL Names Bitlogik.dll dort sind speziell die Funktionen
zusammengefasst, die man für die SPS-Verarbeitung braucht. Die DLL gibts samt C-Code hier

http://www.activevb.de/cgi-bin/upload/download.pl?id=383

3. Klassenmodul für VBA auf libnodave basierend

Code:
' ***************************************************************************************
'  Klasse für die Verbindung über Libnodave zu einer S7-Steuerung
'
'  Autor: Stefan Maag, Dipl.-Ing.(FH) Elektrotechnik
'  Datum: 21.06.2010
'  letzte Aenderung: 21.06.2010
'  Kontakt:
' ***************************************************************************************
Option Explicit

Dim hSocket As Long                      ' handle von openSocket
Dim hInterface As Long                   ' handle von daveNewInterface
Dim hConnection As Long                  ' handle von daveNewConnection

Dim m_Online As Boolean                     ' Verbindung zur Steuerung hergestellt
Dim m_S7_IP As String                       ' String mit IP Adresse der Steuerung
Dim m_S7_TCPIP_PORT As Long                 ' Port für die TCP/IP Verbindung (102)

Public Function CheckOnline() As Boolean
    CheckOnline = m_Online
End Function

' ===========================================================================
'   IP_ADRESS : IP_Adresse der Steuerung festlegen
' ===========================================================================

Public Property Get IP_ADRESS() As String
    IP_ADRESS = m_S7_IP
End Property

Public Property Let IP_ADRESS(ByVal NewIP As String)
    ' Wenn bereits eine Verbindung zur Steuerung über IP aufgebaut,
    ' dann diese abbauen, wenn sich die IP ändert. Beim erneuten Aufbau
    ' wird die neue IP dann übernommen
  
    If m_S7_IP <> NewIP Then Me.Disconnect
    m_S7_IP = NewIP
End Property

' ===========================================================================
'   TCPIP_PORT : Kommunikationsport für TCP/IP Verbindung festlegen
'                    Standardport = 102
' ===========================================================================

Public Property Get TCPIP_PORT() As Long
    TCPIP_PORT = m_S7_TCPIP_PORT
End Property

Public Property Let TCPIP_PORT(ByVal NewPort As Long)
    m_S7_TCPIP_PORT = NewPort
End Property

' ===========================================================================
'   IP_ADRESS : Verbindung zur Steuerung herstellen
' ===========================================================================

Public Function Connect() As Boolean
' Verbindung herstellen
   Dim RetCode As Long
   
   If m_S7_IP = "" Then
      MsgBox "Connect nicht möglich, Klasse C_S7_PLC fehlt IP-Zuweisung!"
      Exit Function
   End If
   
   ' lblConnect.Caption = "connected to " & m_S7_IP & " ... failed!"   ' ... von Natur aus pessimistisch ;-)
   hSocket = openSocket(m_S7_TCPIP_PORT, m_S7_IP)                        ' for ISO over TCP, siehe Doku zu libnodave
   
   If hSocket > 0 Then
      hInterface = daveNewInterface(hSocket, hSocket, "DEMO", 0, daveProtoISOTCP, 0)
      RetCode = daveInitAdapter(hInterface)
      
      If RetCode = daveResOK Then
         hConnection = daveNewConnection(hInterface, 0, 0, 2)
         RetCode = daveConnectPLC(hConnection)
         If RetCode = daveResOK Then
          '  lblConnect.Caption = "connected to " & m_S7_IP
            m_Online = True
            
            MsgBox "Connected with S7 CPU at IP: " & m_S7_IP, vbInformation

         End If
   '      cmdConnect.Enabled = (RetCode <> 0)
   '      cmdDisconnect.Enabled = (RetCode = 0)
   '      cmdRead.Enabled = (RetCode = 0)
   '      cmdWrite.Enabled = (RetCode = 0)
       End If
   End If
   Connect = m_Online
   
   
End Function

Public Sub Disconnect()
   ' Verbindung abbauen
   Dim RetCode As Long
   If hConnection <> 0 Then
       RetCode = daveDisconnectPLC(hConnection)
       daveFree hConnection
       hConnection = 0
   End If
   If hInterface <> 0 Then
       RetCode = daveDisconnectAdapter(hInterface)
       daveFree hInterface
       hInterface = 0
   End If
   If hSocket <> 0 Then
       RetCode = closePort(hSocket)
       hSocket = 0
   End If
   m_Online = False

End Sub

' ===========================================================================
' NAME: ReadDBFromPLC
' DESC: liest einen Datenblock aus einem DB der Steuerung
' ===========================================================================

Public Function ReadDBFromPLC(ByVal DB As Long, ByVal bytes As Long, Buffer() As Byte) As Boolean
   
   Dim res As Long
   
   Dim ReadOk As Boolean
   
   Dim FirstByte As Long
   FirstByte = 0
   
   If Not m_Online Then Connect     ' Verbindung herstellen, falls noch nicht geschehen
   
   If m_Online Then
     res = daveReadManyBytes(hConnection, daveDB, DB, FirstByte, bytes, VarPtr(Buffer(0)))
    '  daveReadBytes(dc, daveDB, 12, 0, 16, 0)
   
     If res = daveResOK Then
       ReadOk = True
     Else
        MsgBox "LibnodaveRead ... failed!"
     End If
   
   
   End If
     
'   Dim i&
'   For i = 0 To 63
'      Debug.Print i; ": "; Buffer(i)
'   Next
   
   ReadDBFromPLC = ReadOk
   
   If ReadOk Then
        MsgBox "Read " & bytes & " Bytes from DB: " & DB & " via IP: " & m_S7_IP, vbInformation

   End If
   
End Function

Private Sub Class_Initialize()
    m_S7_TCPIP_PORT = 102         ' Standarport initialisieren
End Sub
 
Hab noch was vergessen, damit man wirklich was ausliest benötigt man noch ein
Main Modul

leider ist das zu lang um es hier zu posten.
Deshalb hänge ich Exel Datei (Exel 2003) mal hier an.
Dort ist alles drin
 

Anhänge

  • BelchscherenDemo_SPS_Forum.zip
    71 KB · Aufrufe: 49
Zurück
Oben