Libnodave Siemens Logo 8

taurus1902

Level-1
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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:
Code:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ???
 
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:
Code:
    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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Hi,

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.
 
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 :confused:
Gibt es irgendwo eine Dokumentation darüber? Und über die Adressierung der Analogeingänge als EW8 ...? Und die Adressen der Netzvariablen?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo PN/DP,

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

Anhänge

  • LOGO! 8 Soft Comfort Online-Hilfe S. 108-112.pdf
    291,8 KB · Aufrufe: 215
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bin etwas weiter gekommen I/O habe ich mit den Panels hinbekommen eingänge 1-8 und asugänge 1-8 funktionieren:D
Jetzt noch die hürde mit den Merkern !
Wie gehe ich da am besten vor ? anbei der quellcode
Code:
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
 
Bin etwas weiter gekommen I/O habe ich mit den Panels hinbekommen eingänge 1-8 und asugänge 1-8 funktionieren:D
Allerdings nur wenn nichts schief geht :cool:
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.

Jetzt noch die hürde mit den Merkern !
Wie gehe ich da am besten vor ? anbei der quellcode
Code:
    Private Sub Timer1()
        [COLOR="#FF0000"]If Connection Then[/COLOR] res = dc.readBytes(libnodave.daveFlags, [COLOR="#FF0000"]0, 10, 16[/COLOR], buf) [COLOR="#FF0000"]'dies soll M10.0...M25.7 lesen - gibt es nicht in LOGO[/COLOR]
        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, [COLOR="#FF0000"]0, 96, 2[/COLOR], buf) [COLOR="#FF0000"]'dies soll Eingänge EW96 lesen - gibt es nicht in LOGO[/COLOR]
        If res = 0 Then
            Label5.Text = Str(dc.getU16)  'WORD 2 bytes
        End If

        res = dc.readBytes(libnodave.daveFlags, [COLOR="#FF0000"]68, 8, 4[/COLOR], buf) [COLOR="#FF0000"]'ganz falsch - Merker haben keine DB-Nr! würde MD4 lesen - gibt es nicht in LOGO[/COLOR]
        If res = 0 Then
            Label6.Text = Str(dc.getU32)  'DB68.DBW8 DWORD 4 bytes
        End If
[COLOR="#FF0000"]'hier fehlt ein "End if" bzw. "If Connection Then" ist falsch verschachtelt[/COLOR]
    End Sub
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:
Code:
'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
 
Hab es hinbekommen mit den merkern jetzt muß ich es noch etwas ordendlicher machen dan sollte alles Gehen .
Anbei der Quellcode:
Code:
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
 
Hab es hinbekommen mit den merkern
??? Ich sehe da höchstens noch mehr Müll als vorher ???

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
 
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 .
Code:
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
Code:
Option Explicit On
einfügen.
Dadurch bekommst du alle Fehler die durch Wandlung enstehen angezeigt.
Code:
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?
Code:
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
Code:
If res = 0 Then
Siehe oben.
Code:
a = dc.getU8
Hier wird ein Integer auf ein Byte kopiert, was eventuell Probleme bereiten kann.
Code:
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
 
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
Code:
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
 
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:
Code:
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
Code:
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
Code:
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
 
Zurück
Oben