Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: Schnelle Datenübertragung mit DotNetSiemensPLCToolBoxLibrary (LibNoDave)

  1. #11
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Hansi, ich beschaeftige mich auch mit diesem Thema und habe daher nochmal einen Extra-thread erstellt, mit einem kompletten vb.net Projekt und ein paar Dokumentations-Bildern. Ich hoffe du kannst damit auch was anfangen.

  2. #12
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Ich will eine automatische Funktion schreiben, wo du als Eingangliste die Konfigurationsliste aller Tags gibst und als Ausgaenge bekomsmt du EINE Liste von PLCTag-Listen und eine Liste von Connections, jeweils so aufgesplittet, dass jeweils eine Tag- Liste in eine PDU passt.

    Dazu muss man die MaxPDULen erstmal ermitteln. Libnodave hatte dafuer eine Funktion. Soweit ich sehe gibt es diese in der Toolbox-Library nicht mehr. Dann muss ich das ueber die JFK-Libnodave Library direkt machen. Waere ja auch kein Problem.

    Da mache ich mich jetzt mal dran.
    Geändert von Burkhard (26.09.2015 um 13:23 Uhr)

  3. #13
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Wenn nur aus einem Bereich gelesen werden soll: 22Bytes, siehe: PDU größe und TCP/IP frame
    Du meinst doch 222 Bytes und nicht etwa 22 Bytes??

  4. #14
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    ja, natürlich
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  5. #15
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Daumen hoch

    Code:
        Private Function CreateTagListsFromDeviceConfig(tblConfig As DataTable, ByRef stLine As String) As List(Of List(Of PLCTag))
            Dim listPlcTagList As New List(Of List(Of PLCTag)) ' List of PLC tag lists
            Dim lstPlcTag As List(Of PLCTag) ' List of PLC tags (one for each PDU)
            lstPlcTag = New List(Of PLCTag) ' List of PLC tags (one for each PDU)
            Dim iSize1 As Integer = 0
            For Each row As DataRow In tblConfig.Rows
                Dim rowSuccessor As DataRow
                If tblConfig.Rows.IndexOf(row) < tblConfig.Rows.Count - 1 Then rowSuccessor = tblConfig.Rows(tblConfig.Rows.IndexOf(row) + 1)
                Dim myPlcTag As New Communication.PLCTag(row.Item("Address").ToString)
                Dim stType As String = row.Item("Type").ToString.Trim
                If stType.Contains("REAL") Then
                    myPlcTag.TagDataType = TagDataType.Float
                    myPlcTag.ValueName = row("Name").ToString
                    lstPlcTag.Add(myPlcTag)
                    iSize1 += GetSize(stType)
                ElseIf stType.Contains("INT") Then
                    myPlcTag.TagDataType = TagDataType.Int
                    myPlcTag.ValueName = row("Name").ToString
                    lstPlcTag.Add(myPlcTag)
                    iSize1 += GetSize(stType)
                ElseIf stType.Contains("STRING") Then
                    myPlcTag.TagDataType = TagDataType.String
                    myPlcTag.ArraySize = GetSize(stType)
                    myPlcTag.ValueName = row("Name").ToString
                    lstPlcTag.Add(myPlcTag)
                    iSize1 += GetSize(stType)
                ElseIf stType.Contains("DWORD") Then
                    myPlcTag.TagDataType = TagDataType.Dword
                    myPlcTag.ValueName = row("Name").ToString
                    lstPlcTag.Add(myPlcTag)
                    iSize1 += GetSize(stType)
                End If
                If tblConfig.Rows.IndexOf(row) < tblConfig.Rows.Count - 1 Then
                    Dim iSize2 = CInt(GetSize(rowSuccessor.Item("Type")).ToString.Trim)
                    If iSize1 + iSize2 > 222 Then
                        listPlcTagList.Add(lstPlcTag)
                        iSize1 = 0
                        lstPlcTag = New List(Of PLCTag) ' List of PLC tags (one for each PDU)
                    End If
                Else
                    listPlcTagList.Add(lstPlcTag)
                End If
    
                stLine = stLine & "," & row("Name")
            Next
            CreateTagListsFromDeviceConfig = listPlcTagList
        End Function
    Hier ist meine Funktion, die die Ausgangs-Variablen-Liste in mehrere Tag-Listen aufsplittet. Das Ergebnis ist eine List of List. Ganz interessant, nicht wahr?

    Jede dieser Tag-Lists wird dann einer Verbindung zugeordnet. Die Funktion, die die Verbindungs-Liste erzeugt kommt hier:

    Code:
    Private Function CreateConnectionListFromTagLists(stIPAddress As String, listPLCTagList As List(Of List(Of PLCTag))) As List(Of PLCConnection)
            Dim listConnection As New List(Of PLCConnection)
            Dim index As Integer = 0
            For Each listPLCTag As List(Of PLCTag) In listPLCTagList
                Dim myConn As New PLCConnection("Connection" & CStr(iDeviceIndex) & "_" & listPLCTagList.IndexOf(listPLCTag))
                myConn.Configuration.CpuIP = stIPAddress
                myConn.Configuration.CpuRack = 0
                myConn.Configuration.CpuSlot = 2
                myConn.Configuration.Port = 102
                myConn.Configuration.TimeoutIPConnect = 5000000
                myConn.Configuration.ConnectionType = LibNodaveConnectionTypes.ISO_over_TCP
                listConnection.Add(myConn)
                index += 1
            Next
            CreateConnectionListFromTagLists = listConnection
        End Function
    Dann werden im naechsten Schritt fuer jede Connection ein eigener Thread gestartet. Immer im Hinterkopf behalten, dass neben dem Main-Thread bereits fuer jede SPS ein eigener Thread gestartet wurde. Es handelt sich also bei diesen Connection-Threads um Sub-Threads des SPS-Threads. Sub-Sub-Threads wie in einem Baum. Ganz interessant nicht wahr?

    Jetzt muss ich nur noch aus den Ergebnis-Tag-List eine Gesasmt-Liste zusammenbasteln.

    Ein kleines Problem habe ich noch. Es geht darum, dass ich EIGENTLICH, die Daten aus EINER SPS immer in EINER Datei speichern wollte, mit EINEM Zeitstempel verstehen, welcher im vb.net Programm gebildet wird.

    Da ich haber unabhaengige Threads pro Connection habe, fallen Daten mit unterschiedlicen Zeitstempeln an, die ich nun schwierig in einer Datei unterbringen kann. Werde daher wohl im ersten Schritt pro Connection eine eigene Datei schreinen. Da es pro SPS bis zu vier Connections (bisher, koennen aber auch beliebig mehr sein), kommen dann bei 14 SPSen ziemlich viele Dateien dabei raus. Das hatte ich mir eigentlich anders vorgestellt.

    Wie ich die Threads allerdings syncronisiere weiss ich noch nicht und wenn ueberhaupt, dann muessen sie ja aufeinander warten und dann geht der Geschwindigkeitsvorteil wieder floeten.

    Wenn ich die App wieder auf Stand habe, stelle ich das komplette Projekt hier rein, damit Interessenten es nutzen koennen.
    Geändert von Burkhard (26.09.2015 um 15:01 Uhr)

  6. #16
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    So eine funktion wie du da geschrieben hast hab Ich ja auch drinn, wenn man die read funktion mit der optimierung nutzt! Diese ist noch etwas cleverer und fast dann variablen aus den selben bereichen zusammen, und berücksichtigt die request header größe, ob ein zusammenfassen günstiger ist! Jedoch liest diese dann alles über eine connection! Ich könnte mir überlegen diese funktion zu exportieren, oder das lesen über mehrere verbindungen direkt einzubauen.

    wie du threads synchronisieren würdest hab ich hier gepostet : Allgemein Toolbox Library Kuehner. also ich nutze keine threads sondern tasks! und falls dies nicht schneller ist, bringt die ganze parallele verarbeitung nichts, da dann die sps das nicht wirklich parallel macht!!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  7. #17
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Doch doch, die parallele Verarbeitung bringt sehr viel. Erstens jede SPS in einem eigenen Thread. Und dann jede Verbindung zur SPS nochmal in einem eigenen Thread, wobei man pro Verbindung nur eine PDU liest, bis die Anzahl maximal möglicher Verbindungen aufgebraucht ist... Das zu managen und zu überwachen ist ein bisschen extra Programmieraufwand, aber es lohnt sich, wenn man auf Geschwindigkeit optimieren muss.

  8. #18
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ja, nur nicht das dunur die zeit in dem thread misst, sondern wie lange die lesethreads brauchen wenn man sie synchronisiert! d.h. das wenn ich alle requests an die cpu schicke dauert es bis ich alle antworten habe x milisekunden!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

Ähnliche Themen

  1. DotNetSiemensPLCToolBoxLibrary -> nun mit Full-Manged TCP Connection
    Von Jochen Kühner im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 09.02.2015, 23:29
  2. Antworten: 0
    Letzter Beitrag: 22.03.2014, 15:48
  3. Drahtlose Datenübertragung mit KM6551
    Von hellrazz im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 14.01.2011, 14:50
  4. Datenübertragung mit t_send
    Von Papa_Bene im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 29.09.2010, 12:26
  5. Probleme mit DB und Datenübertragung
    Von tigger im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 26.04.2010, 12:57

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •