' ***************************************************************************************
' 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