# Libnodave Siemens Logo 8



## taurus1902 (12 Januar 2015)

Hallo Gemeinde !
Ich lese hier schon eine weile mit und bin am verzweifeln.
Ich versuche seit Tagen mit Visual Studio Express 2005 eine Verbindung zur Siemens Logo mit der Libnodave bibliothek herzustellen.
Ich möchte gerne eine Visualisierung für die Logo erstellen komm aber nicht weiter.
Mein Ziel währe es:
Anzeige der Eingänge
Anzeige der Ausgänge
Schalten von Merkern

Eigendlich nicht so kompliziert sollte man meinen, aber scheinbar für mich schon wer kann mich etwas unterstützen ?
Ich bin für jede Hilfe dankbar !

Danke

Hier der Quellcode:
Public Class Form1

    Public fds As libnodave.daveOSserialType
    Public di As libnodave.daveInterface
    Public dc As libnodave.daveConnection
    Public res As Integer
    Public buf(100) As Byte
    Public localMPI As Integer = 0
    Public rack As Integer = 0
    Public slot As Integer = 2
    Public plcMPI As Integer = 2
    Public Connection As Boolean = False
    Public IP As String = "192.168.46.166"

    Private Sub ConnectPLC()
        fds.rfd = libnodave.openSocket(102, IP)
        fds.wfd = fds.rfd

        If fds.rfd > 0 Then       ' if step 1 is ok
    di = New libnodave.daveInterface(fds, "IF1",0, libnodave.daveProtoISOTCP,libnodave.daveSpeed187k)

            di.setTimeout(1000000)
            res = di.initAdapter
            If res = 0 Then       ' init Adapter is ok
                ' rack amd slot don't matter in case of MPI
                dc = New libnodave.daveConnection(di, 1, 1, 0)
                res = dc.connectPLC()
                If res = 0 Then
                    Connection = True
                    Label1.Text = "Connected " + IP
                End If
            End If
        End If
    End Sub

    Public Sub disconnectPLC()
        dc.disconnectPLC()
        MessageBox.Show("DisConnected " + IP, "DisConnected")
    End Sub
Private Sub Timer1_Tick()
        Dim a As Byte

        If Connection Then res = dc.readBytes(libnodave.daveInputs, 0, 0, 1, buf)
        If res = 0 Then
            a = dc.getU8
            If IsBitSet(a, 0) Then
                Panel1.BackColor = Color.Lime
            Else
                Panel1.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 1) Then
                Panel2.BackColor = Color.Lime
            Else
                Panel2.BackColor = Color.DarkGreen
            End If
        Else
            Label1.Text = "Read data. " + libnodave.daveStrerror(res)
        End If

    End Sub
Public Function IsBitSet(ByVal InByte As Byte, ByVal Bit As Byte) As Boolean
        'Is a n'th bit in InByte 1 of not?
        IsBitSet = ((InByte And (2 ^ Bit)) > 0)
    End Function
 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        disconnectPLC()

    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        connectPLC()

    End Sub


End Class

Danke


----------



## PN/DP (12 Januar 2015)

Wo genau kommst Du denn nicht weiter?

Bei der Verbindung zur LOGO müssen Rack und Slot beide 0 sein.

Tip: Der Quellcode läßt sich besser lesen, wenn Du ihn im Forumbeitrag in CODE-Tags einfügst (der #-Button im Beitragseditor). Dann sieht er so aus:

```
Public Class Form1

    Public fds As libnodave.daveOSserialType
    Public di As libnodave.daveInterface
    Public dc As libnodave.daveConnection
    Public res As Integer
    Public buf(100) As Byte
    Public localMPI As Integer = 0
    Public rack As Integer = 0
    Public slot As Integer = 2
    Public plcMPI As Integer = 2
    Public Connection As Boolean = False
    Public IP As String = "192.168.46.166"

    Private Sub ConnectPLC()
        fds.rfd = libnodave.openSocket(102, IP)
        fds.wfd = fds.rfd

        If fds.rfd > 0 Then       ' if step 1 is ok
    di = New libnodave.daveInterface(fds, "IF1",0, libnodave.daveProtoISOTCP,libnodave.daveSpeed187k)

            di.setTimeout(1000000)
            res = di.initAdapter
            If res = 0 Then       ' init Adapter is ok
                ' rack amd slot don't matter in case of MPI
                dc = New libnodave.daveConnection(di, 1, 1, 0)
                res = dc.connectPLC()
                If res = 0 Then
                    Connection = True
                    Label1.Text = "Connected " + IP
                End If
            End If
        End If
    End Sub

    Public Sub disconnectPLC()
        dc.disconnectPLC()
        MessageBox.Show("DisConnected " + IP, "DisConnected")
    End Sub
Private Sub Timer1_Tick()
        Dim a As Byte

        If Connection Then res = dc.readBytes(libnodave.daveInputs, 0, 0, 1, buf)
        If res = 0 Then
            a = dc.getU8
            If IsBitSet(a, 0) Then
                Panel1.BackColor = Color.Lime
            Else
                Panel1.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 1) Then
                Panel2.BackColor = Color.Lime
            Else
                Panel2.BackColor = Color.DarkGreen
            End If
        Else
            Label1.Text = "Read data. " + libnodave.daveStrerror(res)
        End If

    End Sub
Public Function IsBitSet(ByVal InByte As Byte, ByVal Bit As Byte) As Boolean
        'Is a n'th bit in InByte 1 of not?
        IsBitSet = ((InByte And (2 ^ Bit)) > 0)
    End Function
 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        disconnectPLC()

    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        connectPLC()

    End Sub
    
  
End Class
```

Harald


----------



## taurus1902 (12 Januar 2015)

Wo genau muß ich Rack und Slot eintragen ? an welcher Stelle ?
Als erstes müßte ich es schaffen eine Verbindung zur Logo herzustellen
2 Schritt abfragen der ein und ausgänge
3 Schritt Schalten der Merker 

aber ich habe keine ahnung wie ich das umsetzen soll.
Meine vorstellung währe für die I/O Checkboxen und für die Merker buttons.
Wenn ich das Programm Starte sollte automatisch die Verbindung zur Logo hergestellt werden.
Wo oder besser wie fange ich da an ???


----------



## PN/DP (12 Januar 2015)

In der LOGO muß die Server-Verbindung eingestellt werden, siehe mal hier (Dein PC entspricht der S7-300 in dem Beispiel)

In Deinem Programm ändere wie folgt, dann sollte der Connect funktionieren:

```
Public rack As Integer = 0
    Public slot As Integer = [COLOR="#FF0000"]0[/COLOR]
    Public plcMPI As Integer = 2 [COLOR="#008000"]'bei daveProtoISOTCP egal, ich nehme trotzdem immer 2[/COLOR]

[COLOR="#008000"]'...[/COLOR]

                dc = New libnodave.daveConnection(di, [COLOR="#FF0000"]plcMPI, rack, slot[/COLOR])
```

Harald


----------



## taurus1902 (12 Januar 2015)

ok das habe ich geändert. Danke schon mal
aber wie bekomme ich jetzt die I/O angezeigt ?


----------



## PN/DP (12 Januar 2015)

Wie/wann wird denn Deine Sub Timer1_Tick() aufgerufen? Die sollte die Eingänge I1 bis I8 in einem Byte lesen und den Zustand von I1 und I2 als hellgrün/dunkelgrün irgendwo (Panel1, Panel2 ?) anzeigen.

Hast Du Deinen Programmcode nicht selber geschrieben? (Wo hast Du den denn her?)

Kommst Du schon bis zum erfolgreichen "Connect"?


Adressübersetzung LOGO = LibNoDave
* I1 ... I24 = E0.0 ... E2.7
* Q1 ... Q16 = A0.0 ... A1.7
* M1 ... M27 = M0.0 ... M3.2

Ich habe keine Ahnung, ob man auch auf Analogeingänge zugreifen kann. Notfalls kann man die aber auf VM-Variablen mappen. Ich vermute, die werden dann von LibNoDave als DB1.DBx... angesprochen.

Harald


----------



## egal (12 Januar 2015)

Hi,



PN/DP schrieb:


> Ich habe keine Ahnung, ob man auch auf Analogeingänge zugreifen kann. Harald


Geht genauso, ab E-Byteposition 8 max. 32 Byte wortweise für die Rohwerte oder über korrespondierenden DB1.Offset1032..;

was bei der Logo8 nicht mehr geht (im Vegleich zur Logo7) ist über Typgrenzen hinweg auszulesen, also mit _einer_ Abfrage EB00..EB39 alle binären und analogen Eingänge,
bzw. über DB1 auch alle Eingänge und Ausgänge auf einmal, dito für Ausgänge und Merker.


----------



## PN/DP (12 Januar 2015)

Ich habe noch nie mit einer LOGO kommuniziert, doch ich dachte bisher, daß man die Struktur/Belegung des als DB1 angesprochenen VM-Bereichs selber in der LogoSoft festlegen muß, d.h. daß es keinen automatisch korrespondierenden DB1 gibt 
Gibt es irgendwo eine Dokumentation darüber? Und über die Adressierung der Analogeingänge als EW8 ...? Und die Adressen der Netzvariablen?

Harald


----------



## GUNSAMS (12 Januar 2015)

Hallo PN/DP,

im Anhang ein Auszug aus der Online-Hilfe. Bitte beachten: die 0BA7 und 0BA8 haben unterschiedliche Bereiche.


----------



## egal (12 Januar 2015)

Hi,



PN/DP schrieb:


> Gibt es irgendwo eine Dokumentation darüber? Und über die Adressierung der Analogeingänge als EW8 ...? Und die Adressen der Netzvariablen?



oder auch online: http://www.automation.siemens.com/m...67525023499&GuiLanguage=de&cssearchengine=NEW
Suche nach VM-Adressen, 1.Treffer.


----------



## taurus1902 (12 Januar 2015)

Ne den Code habe ich nicht selber geschrieben der müsste für ne s7 sein. Ich bin absoluter Neuling was vb Programmierung angeht. Hab bisher nur einparken Anwendungen geschrieben die mit mehreren excel Tabellen arbeiten. Heißt das ich muss die Eingänge noch zuweisen? I1=e0.0 usw wo mach ich das und wie am besten bräuchte jeweils nur ein Beispiel für Eingang Ausgang und merker danke.


----------



## taurus1902 (13 Januar 2015)

Bin etwas weiter gekommen I/O habe ich mit den Panels hinbekommen eingänge 1-8 und asugänge 1-8 funktionieren
Jetzt noch die hürde mit den Merkern !
Wie gehe ich da am besten vor ? anbei der quellcode

```
Imports libnodave

Public Class Form1
    Public fds As libnodave.daveOSserialType
    Public di As libnodave.daveInterface
    Public dc As libnodave.daveConnection
    Public res As Integer
    Public buf(100) As Byte
    Public localMPI As Integer = 0
    Public rack As Integer = 0
    Public slot As Integer = 0
    Public plcMPI As Integer = 2
    Public Connection As Boolean = False
    Public IP As String = "192.168.46.166"

    Private Sub ConnectPLC()
        fds.rfd = libnodave.openSocket(102, IP)
        fds.wfd = fds.rfd

        If fds.rfd > 0 Then       ' if step 1 is ok
            di = New libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k)

            di.setTimeout(1000000)
            res = di.initAdapter
            If res = 0 Then       ' init Adapter is ok
                ' rack amd slot don't matter in case of MPI
                dc = New libnodave.daveConnection(di, 0, rack, slot)
                res = dc.connectPLC()
                If res = 0 Then
                    Connection = True
                    Label1.Text = "Verbunden " + IP
                End If
            End If
        End If
    End Sub

    Private Sub DisconnectPLC()

        dc.disconnectPLC()
        Label1.Text = "nicht verbunden"

    End Sub
   

   
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ConnectPLC()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        DisconnectPLC()
    End Sub
    Private Sub Timer1()
        If Connection Then res = dc.readBytes(libnodave.daveFlags, 0, 10, 16, buf)
        If res = 0 Then
            Label2.Text = Str(dc.getS32)  'DINT 4 bytes
            Label3.Text = Str(dc.getS32)  'DINT 4 bytes
            Label4.Text = Str(dc.getS32)  'DINT 4 bytes
            Label5.Text = Str(dc.getFloat) 'float 4 bytes
        End If

        res = dc.readBytes(libnodave.daveInputs, 0, 96, 2, buf)
        If res = 0 Then
            Label5.Text = Str(dc.getU16)  'WORD 2 bytes
        End If

        res = dc.readBytes(libnodave.daveFlags, 68, 8, 4, buf)
        If res = 0 Then
            Label6.Text = Str(dc.getU32)  'DB68.DBW8 DWORD 4 bytes
        End If
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Timer1()

    End Sub

 
    Private Sub Timer1_Tick() 'eingänge 1-8

        Dim a As Byte

        If Connection Then res = dc.readBytes(libnodave.daveInputs, 0, 0, 1, buf)
        If res = 0 Then
            a = dc.getU8
            If IsBitSet(a, 0) Then
                Panel1.BackColor = Color.Lime
            Else
                Panel1.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 1) Then
                Panel2.BackColor = Color.Lime
            Else
                Panel2.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 2) Then
                Panel3.BackColor = Color.Lime
            Else
                Panel3.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 3) Then
                Panel4.BackColor = Color.Lime
            Else
                Panel4.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 4) Then
                Panel5.BackColor = Color.Lime
            Else
                Panel5.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 5) Then
                Panel6.BackColor = Color.Lime
            Else
                Panel6.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 6) Then
                Panel7.BackColor = Color.Lime
            Else
                Panel7.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 7) Then
                Panel8.BackColor = Color.Lime
            Else
                Panel8.BackColor = Color.DarkGreen
            End If
        Else
            Label1.Text = "Read data. " + libnodave.daveStrerror(res)
        End If

    End Sub

    Public Function IsBitSet(ByVal InByte As Byte, ByVal Bit As Byte) As Boolean
        'Is a n'th bit in InByte 1 of not?
        IsBitSet = ((InByte And (2 ^ Bit)) > 0)
    End Function

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        Timer1_Tick()
        Timer2_Tick()

    End Sub
    Private Sub Timer2_Tick() 'ausgänge 1-8
        Dim a As Byte

        If Connection Then res = dc.readBytes(libnodave.daveOutputs, 0, 0, 1, buf)
        If res = 0 Then
            a = dc.getU8
            If IsBitSet(a, 0) Then
                Panel16.BackColor = Color.Lime
            Else
                Panel16.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 1) Then
                Panel15.BackColor = Color.Lime
            Else
                Panel15.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 2) Then
                Panel14.BackColor = Color.Lime
            Else
                Panel14.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 3) Then
                Panel13.BackColor = Color.Lime
            Else
                Panel13.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 4) Then
                Panel12.BackColor = Color.Lime
            Else
                Panel12.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 5) Then
                Panel11.BackColor = Color.Lime
            Else
                Panel11.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 6) Then
                Panel10.BackColor = Color.Lime
            Else
                Panel10.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 7) Then
                Panel9.BackColor = Color.Lime
            Else
                Panel9.BackColor = Color.DarkGreen
            End If
        Else
            Label1.Text = "Read data. " + libnodave.daveStrerror(res)
        End If

    End Sub

End Class
```


----------



## PN/DP (13 Januar 2015)

taurus1902 schrieb:


> Bin etwas weiter gekommen I/O habe ich mit den Panels hinbekommen eingänge 1-8 und asugänge 1-8 funktionieren


Allerdings nur wenn nichts schief geht 
Bei allen Deinen Leseaufträgen ist ein Fehler bei der IF-Verschachtelung. Du rufst readBytes() nur auf wenn eine Verbindung besteht, wertest aber die Rückgabe immer aus, auch wenn readBytes() garnicht aufgerufen wurde. 
Bei Timer1() wird readBytes() zweimal aufgerufen, auch wenn gar keine Verbindung besteht.



taurus1902 schrieb:


> Jetzt noch die hürde mit den Merkern !
> Wie gehe ich da am besten vor ? anbei der quellcode
> 
> ```
> ...


Der Code in Deiner Sub Timer1() passt überhaupt nicht zu einer LOGO. Was wolltest Du damit tun???

Gehe doch mal bitte etwas planvoller vor und nicht nur Trial and Error. Lies auch mal die Beiträge #6 bis #10, wo die Übersetzung der LOGO-Adressen zur S7-Schreibweise für LibNoDave angegeben ist.
Übrigens ist bei LibNoDave auch eine Dokumentation mit Beschreibung der Funktionen dabei. Insbesondere lies mal die Beschreibung zu daveReadBytes und die Beispiele bei der Erklärung der PLC memory areas.

So müssten die readBytes(...) formuliert werden:

```
'Lesen LOGO-Eingänge I1...I24 --> "E0.0...E2.7"
res = dc.readBytes(libnodave.daveInputs, 0, 0, 3, buf)

'Lesen LOGO-Ausgänge Q1...Q16 --> "Q0.0...Q1.7"
res = dc.readBytes(libnodave.daveOutputs, 0, 0, 2, buf)

'Lesen LOGO-Merker M1...M24 --> "M0.0...M2.7"
res = dc.readBytes(libnodave.daveFlags, 0, 0, 3, buf)
```


Warum nennst Du Deine Subs zum Lesen der LOGO-Werte Timer1_Tick(), Timer2_Tick() und Timer1()?
Falls Du später mal timergesteuert aufrufen willst: die vorherigen Aufrufe der Sub müssen abgearbeitet sein bevor sie erneut aufgerufen werden dürfen.

Harald


----------



## taurus1902 (13 Januar 2015)

Hab es hinbekommen mit den merkern jetzt muß ich es noch etwas ordendlicher machen dan sollte alles Gehen .
Anbei der Quellcode:
	
	



```
Imports libnodave

Public Class Form1
    Public fds As libnodave.daveOSserialType
    Public di As libnodave.daveInterface
    Public dc As libnodave.daveConnection
    Public res As Integer
    Public buf(100) As Byte
    Public localMPI As Integer = 0
    Public rack As Integer = 0
    Public slot As Integer = 0
    Public plcMPI As Integer = 2
    Public Connection As Boolean = False
    Public IP As String = "192.168.46.166"

    Private Sub ConnectPLC()
        fds.rfd = libnodave.openSocket(102, IP)
        fds.wfd = fds.rfd

        If fds.rfd > 0 Then       ' if step 1 is ok
            di = New libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k)

            di.setTimeout(1000000)
            res = di.initAdapter
            If res = 0 Then       ' init Adapter is ok
                ' rack amd slot don't matter in case of MPI
                dc = New libnodave.daveConnection(di, 0, rack, slot)
                res = dc.connectPLC()
                If res = 0 Then
                    Connection = True
                    Label1.Text = "Verbunden " + IP
                End If
            End If
        End If
    End Sub

    Private Sub DisconnectPLC()

        dc.disconnectPLC()
        Label1.Text = "nicht verbunden"

    End Sub
   

   
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ConnectPLC()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        DisconnectPLC()
    End Sub
   

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


    End Sub

 
   

    Public Function IsBitSet(ByVal InByte As Byte, ByVal Bit As Byte) As Boolean
        'Is a n'th bit in InByte 1 of not?
        IsBitSet = ((InByte And (2 ^ Bit)) > 0)
    End Function

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


    End Sub
   

    
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Dim a As Byte

        If Connection Then res = dc.readBytes(libnodave.daveOutputs, 0, 0, 1, buf)
        If res = 0 Then
            a = dc.getU8
            If IsBitSet(a, 0) Then
                Panel16.BackColor = Color.Lime
            Else
                Panel16.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 1) Then
                Panel15.BackColor = Color.Lime
            Else
                Panel15.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 2) Then
                Panel14.BackColor = Color.Lime
            Else
                Panel14.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 3) Then
                Panel13.BackColor = Color.Lime
            Else
                Panel13.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 4) Then
                Panel12.BackColor = Color.Lime
            Else
                Panel12.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 5) Then
                Panel11.BackColor = Color.Lime
            Else
                Panel11.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 6) Then
                Panel10.BackColor = Color.Lime
            Else
                Panel10.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 7) Then
                Panel9.BackColor = Color.Lime
            Else
                Panel9.BackColor = Color.DarkGreen
            End If
        Else
            Label1.Text = "Read data. " + libnodave.daveStrerror(res)
        End If

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ConnectPLC()
        Timer1.Start()
        Timer2.Start()
        Timer3.Start()



        
    End Sub

    Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick

        Dim a As Byte

        If Connection Then res = dc.readBytes(libnodave.daveInputs, 0, 0, 1, buf)
        If res = 0 Then
            a = dc.getU8
            If IsBitSet(a, 0) Then
                Panel1.BackColor = Color.Lime
            Else
                Panel1.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 1) Then
                Panel2.BackColor = Color.Lime
            Else
                Panel2.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 2) Then
                Panel3.BackColor = Color.Lime
            Else
                Panel3.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 3) Then
                Panel4.BackColor = Color.Lime
            Else
                Panel4.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 4) Then
                Panel5.BackColor = Color.Lime
            Else
                Panel5.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 5) Then
                Panel6.BackColor = Color.Lime
            Else
                Panel6.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 6) Then
                Panel7.BackColor = Color.Lime
            Else
                Panel7.BackColor = Color.DarkGreen
            End If
            If IsBitSet(a, 7) Then
                Panel8.BackColor = Color.Lime
            Else
                Panel8.BackColor = Color.DarkGreen
            End If

        Else
            Label1.Text = "Read data. " + libnodave.daveStrerror(res)
        End If

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Connection Then res = dc.readBytes(libnodave.daveFlags, 0, 10, 16, buf)
        If res = 0 Then
            Label2.Text = Str(dc.getS32)  'DINT 4 bytes
            Label3.Text = Str(dc.getS32)  'DINT 4 bytes
            Label4.Text = Str(dc.getS32)  'DINT 4 bytes
            Label5.Text = Str(dc.getFloat) 'float 4 bytes
        End If

        res = dc.readBytes(libnodave.daveInputs, 0, 96, 2, buf)
        If res = 0 Then
            Label5.Text = Str(dc.getU16)  'WORD 2 bytes
        End If

        res = dc.readBytes(libnodave.daveFlags, 68, 8, 4, buf)
        If res = 0 Then
            Label6.Text = Str(dc.getU32)  'DB68.DBW8 DWORD 4 bytes
        End If
    End Sub

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        Dim Par As Boolean = True

        If CheckBox1.Checked = True Then

            If Par Then
                buf(0) = 255 'write 1
            End If
            'write Merke M1
            res = dc.writeBits(libnodave.daveFlags, 0, 0, 1, buf)
        End If
       
        If CheckBox1.Checked = False Then

            If Par Then
                buf(0) = 0 'write 1
            End If
            'write Merke M1
            res = dc.writeBits(libnodave.daveFlags, 0, 0, 1, buf)
        End If
        

    End Sub
End Class
```


----------



## holgermaik (13 Januar 2015)

> Hab es hinbekommen






Also ich habe keine Logo am PC dran. 
Da pssst so einiges noch nicht.
Holger


----------



## PN/DP (13 Januar 2015)

taurus1902 schrieb:


> Hab es hinbekommen mit den merkern


??? Ich sehe da höchstens noch mehr Müll als vorher ???



taurus1902 schrieb:


> jetzt muß ich es noch etwas ordendlicher machen dan sollte alles Gehen .


Sorry, unter "Gehen" verstehe ich was anderes ...
Von einem sauber funktionierenden Programmcode bist Du noch weit weg. Da bist Du noch laaange nicht fertig.


Liebe Google-Freunde! Bitte nicht nachmachen, insbesondere nicht in einer professionellen Anwendung! Der obige Code eignet sich höchstens dafür, zuhause ungefährliche Lampen ein- und auszuschalten.

Harald


----------



## taurus1902 (13 Januar 2015)

OK OK ich bin für Kritik bereit kein Problem. Ich bin Ja hier weil ich etwas Lernen will.
Ich  habe den Code jetzt mal etwas Überarbeitet und nur einmal I1, Q1 als  Pannel und den Merkerschalte ich über 2 Buttons einer schaltet ihn ein  der andere schaltet ihn aus.
Ich habe jetzt einen Time_tick drin naja seht selbst .

```
Imports libnodave
Public Class Form2
    Public fds As libnodave.daveOSserialType
    Public di As libnodave.daveInterface
    Public dc As libnodave.daveConnection
    Public res As Integer
    Public buf(100) As Byte
    Public localMPI As Integer = 0
    Public rack As Integer = 0
    Public slot As Integer = 0
    Public plcMPI As Integer = 2
    Public Connection As Boolean = False
    Public IP As String = "192.168.46.166"
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ConnectPLC()
        Timer1.Start()
    End Sub

    Private Sub ConnectPLC()
        fds.rfd = libnodave.openSocket(102, IP)
        fds.wfd = fds.rfd

        If fds.rfd > 0 Then       ' if step 1 is ok
            di = New libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k)

            di.setTimeout(1000000)
            res = di.initAdapter
            If res = 0 Then       ' init Adapter is ok
                ' rack amd slot don't matter in case of MPI
                dc = New libnodave.daveConnection(di, 0, rack, slot)
                res = dc.connectPLC()
                If res = 0 Then
                    Connection = True
                    Label1.Text = "Verbunden " + IP
                End If
            End If
        End If
    End Sub
    Public Function IsBitSet(ByVal InByte As Byte, ByVal Bit As Byte) As Boolean
        IsBitSet = ((InByte And (2 ^ Bit)) > 0)
    End Function

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim a As Byte
        If Connection Then res = dc.readBytes(libnodave.daveOutputs, 0, 0, 1, buf)
        If res = 0 Then
            a = dc.getU8
            If IsBitSet(a, 0) Then
                Panel2.BackColor = Color.Lime
            Else
                Panel2.BackColor = Color.DarkGreen
            End If
        End If
        If Connection Then res = dc.readBytes(libnodave.daveInputs, 0, 0, 1, buf)
        If res = 0 Then
            a = dc.getU8
            If IsBitSet(a, 0) Then
                Panel1.BackColor = Color.Lime
            Else
                Panel1.BackColor = Color.DarkGreen
            End If
        Else
            Label1.Text = "Read data. " + libnodave.daveStrerror(res)
        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Par As Boolean = True
        If Par Then
            buf(0) = 255 'write 1
        End If
        res = dc.writeBits(libnodave.daveFlags, 0, 0, 1, buf)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim Par As Boolean = True
        If Par Then
            buf(0) = 0 'write 0
        End If
        res = dc.writeBits(libnodave.daveFlags, 0, 0, 1, buf)
    End Sub

End Class
```
Ist das Jetzt so besser oder immer noch für die Tonne?
Wie anfangs gesagt ich bin absoluter neuling was Visual basic angeht.


----------



## holgermaik (13 Januar 2015)

Hallo
Du solltest dein Programm mal Zeile für Zeile durchgehen.
Ein "sauberes" Programm fängt alle Möglichkeiten ab, die es zum "Absturz" bringen.

Als erstes solltest du in die oberste Zeile mal
	
	



```
Option Explicit On
```
einfügen.
Dadurch bekommst du alle Fehler die durch Wandlung enstehen angezeigt.

```
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
```
Was passiert wenn der Timer wiederholt aufgerufen wird, bevor der verherige Aufruf abgearbeitet ist?

```
If Connection Then res = dc.readBytes(libnodave.daveOutputs, 0, 0, 1, buf)
```
Wenn Connection = Fals ist, wird der Aufruf nicht durchgeführt, was zur Folge hat, dass res = 0 ist

```
If res = 0 Then
```
Siehe oben.

```
a = dc.getU8
```
Hier wird ein Integer auf ein Byte kopiert, was eventuell Probleme bereiten kann.

```
Dim Par As Boolean = True         
If Par Then
```
Hier wird "Par" definiert und der Wert True zugewiesen.
In der nächsten Zeile wird der Wert von "Par" abgefragt. Wozu?

Grüsse Holger


----------



## taurus1902 (14 Januar 2015)

Hallo Holger
Wie könnte ich deiner meinung nach die Fehler mit dem Timer und dem Res=0 umgehen den resrt habe ich so geändert wie du es mir vorgeschlagen hast.
Danke

```
Option Explicit On
Imports libnodave
Public Class Form2
    Public fds As libnodave.daveOSserialType
    Public di As libnodave.daveInterface
    Public dc As libnodave.daveConnection
    Public res As Integer
    Public buf(100) As Byte
    Public localMPI As Integer = 0
    Public rack As Integer = 0
    Public slot As Integer = 0
    Public plcMPI As Integer = 2
    Public Connection As Boolean = False
    Public IP As String = "192.168.46.166"
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ConnectPLC()
        Timer1.Start()
    End Sub

    Private Sub ConnectPLC()
        fds.rfd = libnodave.openSocket(102, IP)
        fds.wfd = fds.rfd

        If fds.rfd > 0 Then       ' if step 1 is ok
            di = New libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k)
            di.setTimeout(1000000)
            res = di.initAdapter
            If res = 0 Then       ' init Adapter is ok
                ' rack amd slot don't matter in case of MPI
                dc = New libnodave.daveConnection(di, 0, rack, slot)
                res = dc.connectPLC()
                If res = 0 Then
                    Connection = True
                    Label1.Text = "Verbunden " + IP
                End If
            End If

        End If

    End Sub
    Public Function IsBitSet(ByVal InByte As Byte, ByVal Bit As Byte) As Boolean
        IsBitSet = ((InByte And (2 ^ Bit)) > 0)
    End Function

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Connection Then res = dc.readBytes(libnodave.daveOutputs, 0, 0, 1, buf)
        If IsBitSet(dc.getU8, 0) Then
            Panel2.BackColor = Color.Lime
        Else
            Panel2.BackColor = Color.DarkGreen
        End If
        If Connection Then res = dc.readBytes(libnodave.daveInputs, 0, 0, 1, buf)
        If IsBitSet(dc.getU8, 0) Then
            Panel1.BackColor = Color.Lime
        Else
            Panel1.BackColor = Color.DarkGreen
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        buf(0) = 255 'write 1
        res = dc.writeBits(libnodave.daveFlags, 0, 0, 1, buf)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        buf(0) = 0 'write 0
        res = dc.writeBits(libnodave.daveFlags, 0, 0, 1, buf)
    End Sub

End Class
```


----------



## holgermaik (14 Januar 2015)

Hallo Taurus
Erstmal ein paar allgemeine Sachen.
Du solltest für dich entscheiden, ob dein Programm nur für dich zum "basteln" ist oder ob du es veröffentlichen möchtest.
Bei einer Veröffentlichung ist noch sehr viel zu tun.
- Ip und Port dynamisch festlegen
- Einstellungen der Logo dynamisch gestalten
- .Net Version & Zielplattform definieren
- Programmende sauber programmieren
....usw usw.

Desweiteren ist es ungünstig die Verbindung beim Programmstart herzustellen.
Ein "Disconect" fehlt vollkommen.

Warum sind alle Variablen als "Public" definiert? Hast du vor mit Modulen zu arbeiten?

Zu deiner Frage:

```
Private Abfrage_laeuft As Boolean = False
 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
        If Connection = False Or Abfrage_laeuft = True Then Exit Sub
 Abfrage_laeuft = True
        res = dc.readBytes(libnodave.daveOutputs, 0, 0, 1, buf)
        If res <> 0 Then
            DisconnectPLC()
            'Es wird ein Fehler gemeldet
            'Hier sollte man die Fehlernummer der PDUerrorcodes.html auswerten und anzeigen
            'damit der Benutzer entsprechend handeln kann!
            Exit Sub
            'Eine weiter Bearbeitung macht selten Sinn nach einem Fehler
        End If
.
.weiterer Code
.
 Abfrage_laeuft = False
End Sub
```
In DisconnectPLC musst du auch deine Variable "Connection" zurücksetzen.

In 

```
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click         
buf(0) = 255 'write 1         
res = dc.writeBits(libnodave.daveFlags, 0, 0, 1, buf)     
End Sub
```
fehlt eine Abfrage auf Verbindung vollkommen und die Antwort wird ebenfalls nicht ausgewertet.

Ob die eigentlichen Aufrufe zur Logo ok sind kann ich nicht sagen. Habe keine Logo zur Hand. Da solltest du dich am Beitrag #13 von Harald orientieren.

Noch ein Tipp: Bei der Variablendeclaration ist es von Vorteil, wenn man der Variable ein Kürzel zum Typ mit gibt um die Übersicht zu behalten
z.B. 
iVar für Integer, sVar für Short, byVar für Byte usw.

Desweiteren hattest du in gestern 
	
	



```
Label2.Text = Str(dc.getS32)
```
in deinem Code. "Str" ist ein überbleibsel aus alten Basic Zeiten und sollte nicht mehr verwendet werden, da hier nicht nach Länderspezifischen Trennzeichen in Zahlen unterschieden wird. bessser ist ".ToString" in einer seiner 16 Variationen. 

Holger


----------



## taurus1902 (21 Januar 2015)

Hallo ich melde mich wieder einmal ich hatte etwas wenniger zeit um weiter zu machen.
Das  Programm habe ich in die Tonne getretten und habe von vorne angefangen.  @ Holger ja das Programm ist nur für mich ich will es nicht  Veröffentlichen.
So Ich fang mal an also das mit dem Verbinden  Leuchtet mir ein ich habe jetzt zwei Buttons einer zum Verbinden und  einer um die Verbindung wieder zu trennen. Die Abfrage unter den Flags  auf eine Verbindung besteht leuchtet mir jetzt auch ein da sonst das  Programm absürtzt das könnte ich doch mit 

```
If Connection = true  Then buf(0) = 255 'write 1         
res = dc.writeBits(libnodave.daveFlags, 0, 0, 1, buf)
else
Label1.Text = ("keine Verbindung zur Logo " + res + " " + libnodave.daveStrerror(res))
```
Wie funktioniert das eigendlich mit den ein und Ausgängen die Größer als 8 sind da bekomme ich keine Anzeige hin.
Ich habe mir den Beitrag mit den VM berreichen nocheinmal angeschaut aber ich komme nicht wirklich klar was da passiert.
If Connection Then res = dc.readBytes(libnodave.daveInputs, 1, 0, 1, buf)

```
If Connection Then res = dc.readBytes(libnodave.daveInputs, 1, 0, 1, buf)
            If res = 0 Then
                DI = dc.getU8
                If IsBitSet(DI, 8) Then
                    Panel1.BackColor = Color.Lime
                Else
                    Panel1.BackColor = Color.WhiteSmoke
                End If
```


Das müßte doch die abfrage für den eingang 9 sein aber da tut sich nichts !
Muß  ich mit etwas anderes als dcgetU8 benutzen und was bedeutet das  überhaubt ? I9 ist die VM-Adresse V924.0 und I8 hat zum Beispiel die VM  adresse V923.7 . Könnte man die Abfrage auch direkt über die VM adressen  machen?
Für das disconnet habe ich mir gedacht

```
dc.disconnectPLC();
            libnodave.closeSocket(fds.rfd)
```

Gruß Taurus


----------



## Whiteman (11 Februar 2015)

Hi Taurus,

ich bin auch gerade dabei eine Logo8 anzubinden. Leider komme ich nicht weiter.
Ich bekomme schon gar keine Verbindung zu dem Gerät. Kannst du mir ein bisschen Hilfestellung leisten?

Vielen Dank schonmal.

Gruß
Whiteman


----------



## Whiteman (12 Februar 2015)

Hi alle!

Vielleicht hat sonst noch jemand ne Idee?

Ich bekomme beim connecten immer "-1" zurück??

```
dc = New libnodave.daveConnection(di, 0, rack, slot)
                res = dc.connectPLC()
```


----------



## PacmanII (18 Februar 2015)

Hi, kann es sein, dass du die Version 0.8.5 oder 0.8.5.1 von libnodave verwendest? Ich hatte damit auch schon Probleme beim Verbindungsaufbau. Versuch mal bitte die 0.8.4.6, die ging bei mir noch. Die neueren Version sind, was die Logo betrifft, irgendwie kaputt optimiert worden...


----------



## Whiteman (19 Februar 2015)

Hallo PacmanII,
vielen Dank für die Antwort. Werde ich gleich mal ausprobieren und Feedback geben!
Grüße


----------



## Whiteman (23 Februar 2015)

Hi Pacman,

vielen Dank für den Tipp. War genau richtig! Funktioniert!!!


----------



## jdelphi (4 März 2015)

Das ist mir auch schon aufgefallen.
Die neusten Libs laufen leider nicht mher.

Hatte mir schon überlegt, ob es nicht im Interesse von Siemens ist.


----------

