Beckhoff BC9000 mit VB.net

paul1010

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe folgendes Problem... ich möchte mit vb.net diverse Ein-, Ausgänge sowie Merker im BC9000 lesen und schreiben.
Die Verbindung zum BC9000 ist siehe FormLoad:

Code:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            'Instanz der Klasse TcAdsClient erzeugen
            TCclient = New TcAdsClient
            'Verbindung mit Port 800 auf dem BC 9000
            TCclient.Connect("192.168.54.110.1.1", 800)
        Catch ex As Exception
            MessageBox.Show("Kein BC 9000 gefunden")
        End Try
        '## Try erkennt ob TwinCat läuft 
        Dim state As Object
        Try
            state = TCclient.ReadState.DeviceState()
            state = TCclient.ReadState.AdsState()
            state = TCclient.ClientCycle
        Catch ex As Exception
            MessageBox.Show("Kein BC 9000 gefunden")
            Demo = True
        End Try
    End Sub

Beim Auslesen kann ich nur Byteweise auslesen, hat jemand eine Idee wie ich auf einzelne Bits zugreifen kann?

Code:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ds As New AdsStream(1)
        Dim br As New IO.BinaryReader(ds)
        TCclient.Read(61472, 0, ds)
        ds.Position = 0
        TextBox1.Text = br.ReadBoolean().ToString()
    End Sub

Beim Schreiben das Gleich Problem ich habe einen Ausgang an und will einen anderen im gleichen Byte Bereich schreiben, dann wird immer alles überschrieben. Ist ja auch logisch, da ich das Byte vorher nicht bearbeite. Ich würde halt nur gerne direkt auf die Ausgänge auch Bitweise schreiben. Jemand dafür eine Idee?

Code:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim ds As New AdsStream(4)
        Dim bw As New IO.BinaryWriter(ds)
        ds.Position = 0
        bw.Write(1)
        TCclient.Write(16416, 10, ds)
    End Sub

Ich würde mich freuen wenn jamand eine Idee hat.

Mfg
Paul
 
Ich würde mich freuen wenn jamand eine Idee hat.

Mfg
Paul

Moin,

ich versuchs mal, mein letztes VB-Projekt ist allerdings schon ne weile her und meine ersten Geh-Versuche mit C# und Beckhoff sind 10 Tage und gingen ne halbe Stunde. Sprich ich bin gerade erst am Anfang.

Aber von der Programmierer-Seite her würde ich sagen ist die Sprache erst mal Wurst.

Beim Auslesen kann ich nur Byteweise auslesen, hat jemand eine Idee wie ich auf einzelne Bits zugreifen kann?

Nachdem du das ganze Byte ja schon in der Hand hast (in ner Variable) musst du dir nur noch die Info rauspicken die du haben willst.
Sagen wir du willst Bit 2 haben, dann würdest du das Byte-Ergebnis mit der Maske 0x04 (wir beginnen bei 0) verunden.
In C wäre das
Code:
my-bit = byte & 0x04
bzw. wo ich das so tippe, das würde dir nur (in C) die Info true oder false liefern, da in C alles größer 0 true ist.
Um genau 1 oder 0 zu bekommen müsstest wohl noch das entsprechende Bit so weit nach rechts schieben und dann ggf. weitere Bits ausmaskieren.
Nochmal in C:
Code:
my-bit = (byte >> 0x2) & 0x01

Beim Schreiben das Gleich Problem ich habe einen Ausgang an und will einen anderen im gleichen Byte Bereich schreiben, dann wird immer alles überschrieben. Ist ja auch logisch, da ich das Byte vorher nicht bearbeite. Ich würde halt nur gerne direkt auf die Ausgänge auch Bitweise schreiben. Jemand dafür eine Idee?

Gibts dir ja schon selbst die Antwort.
Zuerst musst du wissen wie das ganze Byte in der SPS aus schaut.
Danach kannst du das entsprechende Bit zusätzlich setzen oder löschen und dann den wert wieder zur SPS senden.

Hier lass ich mal das C Beispiel. VB ist ja doch etwas anders. Aber evtl. hilft der Ansatz zum suchen wie in VB Bit-Operationen erledigt werden.

Hoffe das Hilft die weiter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
http://infosys.beckhoff.de/index.ph...cModbusSrvCE/HTML/TcModbusSrv_Mapping.htm&id=

Unter diesem Link findet man die nötigen Codes der IndexGroup um Eingänge oder Ausgänge Bit oder Byteweise auszulesen. Habe gestern endlich die Lösung mit Hilfe diesem links gefunden.

Jedoch konnte ich beim schreiben ebenfalls nur in DINT Format schreiben, ein einzelnes Bit ohne die anderen zu Überschreiben, habe ich NOCH NICHT geschafft.

Im Beispiel könnten Tippfehler sein, da ich aus dem Kopf es getippt habe und nicht aus meinem Projekt kopiert.

Beispiel zum E0.2 auslesen und true oder False Ausgabe bzw. Entscheidung!:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ds As New AdsStream(1)
Dim br As New IO.BinaryReader()
TCclient.Read(61473, 0, ds)
ds.Position = 2

IF br.ReadBoolean=true THEN
TextBox1.Text = True
Else
TextBox1.Text = false
END_IF

End Sub
 
Zurück
Oben