Zugriff auf Twincat per ADS und Visual Basic 2008

Ralle

Super-Moderator , User des Jahres 2006-2007
Teammitglied
Beiträge
15.404
Reaktionspunkte
4.039
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider funktioniert ja im Moment die Forensuche nicht (zumindest bei mit), daher stelle ich mal die Frage.

Ich habe 2 VM eine beherbergt ein Twincat, die zweite ein Visual Studio.
Nun würde ich gerne mit einem Beispiel von Beckhoff Daten aus der Sps auslesen.
Beide VM sind im Netz, haben IP-Adressen und können sich gegenseitig anpingen.

Das Programm in Vb ist sehr übersichtlich:

Code:
[COLOR=#1b39f5]Imports[/COLOR] TwinCAT.Ads
[COLOR=#1b39f5]Imports[/COLOR] System.IO


[COLOR=#1b39f5]PublicClass[COLOR=#000000] Form1[/COLOR][/COLOR]
    [COLOR=#1b39f5]Private[/COLOR] tcADS [COLOR=#1b39f5]As[/COLOR] TcAdsClient


    [COLOR=#1b39f5]Private[/COLOR] [COLOR=#1b39f5]Sub[/COLOR] Button1_Click([COLOR=#1b39f5]ByVal[/COLOR] sender [COLOR=#1b39f5]As[/COLOR] System.Object, [COLOR=#1b39f5]ByVal[/COLOR] e [COLOR=#1b39f5]As[/COLOR] System.EventArgs) [COLOR=#1b39f5]Handles[/COLOR] Button1.Click
        tcADS = [COLOR=#1b39f5]New[/COLOR] TcAdsClient
        tcADS.Connect([COLOR=#bb2120]"192.168.101.68.1.1"[/COLOR], 801)
[COLOR=#1b39f5]EndSub[/COLOR]
[COLOR=#1b39f5]
[/COLOR]
    [COLOR=#1b39f5]Private[/COLOR] [COLOR=#1b39f5]Sub[/COLOR] Button2_Click([COLOR=#1b39f5]ByVal[/COLOR] sender [COLOR=#1b39f5]As[/COLOR] System.Object, [COLOR=#1b39f5]ByVal[/COLOR] e [COLOR=#1b39f5]As[/COLOR] System.EventArgs) [COLOR=#1b39f5]Handles[/COLOR] Button2.Click
        tcADS.Dispose()
[COLOR=#1b39f5]EndSub[/COLOR]
[COLOR=#1b39f5]
[/COLOR]
    [COLOR=#1b39f5]Private[/COLOR] [COLOR=#1b39f5]Sub[/COLOR] Button3_Click([COLOR=#1b39f5]ByVal[/COLOR] sender [COLOR=#1b39f5]As[/COLOR] System.Object, [COLOR=#1b39f5]ByVal[/COLOR] e [COLOR=#1b39f5]As[/COLOR] System.EventArgs) [COLOR=#1b39f5]Handles[/COLOR] Button3.Click
[COLOR=#008f2a]'creates a stream with a length od 4 byte[/COLOR]
        [COLOR=#1b39f5]Dim[/COLOR] ds = [COLOR=#1b39f5]New[/COLOR] AdsStream(4)
        [COLOR=#1b39f5]Dim[/COLOR] br = [COLOR=#1b39f5]New[/COLOR] BinaryReader(ds)


[COLOR=#008f2a]'reads a DINT from PLC[/COLOR]
        tcADS.Read(&H4020, 0, ds)
        ds.Position = 0
        TextBox1.Text = br.ReadInt32().ToString
[COLOR=#1b39f5]EndSub[/COLOR]
[COLOR=#1b39f5]
[/COLOR]
    [COLOR=#1b39f5]Private[/COLOR] [COLOR=#1b39f5]Sub[/COLOR] Button4_Click([COLOR=#1b39f5]ByVal[/COLOR] sender [COLOR=#1b39f5]As[/COLOR] System.Object, [COLOR=#1b39f5]ByVal[/COLOR] e [COLOR=#1b39f5]As[/COLOR] System.EventArgs) [COLOR=#1b39f5]Handles[/COLOR] Button4.Click
[COLOR=#008f2a]'creates a stream with a length od 4 byte[/COLOR]
        [COLOR=#1b39f5]Dim[/COLOR] ds = [COLOR=#1b39f5]New[/COLOR] AdsStream(4)
        [COLOR=#1b39f5]Dim[/COLOR] bw = [COLOR=#1b39f5]New[/COLOR] BinaryWriter(ds)


        ds.Position = 0
        bw.Write([COLOR=#1b39f5]New[/COLOR] [COLOR=#1b39f5]Integer[/COLOR] = 100)


[COLOR=#008f2a]'writes DINT to PLC[/COLOR]
        tcADS.Write(&H4020, 0, ds)
[COLOR=#1b39f5]EndSub[/COLOR]
[COLOR=#1b39f5]EndClass[/COLOR]

Das zugehörige Programm in Twincat ist noch einfacher:

Code:
PROGRAM Main
VAR
    ADSTest     AT%MD0 : INT;
END_VAR

ADSTest := ADSTest + 1;

Die Variable wird hochgezählt, die SPS läuft also korrekt.

Ich kann mit VB eine Verbindung herstellen, tcADS bringt intern "isConnectet := True", allerdings macht sie das auch, wenn ich dei Netzwerkverbindung der Twincat-Vm deaktiviere, das macht mich schon mal stutzig.
Wenn ich dann ein tcADS.Read ausführe, bekomme ich ein Timeout, in jedem Fall, also mit oder ohne Verbindung.

Ich habe auf der Visual Studio-VM die ADS-Connection-Library von Beckhoff installiert, muß ich auf der Twincat-VM auch noch etwas einrichten?
 
Update: Die erstelle VB-Exe funktioniert zumindest lokal auf der Beckhoff-VM.

Update: Lokal funktioniert Read, Write schreibt immer 0, nicht 100 ??? --> funktioniert jetzt, über Codeänderung

Code:
[COLOR=#1b39f5][COLOR=#1b39f5]Dim[COLOR=#000000] Wert = [/COLOR]New[COLOR=#000000] [/COLOR]Integer[/COLOR]
[COLOR=#1b39f5]
[/COLOR]
        ds.Position = 0
        Wert = 100
        bw.Write(Wert)
[/COLOR]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst den Status von TwinCat abfragen und das ist auch notwendig. Du kannst nämlich eine Verbindung aufbauen, selbst, wenn TwinCat nicht im Run-Status ist, bekommst dann aber einen Timeout beim Lesen oder Schreiben.

Gibt es einen Lese- oder Schreib-Timeout, solltest du per Exception-Handling versuchen, alle Verbindungen wieder abzuwickeln, da ansonsten sich sowohl im Client, als auch in Twincat Ressourcen blockiert werden, was sich in einer höheren CPU-Auslastung äussert, die nur durch Reboot zu beseitigen ist. Das war der Grund, warum ich alle Kopplungen zu Variablen in einer Liste verwaltet hatte, so dass ich bei einem Timeout, die Verbindung automatisiert erst ab- und dann wieder aufbauen konnte. Ich hatte mal hier dazu Code gepostet, dazu bedarf es aber der Suchfunktion :rolleyes:
 
@drfunfrock
Danke, für die Rückmeldung, aber im Moment gelingt es überhaupt nur lokal per VB2008 und ADS auf die SPS zuzugreifen.
Geht es denn überhaupt über das Netzwerk und wenn ja, muß man dafür extra etwas einrichten?
Ich soll später eine zweite Beckoff-SPS ankoppeln und dann per ADS Daten austauschen, geht das dann auch nicht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Nordpol

Yep, so ist es, das hatte ich mit fast schon gedacht. Sowohl im Twincat, als auch auf dem PC mit dem VB2008-Programm muß die Route eingetragen werden. Dazu muß in einem Verzeichnis, das mit der ADS-Connection-Library erstellt wird (bei mir C:\Programme\Beckhoff\TwinCAT ADS Communication Library\ADS Api\TcAdsDll) die Datei TcAmsRemoteMgr.exe aufgerufen werden.
 
Schick mir mal eine PM und du kannst etwas VB-Code bekommen willst, der GUI und Logik trennt, für eigenen Code. Weil meiner ist auf Polling basierend, gibt aber eine Idee. Das Forum macht bei 10000 Zeichen schluss. Ich hab jetzt keine Lust, das zu trennen.
 
Zuletzt bearbeitet:
Hallo, ich schreibe gerade eine C++ Anwendung die von einem PC aus übers Internet Variabelen aus einen BC9000 / BX9000 auslesen soll.
Für Testzwecke habe ich alles in meinem Lokalen Netzwerk getestet. Funktioniert soweit super.
Doch leider habe ich Problem ein Verbindung übers Internet einzurichten. Habt ihr da Erfahrung ?
Habe mir bei Dyndns einen Eintrag gemacht den habe ich in meiner FritzBox eingerichtet und ein Portforwarding auf die TwinCat Kommunikation Ports gemacht. (BF01,BF02,BF03)

Ich habe ein Problem mit dem Einrichten der Routen und was ich als AMSNetID in meinem Tool angeben muss.

Vielen Dank für jeden Beitrag
 
Zurück
Oben