Step 7 Verbindung mit PC

Zuviel Werbung?
-> Hier kostenlos registrieren
Mit welcher Programmiersprache greifst Du denn auf die Steuerung zu?

Vom Prinzip musst Du über einen Zeiger auf den Empfangspuffer von vorne nach hinten durch den Puffer wandern und dir Deine Werte herauspicken.

Beispiel:

In den Puffer werden 5 Werte gelesen

1 DWORD
2 REAL
1 INT
1 BYTE

Dein Empfangspuffer enthält 15 Byte

Über Einen Zeiger auf den Start des Empfangspuffers kannst Du die ersten 4 Byte extrahieren (DWORD = 32 Bit = 4Byte), dann addierst Du zum Zeiger den Offset 4 und holst die nächsten 4 Byte (REAL = 32 Bit = 4Byte), dann wieder einen Offset von 4 zum Zeiger addieren, die nächsten 4 Byte auslesen, wieder 4 zum Zeiger, dann nur 2 Byte lesen (INT), dann nur 2 zum Zeiger addieren und das letzte einzelne Byte auslesen

Diese Prozedur findest Du in meinem obigen Beispiel in dem Abschnitt "Ausgabe-String zusammenstellen"

hier siehst Du die Zeigervariable *S7_Daten, die am Anfang ohne Offset und später als *S7_Daten + 2, *S7_Daten + 20 und *S7_Daten + 24 auftaucht. An dieser Stelle mache ich genau das oben beschriebene.

Wichtig zu beachten ist noch der Umstand, dass es sich bei der S7 um ein Big-Endian System handeld, während der PC ein Little-Endian System ist (siehe Wikipedia). Das heißt, das die Reihenfolge der Byte bei den einzelnen Werten vertauscht werden muss

Beispiel (DWORD oder REAL):

Big Endian Byte 1 - Byte 2 -Byte 3 -Byte 4 wird im Little-Endian Format zu Byte 4 - Byte 3 -Byte 2 -Byte 1

Wenn die Programmiersprache bekannt ist lassen sich genauere Aussagen über die Vorgehensweise machen, da jede Programmiersprache andere Befehle benötigt um das oben beschriebene umzusetzen.

Gruß, Andreas
 
Zuletzt bearbeitet:
Die unterschiedlichen Formate sind mir bekannt, hierfür muss ich noch eine Lösung gestalten.
Primär liegt mein Problem momentan darin, den Empfangspuffer auszuwerten.

Ich habe unten mal den VB.NET Code aus dem Beispiel etwas gekürzt und eingefügt. Im letzten Teil ist die Read-Funktion.
Wenn ich z.B. eine neue TextBox erstelle, mich mit der PLC verbinde und Daten aus einem DB in die TextBox schreiben will, so erhalte ich immer den Wert 0.

Bsp:
DB10.DBB2 Länge 1 Byte

TextBox1.Text = Client.DBRead(10, 2, 1, Buffer)


Code:
Imports System
Imports Snap7

Public Class MainForm
    Dim Buffer(65536) As Byte ' Buffer  
    Dim Client As Snap7.S7Client ' Client Object

    Private Sub ShowResult(ByVal Result As Integer)
        ' This function returns a textual explaination of the error code
        TextError.Text = Client.ErrorText(Result)
    End Sub

    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        Client = New S7Client
    End Sub

    Private Sub ConnectBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConnectBtn.Click
        Dim Result As Integer
        Dim Rack As Integer = System.Convert.ToInt32(TxtRack.Text)
        Dim Slot As Integer = System.Convert.ToInt32(TxtSlot.Text)
        Result = Client.ConnectTo(TxtIP.Text, Rack, Slot)
        ShowResult(Result)
    End Sub

    Private Sub DisconnectBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DisconnectBtn.Click
        Client.Disconnect()
    End Sub

    Private Sub ReadBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReadBtn.Click
        ' Declaration separated from the code for readability
        Dim DBNumber As Integer
        Dim Size As Integer
        Dim Result As Integer
        Dim c, y As Integer
        Dim s As String
        
        TxtDump.Text = ""
        DBNumber = System.Convert.ToInt32(TxtDB.Text)
        Size = System.Convert.ToInt32(TxtSize.Text)
        ' Read "Size" bytes from the DB "DBNumber" starting from 0 and puts them into Buffer.
        Result = Client.DBRead(DBNumber, 0, Size, Buffer)
        ShowResult(Result)
        ' If OK dumps the data (quick and dirty)
        If Result = 0 Then
            y = 0
            For c = 0 To Size - 1
                s = Hex$(Buffer(c))
                If s.Length = 1 Then
                    s = "0" + s
                End If
                TxtDump.Text = TxtDump.Text + "0x" + s + " "
                y = y + 1
                If y = 8 Then
                    y = 0
                    TxtDump.Text = TxtDump.Text + Chr(13) + Chr(10)
                End If
            Next
        End If
    End Sub
End Class
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kenne jetzt nicht diese Bibliothek und auch nicht die Methode darin ... ich würde aber behaupten, das der Aufruf "Client.DBRead(10, 2, 1, Buffer)" bedeutet, dass der DB10 ab Byte 2 mit Länge 1 Byte in das Byte-Array Buffer eingelesen wird - und zwar im Moment des Aufrufs.
Wenn du jetzt also das Byte anzeigen möchtest solltest du das in etwa so schreiben :
Code:
Client.DBRead(10, 2, 1, Buffer)
TextBox1.Text = Buffer(0).toString

Gruß
Larry

Nachsatz :
die "0" deines aktuellen Codes ist möglicherweise der Return-Code der Function DBRead, der Aufschluß darüber gibt, ob das prinzipiell funktioniert hat. Hier mußt du die Beschreibung der Function studieren, um zu wissen, ob die "0" heißt "Jawoll ... das hat schon mal geklappt" - meißt ist das so ...
 
Zuletzt bearbeitet:
Nachsatz :
die "0" deines aktuellen Codes ist möglicherweise der Return-Code der Function DBRead, der Aufschluß darüber gibt, ob das prinzipiell funktioniert hat. Hier mußt du die Beschreibung der Function studieren, um zu wissen, ob die "0" heißt "Jawoll ... das hat schon mal geklappt" - meißt ist das so ...

Da hat sich wohl der Fehlerteufel eingeschlichen ;-)
die Werte passen und ich gebe sie in verschiedene TextBoxen aus. Jetzt muss ich nur noch alles konvertieren.
Gibt es eine einfach Variante ein erhaltenes Byte binär darzustellen? Also von x.0 bis x.7?
 
Ich kann es gerade nicht nachschauen (ggf. später) ... aber schau dir mal die Wandlungsmöglichkeiten von ToString() an wenn du in der Klammer den entsprechenden Kenner übergibst.
Z.B. erzeugt toString("F2") einen Zahlenstring mit 2 Nachkommastellen. Dergleichen Parameter gibt es m.E. auch für die Binär-Darstellung (ggf. "X").

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst Dir eine Funktion bauen, der Du den Wert des Byte als Zahl (0 - 255) und die gewünschte Bitnummer übergibst.

In dieser Funktion musst du den Bytewert binär um die übergebene Bitnummer Stellen nach rechts schieben und das Ergebnis binär mit 1 Verknüpfen. Da kommt dann 1 oder 0 heraus.

Meine VB-Kenntnisse sind etwas eingerostet, ich probiere es aber mal Sinngemäß

Code:
Private Sub GetBit(ByVal ByteWert As Integer, ByVal BitNummer As Integer) Integer Ergebnis

    Ergebnis = ByteWert >> BitNummer & 1

End Sub

dann kannst Du die Funktion wie folgt aufrufen aufrufen:

Code:
Bit0 = GetBit(Deine_Byte_Variable, 0)
Bit1 = GetBit(Deine_Byte_Variable, 1)
Bit2 = GetBit(Deine_Byte_Variable, 2)

usw.

es würde sich anbieten das Ganze in einer For-Schleife von 0-7 zu realisieren
 
Ich hatte folgenden Code verwendet und tatsächlich ein binäres Ergebnis erhalten, allerdings stimmt es nicht immer mit dem Wert der SPS überein? Habe den String auch mal gedreht, wegen Little und Big Endian, aber ohne Erfolg. Manchmal stimmt der Wert, manchmal nicht.

44 = 00101100
22 = 01001100 - wäre in diesem Fall aber 76

Code:
BitString = Convert.ToString(Asc(Buffer(0)), 2).PadLeft(8, CChar("0"))

Die Variante mit dem For Befehl hatte ich auch, hatte ein paar Varianten aus dem Netz kombiniert, aber weiß gerade nicht so recht, wie ich die SPS-Bytes hier einbinden und einen String soll.

Code:
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim i As Integer
        Dim Test As Byte
        Dim Stelle(0 To 7) As Byte
 
        For i = 0 To 7
            If Test And 2 ^ i Then Stelle(i) = 1 Else Stelle(i) = 0
        Next
    End Sub
 
Ich weiß jetzt nicht wie das bei VB ist:
Code:
If Test And 2 ^ i Then Stelle(i) = 1 Else Stelle(i) = 0

ist dieses "And" eine binäre UND-Verknüpfung oder handelt es sich dabei vielleicht um eine logische UND-Verknüpfung (so ist es zumindest in meinem Basic-Dialekt)

Ich würde Dir die Variante mit der "Bitschieberei" (siehe oben) empfehlen, da diese Variante (OK, wahrscheinlich hier nicht ausschlaggebend ;)) um Dimensionen schneller ist als diese IF-Then Variante
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@TE:
Versuch es doch mal so :
Code:
    [COLOR=blue]Dim[/COLOR] a [COLOR=blue]As[/COLOR] [COLOR=blue]Integer[/COLOR] = 15
    [COLOR=blue]Dim[/COLOR] s [COLOR=blue]As[/COLOR] [COLOR=blue]String[/COLOR] = [COLOR=#2b91af]Convert[/COLOR].ToString(a, 2)

Es empfiehlt sich bei .Net immer zu schauen, ob .Net nicht schon etwas einigermassen Brauchbares "in petto" hat ...

Gruß
Larry
 
Na so geht es natürlich auch, habe die leeren Stellen dann noch mit 0en gefüllt und kam zu folgendem Code, der wunderbar funktioniert:
Jetzt muss ich nur noch den String auf seine 0en und 1en auswerten. Ich danke euch allen, die Spielerei geht jetzt erst richtig los :-D8)

Code:
        Dim bytetobit As Integer
        Dim bittostring As String

        Client.DBRead(10, 3, 1, Buffer)
        bytetobit = Buffer(0)
        bittostring = Convert.ToString(bytetobit, 2).PadLeft(8, CChar("0"))
        TextBox1.Text = bittostring

PS: ... und es ist immer wieder besser, wenn man vorher mal ein Flussdiagramm anlegt
 
Der Vollständigkeit halber hier noch meine Lösung mit For-Befehl, vielleicht braucht es ja irgendwann mal jemand:

Code:
Dim bytetobit As Integer
Dim i As Integer
Dim Stelle(0 To 7) As Byte
       Client.DBRead(10, 3, 1, Buffer)
       bytetobit = Buffer(0)
       TxtDump.Text = ""
       For i = 0 To 7
           If bytetobit And 2 ^ i Then Stelle(i) = 1 Else Stelle(i) = 0
           TxtDump.Text = TxtDump.Text & " " & CStr(i) & " = " & CStr(Stelle(i)) + Chr(13) + Chr(10)
       Next
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest, der besseren Verwendbarkeit wegen, das Ganze (also die Byte zu formatiertem Bitstring-Wandlung) noch als Function aufbauen, der du das jeweilige Byte übergibst und als Return den passend formatierten String erhältst.

Bei weiteren .Net-Fragen (bei mir vor Allem VB.Net) gerne wieder melden ...
 
Für die Wandlung in einen String kein Problem, aber die zeilenweise Ausgabe kriege ich momentan noch nicht hin, habe den For-Befehl noch nie mit der Return-Function kombiniert, aber da gibt es bestimmt auch was im WWW. Brauche ich aber momentan nicht. Aber danke für den Tipp mit der Function, das macht es wesentlich einfacher.

Code:
    Private Sub ReadBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReadBtn.Click
        Dim Ausgabewert As String = Byte2Bit(Client.DBRead(10, 3, 1, Buffer))
        TextBox1.Text = Ausgabewert
    End Sub
    Private Function Byte2Bit(ByVal bytetobit As Integer)
        Dim bittostring As String
        Dim Stelle(0 To 7) As Byte
        bytetobit = Buffer(0)
        bittostring = Convert.ToString(bytetobit, 2).PadLeft(8, CChar("0"))
        Return bittostring
    End Function
 
Hallo Zusammen
Das Thema ist zwar schon etwas her, aber ich hoffe ihr könnt mir helfen.

Ich habe mir jetzt viel mit Snap7, bzw Sharp7 beschäftigt. Mein Stand jetzt: Ein/Ausgänge lesen, DB's lesen schreiben ist kein Problem.

Zu meiner Frage. Gibt es eine Möglichkeit die Variablentabelle der S7 auszulesen?
D.h ich möchte den E1.1 auslesen und dabei dann wissen welchen Namen dieser in der Variablentabelle hat.

Vielen Dank für euche Hilfe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich gehe davon aus, dass Du die Symboltabelle meinst und nicht die Variablentabelle für Beobachten/Steuern.
Nur für mich zur Info: welche SPS und wie programmiert (mit STEP7 oder TIA Portal)?
Grundsätzlich geht das mit ACCON-AGLink mit dem Modul S7-SymbolikPro (STEP7) oder S7-SymbolikPro TIA (TIA Portal) bei einer Entwicklerlizenz oder der Einzellizenz bzw. Einzellizenz TIA. Demoversionen sind unter Download verfügbar.
Bei Fragen einfach melden.
 
Hallo
Vielen Dank für die schnelle Antwort.
Es geht um eine S7-1500,d.h TIA-Portal.
Gerne würde ich das nicht mit einem Tool machen welches ich kaufen muss sondern eher in Snap7 oder sonstiges in meinem schon geschriebenen Programm integrieren.

Vielen Dank
 
Zurück
Oben