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

Seite 1 von 8 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 73

Thema: Verwendung DotNetSiemensPLCToolBoxLibrary von Jochen Kühner

  1. #1
    Registriert seit
    29.10.2010
    Beiträge
    28
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute

    Zur Verwendung der „DotNetSiemensPLCToolBoxLibrary“von J. Kühne habe ich mindestens zwei Fragen.
    Ich verwende Visualstudio 2010 und arbeite mit Visualbasic.

    Frage 1
    Ich möchte eine vorgegeben Byteanzahl aus der SPS in ein Bytearray einlesen um die eingelesenen Daten anschließend in verschiedene Datenformate zu konvertieren.
    Die Sub-Routine „Test()“ soll die Aufgabe realisieren.
    Allerdings funktioniert sie nicht. Beim Lesen der Bytes aus der SPS in das Bytearray tritt ein Fehler auf.
    Was stimmt in dem Code nicht ?


    Sub Test()
    'Dieses Testmodul soll 6 Merkbytes ab Merkerbyte 500 in ein Bytearray lesen

    'Die Verbindung zur SPS funktioniert und wurde mit dem Aufruf des Konfigurationsmenü eingestellt und getestet
    'So wurde die Verbindung aktiviert:
    'Konfigurationsmenü Verbindung 1
    'Configuration.ShowConfiguration("SPS1", True)
    'PLCCon1.Configuration.ConnectionName = "SPS1"
    'Mit "PLCCon1.Connect()"

    Dim aVar As New PLCTag
    Dim Bytearray(100) As Byte
    Dim S8 As Byte
    Dim S16 As Short
    Dim S32 As Integer
    Dim Real As Single

    aVar.ByteAddress = 500
    aVar.BitAddress = 0
    aVar.DatablockNumber = 200

    aVar.LibNoDaveDataSource = TagDataSource.Flags
    aVar.LibNoDaveDataType = TagDataType.ByteArray
    aVar.ArraySize = 6
    MsgBox("Init ok")

    PLCCon1.ReadValuesFromByteArray(aVar, Bytearray, 0)
    MsgBox("Read ok")

    S8 = libnodave.getS8from(Bytearray, 0)
    S16 = libnodave.getS16from(Bytearray, 0)
    S32 = libnodave.getS32from(Bytearray, 0)
    Real = libnodave.getFloatfrom(Bytearray, 0)

    MsgBox("S8=" & S8 & " S16=" & S16 & " S32=" & S32 & " Real=" & Real)

    aVar = Nothing
    End Sub


    Frage 2

    Um ein Byte in die SPS zu schreiben, verwende ich folgenden Programmteil.
    Dieser Programmteil funktioniert. – die Textbox „Me.txt_Wert1“ enthält z.B. „23“ – die 23 wird zur SPS übertragen.
    Das Array Adr ist ein String-Array.
    - Adr(0) enthält die Zeichenkette “500”, die Adr(1) enthält die Zeichenkette “0”.
    - DBNr ist ein String und enthält „200“.
    - Die Variable „Bereich“ = „Merker“
    - Der String „VarTyp“ = Byte“

    If VarTyp = "Byte" Then
    Dim Var As New Communication.PLCTag

    Var.ByteAddress = CInt(Adr(0))
    Var.BitAddress = CInt(Adr(1))
    Var.DatablockNumber = CInt(DBNr)
    Var.LibNoDaveDataType = TagDataType.Byte
    If Bereich = "Daten" Then Var.LibNoDaveDataSource = TagDataSource.Datablock
    If Bereich = "Eingänge" Then Var.LibNoDaveDataSource = TagDataSource.Inputs
    If Bereich = "Ausgänge" Then Var.LibNoDaveDataSource = TagDataSource.Outputs
    If Bereich = "Merker" Then Var.LibNoDaveDataSource = TagDataSource.Flags

    Value = Me.txt_Wert1.Text
    Var.ParseControlValueFromString(Value)
    PLCCon1.WriteValue(Var)
    'Me.txt_Wert1.Text = Var.Value
    Var = Nothing
    End If

    Nun meine Frage :

    Wie muss der Programmteil aussehen, wenn ein REAL-Wert zur SPS übertragen werden soll.
    Der folgende Programmteil funktioniert nicht – er überträgt immer eine 0.0.
    Welcher Wert muss in der Textbox stehen „Me.txt_Wert1.Text“– damit die Übertragung einer REAL-Variablen in die SPS erfolgreich ist?
    Das Array Adr ist ein String-Array.
    - Adr(0) enthält die Zeichenkette “500”, die Adr(1) enthält die Zeichenkette “0”.
    - DBNr ist ein String und enthält „200“.
    - Die Variable „Bereich“ = „Merker“
    - Der String „VarTyp“ = REAL“

    If VarTyp = "REAL" Then
    Dim Var As New Communication.PLCTag

    Var.ByteAddress = CInt(Adr(0))
    Var.BitAddress = CInt(Adr(1))
    Var.DatablockNumber = CInt(DBNr)
    Var.LibNoDaveDataType = TagDataType.Float
    If Bereich = "Daten" Then Var.LibNoDaveDataSource = TagDataSource.Datablock
    If Bereich = "Eingänge" Then Var.LibNoDaveDataSource = TagDataSource.Inputs
    If Bereich = "Ausgänge" Then Var.LibNoDaveDataSource = TagDataSource.Outputs
    If Bereich = "Merker" Then Var.LibNoDaveDataSource = TagDataSource.Flags

    Value = Me.txt_Wert1.Text
    Var.ParseControlValueFromString(Value)
    PLCCon1.WriteValue(Var)
    Me.txt_Wert1.Text = Var.Value
    Var = Nothing
    End If


    Zitieren Zitieren Verwendung DotNetSiemensPLCToolBoxLibrary von Jochen Kühner  

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

    Standard

    Hallo erst mal.

    Das lesen funzt nicht da du die Funktion ReadValuesFromByteArray(aVar, Bytearray, 0) verwendest. Diese Funktion ist dazu da um den Tag mit Werten aus einem ByteArray zu befüllen das du z.B. per TCP direkt auf den PC schickst.

    du kannst den Tag einfach mit
    PLCCon1.ReadValue(aVar)
    einlesen.

    Da du aber Verschiedene Variablen willst, würde Ich das ganz anderst angehen.

    Du legst dir eine Liste mit verschiedenen PLCTags an, und liest diese mit PLCCon1.ReadValues ein.

    An meiner lib soll ja der Vorteil sein, das du dieses zerlegen eines ByteStreams in die einzelnen Variablen nicht mehr machen musst!

    Beispielcode:

    Code:
     Dim Tags As New List(Of PLCTag)
    
            Dim val1 As New Communication.PLCTag("MB500")
            val1.LibNoDaveDataType = TagDataType.Byte
            Tags.Add(val1)
    
            Dim val2 As New Communication.PLCTag("MW501")
            val1.LibNoDaveDataType = TagDataType.Int
            Tags.Add(val2)
    
            Dim val3 As New Communication.PLCTag("MD503")
            val1.LibNoDaveDataType = TagDataType.Dint
            Tags.Add(val3)
    
            Dim val1 As New Communication.PLCTag("MD507")
            val1.LibNoDaveDataType = TagDataType.Float
            Tags.Add(val4)
            PLCCon1.ReadValues(Tags)
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  3. #3
    hanjo ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.10.2010
    Beiträge
    28
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Vielen Dank für die Anwort - ich werde es morgen in beiden Varianten testen

    Viele Güße hanjo
    Zitieren Zitieren Danke für die Anwort  

  4. #4
    hanjo ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.10.2010
    Beiträge
    28
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Wie gesagt - den ersten Teil werde ich testen.

    Die zweite Frage würde ich gern noch mal wiederholen - dabei ging es um das Schreiben eines Real-Wertes.

    Frage 2

    Um ein Byte in die SPS zu schreiben, verwende ich folgenden Programmteil.

    Dieser Programmteil funktioniert. – die Textbox „Me.txt_Wert1“ enthält z.B. „23“ – die 23 wird zur SPS übertragen.
    Das Array Adr ist ein String-Array.
    - Adr(0) enthält die Zeichenkette “500”, die Adr(1) enthält die Zeichenkette “0”.
    - DBNr ist ein String und enthält „200“.
    - Die Variable „Bereich“ = „Merker“
    - Der String „VarTyp“ = Byte“

    If VarTyp = "Byte" Then
    Dim Var As New Communication.PLCTag

    Var.ByteAddress = CInt(Adr(0))
    Var.BitAddress = CInt(Adr(1))
    Var.DatablockNumber = CInt(DBNr)
    Var.LibNoDaveDataType = TagDataType.Byte
    If Bereich = "Daten" Then Var.LibNoDaveDataSource = TagDataSource.Datablock
    If Bereich = "Eingänge" Then Var.LibNoDaveDataSource = TagDataSource.Inputs
    If Bereich = "Ausgänge" Then Var.LibNoDaveDataSource = TagDataSource.Outputs
    If Bereich = "Merker" Then Var.LibNoDaveDataSource = TagDataSource.Flags

    Value = Me.txt_Wert1.Text
    Var.ParseControlValueFromString(Value)
    PLCCon1.WriteValue(Var)
    'Me.txt_Wert1.Text = Var.Value
    Var = Nothing
    End If

    Nun meine Frage :

    Wie muss der Programmteil aussehen, wenn ein REAL-Wert zur SPS übertragen werden soll.
    Der folgende Programmteil funktioniert nicht – er überträgt immer eine 0.0.
    Welcher Wert muss in der Textbox stehen „Me.txt_Wert1.Text“– damit die Übertragung einer REAL-Variablen in die SPS erfolgreich ist?
    Das Array Adr ist ein String-Array.
    - Adr(0) enthält die Zeichenkette “500”, die Adr(1) enthält die Zeichenkette “0”.
    - DBNr ist ein String und enthält „200“.
    - Die Variable „Bereich“ = „Merker“
    - Der String „VarTyp“ = REAL“

    If VarTyp = "REAL" Then
    Dim Var As New Communication.PLCTag

    Var.ByteAddress = CInt(Adr(0))
    Var.BitAddress = CInt(Adr(1))
    Var.DatablockNumber = CInt(DBNr)
    Var.LibNoDaveDataType = TagDataType.Float
    If Bereich = "Daten" Then Var.LibNoDaveDataSource = TagDataSource.Datablock
    If Bereich = "Eingänge" Then Var.LibNoDaveDataSource = TagDataSource.Inputs
    If Bereich = "Ausgänge" Then Var.LibNoDaveDataSource = TagDataSource.Outputs
    If Bereich = "Merker" Then Var.LibNoDaveDataSource = TagDataSource.Flags

    Value = Me.txt_Wert1.Text
    Var.ParseControlValueFromString(Value)
    PLCCon1.WriteValue(Var)
    Me.txt_Wert1.Text = Var.Value
    Var = Nothing
    End If
    Zitieren Zitieren Zur 2. Frage  

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

    Standard

    Sollte nun auch gehen.

    War noch ein Fehler in meiner Lib.
    Hatte bei der Funktion ParseControlvalueFromString Float vergessen!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  6. #6
    hanjo ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.10.2010
    Beiträge
    28
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hab mir die geänderte Bibliothek heruntergeladen und versuch es mit dem Schreiben des Float-Wertes morgen an der SPS.

    Vielen Dank !
    Zitieren Zitieren Herzlichen Dank  

  7. #7
    hanjo ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.10.2010
    Beiträge
    28
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Punkt 1 - Wie versprochen habe ich heute das Lesen und Schreiben von einzelnen Variablen in verschiedenen Formaten getestet.
    SPS : S7-400 CPU417-3
    CP : TCP-Verbindung

    Das Ergebnis ist in der Übersicht Bild "Ergebnis" im Anhang enthalten
    Bei den rot markierten Positionen traten Fehler beim Lesen bzw. Schreiben auf.

    Punkt 2 – Wie von Jochen vorgeschlagen habe ich verschiedene Variablen in einer Liste des Typs PLCTag zusammengefasst und aus der SPS gelesen bzw. geschrieben.
    Leider hat weder das Lesen noch das Schreiben der Liste funktioniert.
    Hier auszugsweise der Code:
    Die Routine „Sub InitListe“ füllt die Variablenliste „TagList“ mit PLCTag Variablen
    Sub InitListe(ByRef TagList As List(Of PLCTag))
    'Tags entspricht einer Liste von PLCTags
    'Tags = Nothing

    Dim val1 As New PLCTag
    'BOOL-Variable M500.0
    val1.LibNoDaveDataSource = TagDataSource.Flags
    val1.LibNoDaveDataType = TagDataType.Bool
    val1.DatablockNumber = 200
    val1.ByteAddress = 500
    val1.BitAddress = 0
    TagList.Add(val1)
    val1 = Nothing


    '====================================================
    'Bytevariable MB501
    Dim val2 As New PLCTag
    val2.LibNoDaveDataSource = TagDataSource.Flags
    val2.LibNoDaveDataType = TagDataType.Byte
    val2.ByteAddress = 501
    val2.BitAddress = 0
    val2.DatablockNumber = 200
    val2.ArraySize = 1
    TagList.Add(val2)
    val2 = Nothing

    'S-Bytevariable MB502
    Dim val3 As New PLCTag
    val3.LibNoDaveDataSource = TagDataSource.Flags
    val3.LibNoDaveDataType = TagDataType.SByte
    val3.ByteAddress = 502
    val3.BitAddress = 0
    TagList.Add(val3)
    val3 = Nothing

    'BCD-Bytevariable MB503
    Dim val4 As New PLCTag
    val4.LibNoDaveDataSource = TagDataSource.Flags
    val4.LibNoDaveDataType = TagDataType.BCDByte
    val4.ByteAddress = 503
    val4.BitAddress = 0
    TagList.Add(val4)
    val4 = Nothing

    End Sub

    Die Routine zum lesen der Daten aus der SPS lautet „ListeLesen“ – sie soll die Variablenwerte aus der SPS laden und in ein DatagridView eintragen.
    Sub ListeLesen()
    If Con1_Verbunden = True Then
    Dim Tags As New List(Of PLCTag)
    'Liste der PLC-Variablen initialisieren
    Call InitListe(Tags)
    '====================================================
    PLCCon1.ReadValues(Tags)
    '====================================================
    Dim N As Integer
    Dim T(Tags.Count + 1) As String
    For N = 0 To Tags.Count - 1
    Me.dgv_Liste.Rows(N).Cells(0).Value = Trim(Str(N))
    Me.dgv_Liste.Rows(N).Cells(1).Value = Tags(N).S7FormatAddress
    Me.dgv_Liste.Rows(N).Cells(2).Value = Tags(N).LibNoDaveDataType.ToString
    Me.dgv_Liste.Rows(N).Cells(3).Value = Tags(N).Value
    Next
    Tags = Nothing
    Else
    MsgBox("Erst Verbindung herstellen !", MsgBoxStyle.Information, "Hinweis !")
    End If

    End Sub

    Das Ergebnis des zeigt im Anhang enthaltene Bild "Liste lesen".
    Es ist zu erkennen, das die Variableneigenschaften richtig angezeigt, aber die Werte nicht aus der SPS geladen wurden.

    Die Routine zum Schreiben der Variablen in die SPS lautet „ListeSchreiben“
    Leider funktioniert auch diese Routine nicht.


    Sub ListeSchreiben()
    If Con1_Verbunden = True Then
    MsgBox("Start Liste einlesen !")
    Dim Tags As New List(Of PLCTag)
    'Liste der PLC-Variablen initialisieren
    Call InitListe(Tags)
    MsgBox("Liste initialisiert !")
    Dim N As Integer
    Dim T(20) As String
    Dim Value As String

    For N = 0 To 3
    N = Val(Me.dgv_Liste.Rows(N).Cells(0).Value)
    Value = Me.dgv_Liste.Rows(N).Cells(3).Value
    Tags(N).ParseControlValueFromString(Value)
    Next
    MsgBox("Parsen abgeschlossen !")
    '====================================================
    PLCCon1.WriteValues(Tags)
    MsgBox("Schreiben beendet !")
    Tags = Nothing
    Else
    MsgBox("Erst Verbindung herstellen !", MsgBoxStyle.Information, "Hinweis !")
    End If
    End Sub

    Was mache ich hier falsch ?
    Ich bin dankbar für Hilfe - hanjo
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren Nach dem versprochenem Test  

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

    Standard

    Mhmm...

    Kannst mir mal deinen Quellcode zuschicken? Normal sollte das lesen gehen, so wie du es gemacht hast, mir ist beim Überfliegen jetzt kein Fehler aufgefallen.

    Danke auch für das Prüfen der verschiedenen Formate, Ich werd mich gleich ans BugFixing machen...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Quellcode...  

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

    Standard

    So hab mal ein paar Bugfixes gemacht...

    - SByte -> geht nun.
    - BCDWord -> geht, Frage mich nur ob man bei den BCD Typen ein vorzeichen unterstützen muss. Wenn, dann muss Ich das noch einbauen!
    - BCDDWord -> geht nun.
    - TIME -> Nur negative Werte gingen nicht, gehen nun!
    - TIMEOFDAY -> Hab die Miliseconds Property statts der TotalMillisecondes verwendet... gefixt!
    -----

    -S5Time -> Geht bei mir, welchen Wert willst du den lesen oder schreiben? Hab da keinen Fehler gefunden
    - DateTime -> Die Milisekunden werden mitgelesen, doch die ToString methode eines DateTime datentyps zeigt die MS nicht mit an !
    - String: Ja man muss zuerst die Länge angeben! Sonst müsste Ich aber auch vor jedem schreiben Zwingend ein Lesen starten. Ist ja z.B. in Flexible auch so, das man die Länge angeben muss!

    Nochwas:
    So wie mirs scheint willst du dir ja sowas wie ne Variablentabelle bauen. Dann schau dir mal noch die Funktion SelectProjectPart.SelectTAG an, dann kannst du die PLCTags aus einem Step7 Projekt auswählen!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Bugfixes...  

  10. #10
    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
    Über "SelectProjectPart.SelectVAT" kannst du dir auch die VATs eines Step7 Projektes importieren.
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Nochwas...  

Ähnliche Themen

  1. DotNetSiemensPLCToolBoxLibrary
    Von explosiv im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 14.06.2011, 00:13
  2. [Geburtstagsthread] Jochen Kühner
    Von rostiger Nagel im Forum Stammtisch
    Antworten: 17
    Letzter Beitrag: 09.05.2011, 22:16
  3. Zugang zu Step7 Daten Projekt Jochen Kühner
    Von hanjo im Forum Hochsprachen - OPC
    Antworten: 1
    Letzter Beitrag: 07.04.2011, 23:18
  4. DotNetSiemensPLCToolBoxLibrary 64 Bit support.
    Von Jochen Kühner im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 24.03.2011, 13:04
  5. Jochen Kühner hat Geburtstag
    Von Rainer Hönle im Forum Stammtisch
    Antworten: 7
    Letzter Beitrag: 12.05.2010, 22:51

Lesezeichen

Berechtigungen

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